Zum Inhalt springen

Problem mit Base64-Kodierung udn PDFs


P2oldi

Empfohlene Beiträge

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 Bild 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

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich wollte den Code so mal testen.

Allerdings lässt der sich bei mir gar nicht ausführen.


java.lang.Error: Unresolved compilation problems: 

	The type Base64 is not visible

	The type Base64 is not visible

Abscheinend ist die Base64 Implementierung im java.util.prefs nicht freigegeben

Link zu diesem Kommentar
Auf anderen Seiten teilen

So hab mal ein bisschen experimentiert und damit hat es funktioniert


import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

.......

//Input lesen
File datei = new File("c:\\temp\\input.pdf");
FileInputStream fis = new FileInputStream(datei);

byte[] temp = new byte[(int)datei.length()];
fis.read(temp,0,(int)datei.length());
//Konvertierung Input in Base64
String anhangb64 = new BASE64Encoder().encode(temp);
//Base64 decodieren
byte[] zielinhalt = new BASE64Decoder().decodeBuffer( anhangb64 );
//Output schreiben
FileOutputStream fos = new FileOutputStream(new File("c:\\temp\\output.pdf"));
fos.write(zielinhalt);

...

[/PHP]

Link zu diesem Kommentar
Auf anderen Seiten teilen

Servus,

um es vielleicht für andere noch klarer zu sagen: Du hast nicht den falschen Reader verwendet, dass Du einen Reader verwendet hast, war falsch. :)

Ein Reader (für Writer gilt das selbe) ist für zeichenartige Datenstrukturen geeignet (Text), die Streams sind für Binärdaten gedacht. Ein Reader versucht immer, einen Input in Zeichen umzuwandeln. Und das ist in der Regel nicht gewollt.

Zu meiner Schande muss ich gestehen, dass ich gar nicht geblickt hab, dass Du einen Reader verwendet hast. :) Da hatte der Nadelkopf wohl nadelscharfe Augen.

Schöne Grüße,

Peter

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...