2014-01-16 7 views
5

Ich versuche ein Python-Skript für Blender zu entwickeln, um eine gerenderte Bildsequenz in eine PDF auszugeben. Ich benutze Imagemagick, um in PDF zu konvertieren, dieser Teil funktioniert gut, aber ich möchte die Miniaturvorschau auch in der PDF enthalten.Bearbeiten von PDF-Attributen mit sed

Das PDF-Format ist ein bisschen verwirrend für mich, aber ich habe die /PageMode und /UseThumbs Tags und wie Sie sie richtig in die Datei einfügen. Ich kann das manuell machen und es funktioniert ziemlich gut. Aber ich habe versucht, ein ähnliches Ergebnis zu erhalten, ohne es manuell machen zu müssen, ich schreibe doch ein Skript. Hier ist ein Beispiel Ausschnitt aus den Kopfdaten im PDF, mit den zusätzlichen tags:

%PDF-1.3 
1 0 obj 
<< 
/Pages 2 0 R 
/PageMode 
/UseThumbs 
/Type /Catalog 
>> 
endobj 
2 0 obj 
<< 
/Type /Pages 
/Kids [ 3 0 R 17 0 R 31 0 R ] 
/Count 3 
>> 

Ich versuche, sed zu verwenden, um die Tags einfügen, wie auf der 4. und 5. Leitungen benötigt, die auch arbeiten, aber Wenn ich das PDF öffne, sind die Bilder beschädigt. Wenn ich die manuell bearbeitete PDF-Datei (die nicht beschädigt ist) mit der sed-bearbeiteten PDF-Datei (die beschädigt ist) in Notepad ++ vergesse, gibt es keinen Unterschied in den Dateien, die ich finden kann. Es gibt eine andere Anzahl von Zeichen, aber ich kann die Position des Unterschieds nicht finden

Ich verstehe, dass PDFs eine Offset-Querverweistabelle haben, aber es scheint mir seltsam, dass es nichts korrumpiert, aber tun, indem es es tut es mit sed schafft Korruption

Was mache ich falsch?

+0

Können Sie die beiden Dateien irgendwo posten, damit wir uns beide ansehen können? – janos

+6

Es deutet darauf hin, dass es ein CR/LF-Problem gibt, wenn die Anzahl der Bytes aus ist, aber Sie können einen Unterschied nicht visuell bestätigen. Ein Beispiel-PDF würde in der Tat helfen. – usr2564301

+2

* tut es von Hand nichts korrumpiert * - einige PDF-Viewer, nämlich der Adobe Reader, neigen dazu, bestimmte Arten von Schäden zu ignorieren, die sie zu handhaben wissen, und sich nur beschweren, wenn die PDF-Datei in einer Weise beschädigt ist kann nicht umgehen. Höchstwahrscheinlich hat Ihre manuelle Änderung die Datei lediglich * anders * beschädigt. Wenn @ Jongwares Annahme, dass der Unterschied in Zeilentrennzeichen besteht, wahr ist (vielleicht liest sed die Datei * Zeile für Zeile * und schreibt beim Schreiben immer die bevorzugte Zeilenendung), beachten Sie, dass das Ändern von Zeilentrennzeichen in einem komprimierten Stream tatsächlich erfolgt breche es. – mkl

Antwort

2

Sie wollen wirklich nicht von sed tun. Einige PDF-Dateien können wie zeilenorientierte Textdateien aussehen, sind dies aber höchstwahrscheinlich nicht.

Da Sie bereits Python verwenden, können Sie eine Python-Bibliothek für diese Aufgabe verwenden.

pdfrw wird dies aus reinem Python für Sie tun. Es wird in einer PDF-Datei gespeichert und mit den gewünschten Änderungen neu erstellt und Dateioffsets korrekt festgelegt. Der folgende Code-Snippet sollte/set PageMode zu/UseThumbs im/Root-Wörterbuch der PDF:

 
    from pdfrw import PdfReader, PdfWriter, PdfName 

    trailer = PdfReader('myfile.pdf') 
    trailer.Root.PageMode = PdfName.UseThumbs 
    PdfWriter().write('mynewfile.pdf', trailer) 

Disclaimer: Ich bin der pdfrw Autor.

+0

Ich wünschte, ich hätte das gestern gesehen. – saulspatz