Seite 1 von 1

PDF Datei einlesen und wieder auf Festplatte schreiben

Verfasst: Di Sep 24, 2013 2:51 pm
von GilbertDur
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?

Re: PDF Datei einlesen und wieder auf Festplatte schreiben

Verfasst: Di Sep 24, 2013 3:11 pm
von oenone

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

Re: PDF Datei einlesen und wieder auf Festplatte schreiben

Verfasst: Di Sep 24, 2013 5:48 pm
von GilbertDur
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.

Re: PDF Datei einlesen und wieder auf Festplatte schreiben

Verfasst: Di Sep 24, 2013 9:27 pm
von cloidnerux
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

Re: PDF Datei einlesen und wieder auf Festplatte schreiben

Verfasst: Mi Sep 25, 2013 12:21 pm
von GilbertDur
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.

Re: PDF Datei einlesen und wieder auf Festplatte schreiben

Verfasst: Mi Sep 25, 2013 1:57 pm
von Xin
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.