PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Java] Problem mit Base64-Codierung eines PDFs


P2oldi
2008-05-08, 16:51:32
Tag zusammen,

ich sitze hier grade über einem Problem, wo mir selbst das allwissende Googel nicht so recht weiterhelfen mag...oder ich frag einfach falsch :)

Problem:
Ich habe ein PDF-File (2 Seiten, die jeweils ein großes eingescanntes Bilde enthalten). Dieses PDF muß ich in ein XML-File eingebettet verschicken.
Für diesen Zweck schien mir eine Base64-Codierung angebracht, damit das auch korrekt an der Empfangsstelle eintrifft.
Das funktioniert soweit auch ganz gut, das PDF kommt an und ich kann es decodieren / abspeichern, aber es ist einfach nur ein 2-seitiges, leeres PDF, d.h. die Bilder sind weg :( Und ohne Bilder nützt mir das PDF natürlich auch nix mehr.

Hab dann zur Kontrolle in einer Methode das PDF eingelesen, nach Base64 codiert, sofort wieder decodiert und das Ergebnis in ein File ausgegeben. Siehe da, auch hier sind die Bilder verschwunden. Das Ergebnis hat aufs Byte genau die gleiche Größe, läßt sich wunderbar öffnen...bis auf die Bilder also alles schick.

Das bringt mich zu der Vermutung, daß ich irgendwas mit der Base64-Codierung versemmelt habe, bzw. die buggy ist.

hier mal die Methode, mit der ich getestet habe:
public static void main(String[] args) {
// TODO Auto-generated method stub

try {
//Input lesen
File datei = new File("c:\\temp\\input.pdf");
FileReader fr = new FileReader(datei);
String inhaltstring = new String();
char[] temp = new char[(int)datei.length()];
int chr = fr.read(temp, 0, (int)datei.length());
inhaltstring = String.copyValueOf(temp);

//Konvertierung Input in Base64
String anhangb64 = Base64.byteArrayToBase64(inhaltstring.getBytes());

//Base64 decodieren
byte[] zielinhalt = Base64.base64ToByteArray(anhangb64);

//Output schreiben
FileOutputStream fos = new FileOutputStream(new File("c:\\temp\\output.pdf"));
fos.write(zielinhalt);


} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

die zur Codierung genutzte Base64 liegt in java.util.prefs.Base64.

Falls jemand dazu ne Idee, oder sogar noch besser ne Lösung hat wäre ich sehr dankbar,

viele Grüße

c.p.d.
2008-05-08, 22:50:41
Der Ansatz mit Base64 ist in Ordnung.

Ich denke das Einlesen ist etwas abenteuerlich gelöst.
Der FileReader operiert schon auf Character Ebene. Du musst aber das pdf byte Array nicht interpretieren sonder nur 1 zu 1 wieder ausgeben.
Also ist ein simpler InputStream die richtige Wahl.

Java 1.6:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import org.eclipse.emf.ecore.xml.type.internal.DataValue.Base64;

public class Gugus {
public static void main(String[] args) {
// TODO Auto-generated method stub

try {
// Input lesen
File datei= new File("c:\\temp\\input.pdf");
byte[] data= new byte[(int)datei.length()];
FileInputStream fis= new FileInputStream(datei);
fis.read(data);
fis.close();

// Konvertierung Input in Base64
String anhangb64 = Base64.encode(data);

// Base64 decodieren
byte[] zielinhalt = Base64.decode(anhangb64);

// Output schreiben
FileOutputStream fos = new FileOutputStream(new File("c:\\temp\\output.pdf"));
fos.write(zielinhalt);
fos.close();


} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

P2oldi
2008-05-09, 13:22:49
super, das wars tatsächlich, mit dem FileInputStream klappts :D

Vielen Dank!