Anzeigen und Bearbeiten des Codes einer PDF-Datei


11

Ich habe mich gefragt, wie ich den Code einer PDF-Datei anzeigen und bearbeiten soll.

  1. Beim Anzeigen möchte ich das Binärformat nicht sehen, daher denke ich, dass es hexdumpmöglicherweise nicht das ist, was ich möchte. Ich habe es versucht gedit, aber es kann keine Codierungsmethode zum Decodieren des PDF-Inhalts verwendet werden.

  2. Durch das Bearbeiten möchte ich sie suchen /Fitund ändern, /XYZindem ich zum Beispiel sed. Mein Befehl sed s/\/Fit/\/XYZ/ < 1.pdf > 2.pdfscheint jedoch das Erscheinungsbild meiner PDF-Datei nicht wie erwartet zu ändern, obwohl er keinen Fehler meldet. Ich habe mich gefragt, ob sedPDF-Dateien tatsächlich so bearbeitet werden können, als wären sie einfacher Text.

Der Kontext meiner Fragen kann aus dieser Frage entnommen werden . Mein Betriebssystem ist Ubuntu 10.10.

Antworten:


9

Sie können sedmit Binärdateien verwenden (mindestens GNU sed; einige Implementierungen haben möglicherweise Probleme mit Dateien, die Nullzeichen enthalten oder nicht mit einem Zeilenumbruchzeichen enden). Der von Ihnen verwendete Befehl ersetzt jedoch nur das erste Vorkommen /Fitin jeder Zeile, und Zeilen sind in einer PDF-Datei so gut wie bedeutungslos. Sie müssen alle Vorkommen ersetzen:

 sed s/\/Fit/\/XYZ/g

Es wäre nur dann robuster, /Fitwenn es nicht von einem Wortbestandteil gefolgt wird (z. B. nicht ersetzen /Fitness; ich weiß nicht, ob Ihre Datei Vorkommen enthält /Fit, die Probleme verursachen würden). Hier ist eine Möglichkeit:

perl -pe 's!/Fit\b!/XYZ!g'

Vielen Dank! Es funktioniert jetzt! (1) Ich habe mich gefragt, wie viele Suchzeichen in binären Inhalten enthalten sind. Codiert sed zuerst die Abfragezeichen vor der Suche? (2) Im letzten Befehl, was bedeutet !, \bund gdas? Kann es ohne Perl nur mit sed gemacht werden?
Tim

1
@Tim (1) Sed lädt die Daten in den Speicher, bearbeitet sie und druckt sie aus. Warum sollte es etwas codieren müssen? (2) gbedeutet, alle Vorkommen in jeder Zeile sowohl in sed als auch in perl zu ersetzen. !ist das Trennzeichen; Sie können (fast) jedes Zeichen als Trennzeichen für den sBefehl auswählen ( dies gilt sowohl für sed als auch für perl). \bbedeutet eine Wortgrenze; es existiert in perl aber nicht in sed.
Gilles 'SO - hör auf böse zu sein'

Über (1), da die Zeichen, die Sie sed im Befehl geben, für Menschen lesbar sind. Wenn der zu durchsuchende Inhalt vollständig binär ist, wie kann sed das Abfragewort dort finden?
Tim

@ Tim Text sind Binärdaten, die von Menschen gelesen werden können.
Gilles 'SO - hör auf böse zu sein'

1
@Tim Ja, Sie können Binärdaten in der Abfrage übergeben. Sie müssen die Zeichen buchstäblich in Ihren sed- oder Shell-Quellcode einfügen.
Gilles 'SO - hör auf böse zu sein'

16

Zu Ihrer ersten Frage ("Quellcode anzeigen, aber keine Binärdatei"): Es gibt einige Optionen, mit denen Sie die internen Binärdatenströme, die an viele Objekte angehängt sind, dekomprimieren können.

Mein Lieblingswerkzeug dafür ist QPDF , das auf allen wichtigen Betriebssystemplattformen verfügbar ist. Der folgende Befehl dekomprimiert alle Streams und alle Objekt-Streams:

 qpdf --qdf --object-streams=disable orig.pdf expanded.pdf

Jetzt können Sie Ihre PDF-Datei in einem beliebigen Texteditor öffnen. (Möglicherweise befinden sich noch einige binäre Blobs darin: z. B. Schriftdateien und ICC-Profile, deren Erweiterung für QPDF nicht sinnvoll wäre.)

Zum erneuten Komprimieren derexpanded.pdf nach dem Bearbeiten , können Sie Folgendes ausführen:

 qpdf expanded.pdf orig2.pdf

(Vorsicht beim manuellen Bearbeiten von PDFs! Um dies richtig zu machen, müssen Sie viel über die interne Syntax wissen. Sobald Sie ein einzelnes Byte hinzufügen oder löschen, können Sie Fehlermeldungen von PDF-Readern erhalten, die dies möglicherweise nicht mehr können Öffnen Sie es, da das interne ToC der PDF-Dateien beschädigt ist, was auf Byte-Offset-Berechnungen basiert. Das Ersetzen Fitdurch XYZZeichenfolgen sollte jedoch in Ordnung sein ...)


1
Sie können auch Text hinzufügen oder entfernen. Wenn sich die Länge eines Objektstroms ändert, können die Byte-Offsets mithilfe des fix-qdfProgramms, das Teil von qpdf ist, neu berechnet werden. Du musst trotzdem ein bisschen vorsichtig sein. Siehe qpdf.sourceforge.net/files/qpdf-manual.html#ref.qdf
H. Rittich

@ H.Rittich: Danke für den Kommentar ... Inwiefern eröffnet dies Ihrer Meinung nach eine neue Perspektive auf das Problem? Haben Sie gedacht, wir wissen nicht, dass wir auf diese Weise Text hinzufügen oder entfernen können?
Kurt Pfeifle

@KursPfeifle: Ich mache keine Annahmen darüber, was Sie wissen. Die Antwort heißt es, dass die Bearbeitung einem PDF auf diese Weise muss die Byte - Offsets der Objekte in der Datei zu erhalten. Es ist jedoch möglich, die Byte-Offsets zu ändern, wenn sie später mithilfe von korrigiert werden fix-qdf. Wenn Sie also eine Zeichenfolge durch eine Zeichenfolge unterschiedlicher Länge ersetzen möchten, ist dies möglich, Sie müssen jedoch das fix-qdfWerkzeug verwenden. Ich würde sagen, dass dies eine nützliche Ergänzung zur Antwort ist.
H. Rittich

@ H.Rittich: Danke für deine Perspektive. Wenn ich die Notwendigkeit betont , Byteversätze von Objekten zu erhalten , wollte ich nicht auf Ratschläge Menschen über WIE sie dies tun sollten. Hätten Sie Ihren Kommentar etwas anders formuliert, hätte ich die Absicht Ihres Kommentars schneller verstanden.
Kurt Pfeifle

1

sedist zeilenorientiert, was es nicht gut für Binärdateien geeignet macht, die als Blöcke und nicht als Zeilen strukturiert sind.
Versuchen Sie stattdessen bbe (bbe-.sourceforge.net).

Alternativ öffnen sowohl Emacs (GNU und XEmacs) als auch vim PDF-Dateien nahtlos. Es ist natürlich nicht sehr hübsch gedruckt, da es sich um gemischten Text und Binärdateien handelt, aber es reicht für Ihre Bearbeitungszwecke aus.
Es gibt ein Pdftk- Plugin für vim, das alles einfacher macht. Laden Sie es hier herunter (Zip-Datei).
Wie Sie wahrscheinlich wissen, verfügen beide oben genannten Editoren über leistungsstarke Such- und Ersetzungsfunktionen.

Das Konvertieren der PDF-Datei in den QDF-Modus vor dem Bearbeiten von PDF-Dateien ist sehr einfach.


Sie können auch versuchen, mit seddem -bSchalter zu bearbeiten . Wenn es funktioniert, werde ich dies zu meiner Antwort hinzufügen.
Philomath

@ Tim: Was meinst du mit "zeigt nichts", nur leer? Irgendeine Fehlermeldung? Können Sie es auch mit XEmacs versuchen? (Alle drei haben für mich gearbeitet).
Philomath

Geschweige denn über -b, dann ist es Cygwin spezifisch.
Philomath

Emacs sagt "Datei 1.pdf ist groß (9 MB), wirklich offen? (J oder n)". Ich habe "y" gewählt und dann ist nichts da.
Tim

Höchstwahrscheinlich ein Emacs-Problem, haben Sie XEmacs? (Ich habe gerade ein 31 MB PDF ohne Probleme geöffnet).
Philomath

0

Verwenden Sie LibreOffice oder OpenOffice, um die PDF-Datei zu öffnen, anzuzeigen, zu ersetzen, eine neue PDF-Datei zu schreiben usw. Ich denke, Sie können sie sogar über die Befehlszeile oder programmgesteuert verwenden, wenn viele Dokumente verarbeitet werden müssen.

Beachten Sie, dass PDFs aus einigen Quellen, z. B. Scannern, die Seiten häufig als Bilder und nicht als Text enthalten, sodass Sie bei der Verwendung von Suchen und Ersetzen kein Glück haben.


3
(1/2) Beachten Sie die folgende Tatsache: LibreOffice ist kein nativer PDF-Editor. Wenn eine PDF-Datei geöffnet wird, werden alle Seiten in ein Vektorbild konvertiert (wodurch möglicherweise die Rasterteile aus der Original-PDF-Datei als Rasterteile beibehalten werden) und im LibreOffice Draw- Teil der LibreOffice-Suite geöffnet . Wenn die bearbeitete PDF-Datei gespeichert wird, handelt es sich um eine PDF-Datei, die aus dem nativen LibreOffice Draw-Format (mit dem Suffix .odg ) in PDF exportiert wurde .
Kurt Pfeifle

3
(2/2) Dieser Workflow kann unerwartete Nebenwirkungen haben. Darüber hinaus kann die LibreOffice Draw-Anwendung möglicherweise nicht alle Elemente aus dem Original-PDF korrekt importieren. In vielen Fällen kann es jedoch immer noch ein nützliches Werkzeug für all jene Leute sein, die keine besseren Mittel zur Verfügung haben.
Kurt Pfeifle
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.