PDF Datei einlesen und wieder auf Festplatte schreiben

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
GilbertDur
Beiträge: 105
Registriert: Fr Mär 01, 2013 10:31 am

PDF Datei einlesen und wieder auf Festplatte schreiben

Beitrag von GilbertDur » Di Sep 24, 2013 2:51 pm

Hallo, ich habe gerade folgendes versucht: Ich durchsuche ein Verzeichnis mithilfe von BOOST nach PDF-Dateien, packe dann den Dateiinhalt in einen Vector und möchte anschließend die Vector-Elemente wieder in Dateien schreiben.

Quellcode-Ausschnitt vom Einlesen:

Code: Alles auswählen

        path p ("C:\\Files\\");   // p reads clearer than argv[1] in the following code

	directory_iterator it(p), eod;
	vector<vector<char>> data;

	BOOST_FOREACH(path const &p, std::make_pair(it, eod))   
	{ 
		if(is_regular_file(p))
		{
			string path = p.string();
			uintmax_t buffer_length=file_size(p);
 
			ifstream ein(path,ios::in|ios::binary);
			vector<char> chars(buffer_length);
			ein.read(static_cast<char*>(&chars[0]),buffer_length);
			if(ein)
				data.push_back(chars);
			ein.close();
		} 
	}
Quellcode-Ausschnitt vom Schreiben:

Code: Alles auswählen

for(unsigned int i=0; i<data.size();i++)
	{
		string path = p.string();
		string filename = "file"+to_string(i);
		filename+=".pdf";
		string fullpath=path+filename;
		ofstream aus(fullpath, ios::out|ios::binary);
		int size=data[i].size();
		vector<char> buffer(size);
		aus.write(static_cast<char*>(&buffer[0]),size);
		aus.close();
	}
Führe ich das ganze nun aus, scheint alles wie gewünscht zu funktionieren. Die jeweils neu geschriebene Datei ist sogar genauso groß wie das Original. Allerdings kann ich sie anschließend nicht öffnen (Fehlermeldung, dass Datei beschädigt ist). Mache ich irgendwo einen Fehler? Habe ich mir das alles zu einfach gedacht (ist ja PDF, also ein etwas komplizierteres Format)? Hat jemand vielleicht schon mal etwas ähnliches probiert?

Benutzeravatar
oenone
Beiträge: 223
Registriert: Do Sep 01, 2011 2:42 pm
Wohnort: Bremen
Kontaktdaten:

Re: PDF Datei einlesen und wieder auf Festplatte schreiben

Beitrag von oenone » Di Sep 24, 2013 3:11 pm

Code: Alles auswählen

      vector<char> buffer(size);
      aus.write(static_cast<char*>(&buffer[0]),size);
du legst eine lokale Variable buffer an und schreibst sie direkt in die Datei? Das kann nur Zufallsmüll enthalten. Vielleicht solltest du buffer erst mal mit den richtigen Daten befüllen. Oder gleich die richtigen Daten schreiben :P

GilbertDur
Beiträge: 105
Registriert: Fr Mär 01, 2013 10:31 am

Re: PDF Datei einlesen und wieder auf Festplatte schreiben

Beitrag von GilbertDur » Di Sep 24, 2013 5:48 pm

Ok, copy-paste Fehler in Verbindung mit nicht aufgepasst.

Habe mal

Code: Alles auswählen

vector<char> buffer(size);
aus.write(static_cast<char*>(&buffer[0]),size);
in

Code: Alles auswählen

aus.write(&data[i].at(0),size);
geändert. Leider kann ich die Datei noch immer nicht öffnen, obwohl das Programm jetzt die richtigen Daten schreiben sollte.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: PDF Datei einlesen und wieder auf Festplatte schreiben

Beitrag von cloidnerux » Di Sep 24, 2013 9:27 pm

Punkt 1: Hast du die beiden Dateien mal mit nem hexeditor oder Texteditor verglichen?
Punkt 2: at() gibt eine Referenz zurück, die du nochmal referenzierte. Das kann egt nicht funktioniern. Nimm mal das & weg
Redundanz macht wiederholen unnötig.
quod erat expectandum

GilbertDur
Beiträge: 105
Registriert: Fr Mär 01, 2013 10:31 am

Re: PDF Datei einlesen und wieder auf Festplatte schreiben

Beitrag von GilbertDur » Mi Sep 25, 2013 12:21 pm

cloidnerux hat geschrieben: at() gibt eine Referenz zurück, die du nochmal referenzierte. Das kann egt nicht funktioniern. Nimm mal das & weg
Das ist schon ok. Ich will ja nicht die Adresse einer Referenz haben. Die Funktion nimmt aber nen Zeiger entgegen, daher das &, alternativ funktioniert auch:

Code: Alles auswählen

&data[i][0]
Ist vielleicht die bessere Variante, weil eindeutiger.

Das Problem lag übrigens ganz woanders. Ich nutze Visual Studio und habe das

Code: Alles auswählen

#include <vector>
vergessen. Dann hat er irgendeine vector-Variante genommen (ich wüsste gern welche), bei der irgendetwas schiefgelaufen ist.
Danke noch mal für die Hinweise und Anregungen.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8860
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: PDF Datei einlesen und wieder auf Festplatte schreiben

Beitrag von Xin » Mi Sep 25, 2013 1:57 pm

GilbertDur hat geschrieben:Das Problem lag übrigens ganz woanders. Ich nutze Visual Studio und habe das

Code: Alles auswählen

#include <vector>
vergessen. Dann hat er irgendeine vector-Variante genommen (ich wüsste gern welche), bei der irgendetwas schiefgelaufen ist.
Danke noch mal für die Hinweise und Anregungen.
Nimm include <vector> wieder raus, bewege Dich zum Vector Deines Vertrauens und drücke F12.
Visual Studio sucht Dir dann die benutzte Implementation raus.

Grundsätzlich sollte es im Zweifelsfall Warnings oder Fehlermeldungen geben.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten