Wie ändere ich interne Seitenzahlen in den Metadaten einer PDF?

37

Ich habe ein PDF-Dokument, das ich mit Nicht-Acrobat-Mitteln erstellt habe (in PDF drucken, dann eine Reihe von PDFs zusammenführen), aber ich möchte die Seitenzahlen manuell ändern (dh die ersten Seiten sind einfach Titelseiten, die Seite, die es gibt) ist beschriftet "Seite 1" ist wirklich das 7. Blatt des pdf). Was ist der einfachste (und idealerweise kostenlose) Weg, dies zu tun?

Klar, ich versuche nicht, die Nummern auf den Seiten selbst zu ändern, sondern die Seitenzahlen in den "Metadaten", die die PDF-Dateien speichern (die Seiten selbst sind bereits richtig nummeriert; ich möchte nur "Gehe zu Seite 1" auf die Seite mit der Bezeichnung 1, die Blatt 7 sein könnte).

Für das, was es wert ist, bin ich auf Windows, obwohl ich auch Zugriff auf Macs habe.

YGA
quelle
Ich bin nicht sicher, ob ich Ihre Beschreibung + Anforderung vollständig verstehe. Können Sie einen Link zu einem Beispiel-PDF bereitstellen, das Sie ändern möchten?
Kurt Pfeifle
Gibt es ein Befehlszeilentool, um dies zu tun, z. B. bei einer großen PDF-Datei, ohne die TXT-Datei tatsächlich zu öffnen?
jj_p
wie zB pdftk?
jj_p

Antworten:

39

Was Sie möchten, wird in der Tat als Seitenbeschriftung bezeichnet und kann problemlos direkt im Quellcode der PDF-Datei hinzugefügt werden. Benennen Sie die Dateierweiterung von pdfin um txtund öffnen Sie die Datei in einem Texteditor (dies kann langsam sein, abhängig von der Dateigröße, gedulden Sie sich). Die Informationen zu Seitenbeschriftungen werden in einem Knoten namens Dokumentenkatalog gespeichert, der ungefähr so aussieht:

3 0 obj
<< /Type /Catalog
   /Pages 1 0 R
>>
endobj

Es kann verwirrenderes Zeug enthalten, aber dies ist die Grundstruktur. Es gibt nur einen Katalog, sodass Sie in einer großen Datei nach dem Knoten suchen können, der diesen enthält /Catalog. Jetzt können Sie Ihre gewünschten Änderungen vornehmen, indem Sie den folgenden /PageLabelsEintrag einfügen :

3 0 obj
<< /Type /Catalog
   /Pages 1 0 R
   /PageLabels << /Nums [ 0 << /P (cover) >>
                          % labels 1st page with the string "cover"
                          1 << /S /r >>
                          % numbers pages 2-6 in small roman numerals
                          6 << /S /D >>
                          % numbers pages 7-x in decimal arabic numerals
                        ]
               >>
>>
endobj

Es gibt 3 Zeilen, die mit Zahlen beginnen und als Seitenindizes bezeichnet werden . Seite 1 hat den Index 0, Seite 2 den Index 1und so weiter. Sie beschreiben immer Bereiche, daher gilt die Zeile mit 1 <<...>>für alle Seiten von Index 1 bis 5 und die Zeile mit 6 <<...>>für alle Seiten von 6 bis zur letzten Seite. Ein Label für 0 <<...>>muss immer definiert werden.

Weitere Informationen zu Seitenbeschriftungen und PDF-Quellcode finden Sie im PDF-Standard oder in einem Wiki zu PDF-Standards.

Däne Jacob Hampton
quelle
4
Wunderbar! Dies ist der einzige Ort im Internet, an dem ich solche direkten und nützlichen Informationen gefunden habe. Wir haben schließlich nicht alle Acrobat Reader.
Noldorin
3
Mit dem Beispiel /St 8oder /St 2legen Sie einen Startpunkt für das angezeigte Etikett fest. Aber wählen Sie eine beliebige Zahl anstelle von 8 (oder 2), die> = 1 sein muss. Zum Beispiel 1 << /S /r /St 12 >>werden Seiten von (tatsächlich) 2-6 als (angezeigt) xii-xvii nummeriert - weil '12' 'xii' entspricht.
n611x007
1
danke für die antwort, aber nach meiner erfahrung funktioniert diese methode manchmal und manchmal nicht; Außerdem habe ich zufällig mehr als einen Katalog gefunden: Wie erklären Sie das?
jj_p
1
Tolle Informationen. Hier ist ein Link zu einer weiteren nützlichen Quelle: Festlegen einer einheitlichen Seitennummerierung für PDF-Dokumente aus dem W3C.
Adam Mackler
2
Bist du sicher, dass es genauso funktioniert? Wenn man sich den Rohinhalt einiger PDF-Dateien ansieht, sieht es so aus, als müssten einige Indexnummern, die auf Positionen in der Datei verweisen, nachdem der Katalog aktualisiert wurde, wenn sich die Länge des vorhergehenden Inhalts ändert.
OR Mapper
6

Wenn ich Sie richtig verstehe, sollte das folgendermaßen funktionieren:

gs \
  -o modified-pagelabels-50pages.pdf \
  -sDEVICE=pdfwrite \
  -c "[ /Page 1 /Label (i)     /PAGELABEL pdfmark" \
  -c "[ /Page 2 /Label (ii)    /PAGELABEL pdfmark" \
  -c "[ /Page 3 /Label (III)   /PAGELABEL pdfmark" \
  -c "[ /Page 4 /Label (four)  /PAGELABEL pdfmark" \
  -c "[ /Page 5 /Label (v)     /PAGELABEL pdfmark" \
  -c "[ /Page 6 /Label (|||||) /PAGELABEL pdfmark" \
  -f 50pages.pdf

Ich scheine mich jedoch zu erinnern, dass dies beim letzten Versuch (vor ungefähr 2 Jahren) nicht zuverlässig oder vollständig funktioniert hat.

UPDATE: Mein Gedächtnis hat mich nicht enttäuscht. Ich habe es jetzt erneut versucht und einen Fehlerbericht für Ghostscript ( Fehler 691889 ) eingereicht . Folgen Sie dem Link zum Fehlerbericht, um die Details anzuzeigen.

Kurt Pfeifle
quelle
5

HINWEIS 1: Die akzeptierte Antwort ist größtenteils noch korrekt, weist jedoch einige Lücken auf. Es fehlt daran, dass viele PDF-Dateien nicht direkt als Text bearbeitet werden können. Selbst wenn dies der Fall ist, kann eine solche Bearbeitung das PDF-Dokument beschädigen und es unleserlich machen. Eine Lösung, die sowohl für Unix als auch für Microsoft Windows funktioniert, ist qpdf, mit der PDF-Dateien in "QDF" übersetzt werden können, eine textbearbeitbare Form, die immer noch eine gültige PDF-Datei ist. Das mitgelieferte qpdfPaket fix-qdfberechnet Offsets neu, nachdem eine QDF-Datei bearbeitet wurde, um Schäden zu beheben.

HINWEIS 2: Mit Texteditoren unangenehm? Versuchen Sie zunächst, einen GUI-Editor wie jpdftweak zu verwenden . Manchmal funktionieren die GUI-PDF-Editoren. In diesem Fall sind Sie fertig. Wenn sie jedoch versagen, wie es bei mir oft der Fall war, können Sie diese robustere Alternative ausprobieren. Wie auch immer, bitte stimmen Sie nicht ab, dass meine Antwort weniger als elegant ist.


So bearbeiten Sie PDF-Seitenzahlen mit Qpdf

Zusammenfassung:

  1. qpdf -qdf foo.pdf foo.qdf
  2. edit foo.qdf

     0 << >>           % No label on first pages
     6 << /S /D >>     % Start numbering from 7th page.
    
  3. fix-qdf foo.qdf >bar.qdf
  4. Testbar.qdf
  5. qpdf bar.qdf bar.pdf

Detaillierte Schritte

Schritt 1.

Konvertieren Sie das Dokument in das einfach zu bearbeitende QDF-Format. Führen Sie qpdf wie folgt über die Befehlszeile aus:

qpdf -qdf foo.pdf foo.qdf

Hinweis: Wenn Sie qpdf noch nicht installiert haben, können Sie die ausführbaren Dateien von Microsoft Windows von https://github.com/qpdf/qpdf/releases herunterladen. Unix-Systeme wie Ubuntu und Debian GNU / Linux können es durch Eingabe installierenapt install qpdf .

Schritt 2.

Bearbeiten Sie das QDF-Dokument mit einem Texteditor wie Notepad ++, Emacs oder gedit. Suchen Sie nach dem Wort /Catalogund beachten Sie die darin enthaltenen << spitzen Klammern >>. In der Nähe finden Sie die aktuelle /PageLabels( falls vorhanden ).

Wir werden jeden Abschnitt hinzufügen, der anders nummeriert sein soll /PageLabels. Das Format ist start-page<< style>>. Beachten Sie, dass Leerzeichen keine Rolle spielen und die erste Seite des Dokuments ist 0. Sofern nicht anders angegeben, beginnt ein neuer Abschnitt immer mit der Seitennummerierung von 1.

Beispiele

Hier ist ein vollständiges Beispiel dafür, wie PageLabels aussehen könnte, wobei Kommentare hinzugefügt wurden:

/Type /Catalog
/PageLabels <<
  /Nums [
    0           % From the first page of the document,
      <<
        /S /r   % ...use the lowercase roman numeral style.
      >>
    6           % From seventh page onward,
      <<
        /S /D   % ...use ordinary digits (arabic numerals)
      >>
  ]
>>

Wenn die Datei keine PageLabels enthält, fügen Sie diese nachher hinzu /Type /Catalog. Zum Beispiel könnte man ändern,

1 0 obj
<<
  …
  /Type /Catalog
>>
endobj

in,

1 0 obj
<<
  … 
  /Type /Catalog
  /PageLabels
      << /Nums [
    0 << >>                 % No label for cover
    1 << /S /r >>           % i, ii for index
    3 << /S /D /St 15 >>    % 15, 16, 17, ... for article
    31 << /S /D /P (A-) >>  % A-1, A-2, A-3... for appendix
       ]
  >>
>>
endobj

OPTIONAL: AB EINER ANDEREN NUMMER MIT /St

In jedem Abschnitt wird die Nummerierung mit 1 neu gestartet, sofern Sie dies nicht anders angeben /St. Beachten Sie, wie im obigen Beispiel die vierte Seite bei 15 beginnt.

OPTIONAL: VERWENDUNG EINES ANDEREN STILS MIT /S

Der /SOperator verwendet ein Argument, mit dem Sie den Nummerierungsstil auswählen können.

  • / D Ziffern (1, 2, 3 ...)
  • / R Großbuchstaben Roman (I, II, III ...)
  • / r Roman in Kleinbuchstaben (i, ii, iii ...)
  • / A alphabetisch in Großbuchstaben (A, B, C, ..., X, Y, Z, AA, AB, AC, ...)
  • / Kleinbuchstaben (a, b, c, ..., x, y, z, aa, ab, ac, ...)

Wenn man den /SOperator weglässt , hat dieser Abschnitt der Seiten keine Nummerierung. Beispielsweise:

0 << >>         % No label for cover

OPTIONAL: HINZUFÜGEN EINES PREFIXES ZU JEDER SEITE /P

Sie können eine beliebige Textfolge vor der Seitenzahl anzeigen, indem Sie ein Wort in Klammern nach den /Pfolgenden Angaben angeben :

  31
  <<
    /S /D
    /P (A-)     % label appendix pages A-1, A-2, A-3
  >>

Wenn Sie ein Präfix ohne Stil ( /S) angeben , erhalten Sie Seiten, die nur das Wort ohne Nummer enthalten. Dies kann beispielsweise nützlich sein, wenn Sie möchten, dass ein Deckblatt einfach die Bezeichnung "Deckblatt" trägt.

     0 << /P (Cover) >>        % No number, just "Cover"

Schritt 3.

Führen fix-qdfSie den Befehl aus, um Ihre bearbeiteten PDF-Dateien gültig zu machen und die Ausgabe in bar.qdf abzulegen.

fix-qdf foo.qdf > bar.qdf

Schritt 4.

Öffnen Sie bar.qdf in Ihrem PDF-Anzeigeprogramm und überprüfen Sie, ob die Nummerierung korrekt ist.

Schritt 5.

Konvertieren Sie die QDF-Datei wie folgt zurück in eine normale PDF-Datei:

qpdf bar.qdf bar.pdf

Ta da. Sie sind fertig. Sie haben jetzt ein Dokument mit korrekt beschrifteten Seitenzahlen in bar.pdf.

hackerb9
quelle
4

Es gibt ein kleines Python-Skript, das diese Aufgabe übernehmen kann: https://github.com/lovasoa/pagelabels-py

Rufen Sie in Ihrem Fall etwa an:

./addpagelabels.py --delete file.pdf
./addpagelabels.py --startpage 1 --type 'roman lowercase' file.pdf
./addpagelabels.py --startpage 7 --type arabic file.pdf
DG '
quelle
Dies hat den Job genau so gemacht, wie ich es brauchte. Vielen Dank!
Telotortium
3

jPdf Tweak ist ein Open Source- Grafikprogramm , mit dem Sie Seitenbeschriftungen in PDF-Dateien bearbeiten können. Die Dokumentationsseite enthält schrittweise Anweisungen.

CherryBerry
quelle
Ich habe dies verwendet, um meine benutzerdefinierten Seitenbeschriftungen als "leeres" Format mit Text als Präfix hinzuzufügen. Gut gearbeitet!
Matt Sephton
Dies ist eine viel bessere Antwort als das Bearbeiten von Texten von Hand
Endolith
Bitte fügen Sie hier die schrittweisen Anweisungen hinzu, anstatt sich auf einen externen Link zu verlassen. Vielen Dank!
Hackerb9
1

Zum Entfernen der alten ist es wahrscheinlich am einfachsten, die alten plattformübergreifend abzuschneiden. Das könnten Sie zum Beispiel mit BRISS.

Das Hinzufügen der neuen Tools mit kostenlosen Tools ist schwieriger. Persönlich würde ich es wahrscheinlich mit pdflatex machen, wie in dieser StackExchange-Antwort , obwohl das eine ziemlich komplizierte Lösung sein könnte, es sei denn, Sie haben andere Verwendungsmöglichkeiten für pdflatex.

Ich denke, es geht, aber stattdessen mit jPdfTweak .

schäbig
quelle
1

Die von Dane H. angegebene Methode funktioniert mit Acrobat Reader (oder genauer gesagt der aktuellen Version von Adobe Reader). Ein kleiner Punkt, den Sie beachten sollten: Das Feld oben akzeptiert nur 8 Zeichen, sodass Sie in dieses Feld keinen Betreff eingeben können, wenn ein solches Etikett verwendet wurde. Sie können jedoch stattdessen den Menüpunkt Ansicht> Seitennavigation> Gehe zu ... oder die entsprechende Taste verwenden.

Noch ein Tipp: PDF - Spezifikation weist immer Seitenzahl nacheinander, so im Fall eines Dokuments durch das Scannen erzeugten Paare von Seiten die zwei Sätze von Zahlen erhalten aus Schritt (es sei denn , Sie mühsam Nummer jeder Seite einzeln). Sie können Ihr Dokument jedoch mit geringem Aufwand so einrichten, dass die Konvention "Gehe zu Seite n" auf die Seiten 2n und 2n + 1 angewendet wird.

user308637
quelle
1

Die Antwort von Danes ist die beste, die Formate haben sich jetzt ein wenig geändert, dies könnte hilfreich sein:

%PDF-1.6

29241 0 obj

<</Metadata 1685 0 R/Outlines 29461 0 R/PageLabels<</Nums[0<</S/D>>3<</S/D/St 6>>4<</S/D/St 10>>5<</S/D/St 12>>15<</S/D/St 70>>16<</S/D/St 72>>17<</S/D/St 80>>18<</S/D/St 82>>19<</S/D/St 90>>23<</S/D/St 96>>25<</S/D/St 99>>29<</S/D/St 110>>31<</S/D/St 130>>32<</S/D/St 133>>35<</S/D/St 137>>36<</S/D/St 140>>37<</S/D/St 145>>39<</S/D/St 150>>40<</S/D/St 152>>42<</S/D/St 155>>43<</S/D/St 160>>46<</S/D/St 165>>47<</S/D/St 167>>48<</S/D/St 170>>49<</S/D/St 180>>50<</S/D/St 190>>52<</S/D/St 300>>53<</S/D/St 305>>54<</S/D/St 319>>56<</S/D/St 380>>57<</S/D/St 390>>58<</S/D/St 500>>67<</S/D/St 515>>68<</S/D/St 525>>70<</S/D/St 550>>71<</S/D/St 553>>72<</S/D/St 560>>73<</S/D/St 600>>76<</S/D/St 620>>78<</S/D/St 650>>82<</S/D/St 670>>85<</S/D/St 700>>95<</S/D/St 714>>117<</S/D/St 900>>162<</S/D/St 1000>>178<</S/D/St 1200>>209<</S/D/St 1500>>263<</S/D/St 1555>>270<</S/D/St 1563>>389<</S/D/St 1681>>522<</S/D/St 1813>>]>> /PageMode/UseOutlines/Pages 29177 0 R/Type/Catalog>>

endobj
Daniel
quelle
1

Ich habe festgestellt, dass die direkte Bearbeitung der Datei (wie sie von pdftk nicht komprimiert wurde) nicht funktioniert, wenn in der Region '/ outlines' bereits '/ titles' festgelegt sind. Die in einem Beitrag oben beschriebene Direktbearbeitungstechnik wird auf Youtube demonstriert: https://www.youtube.com/watch?v=zoH1Z_hSpak

Die 'Update'-Funktion von pdftk ist möglicherweise intuitiver (und zuverlässiger, wenn' / title 'bereits im Bereich' / outlines 'der PDF-Datei vorhanden ist), indem Sie die hier verwendete' doc_data.txt'-Datei bearbeiten: https: / /www.pdflabs.com/blog/export-and-import-pdf-bookmarks/

Bob
quelle
1
Hallo @ Bob, Nur-Link-Antworten sind von geringer Qualität. Sie sind unbrauchbar, wenn sich die Zielsite bewegt oder verschwindet. Bitte bearbeiten Sie Ihre Antwort und zitieren Sie den relevanten Teil der Lösung hier.
C0deDaedalus
0

BeCyPDFMetaEdit http://www.becyhome.de/becypdfmetaedit/description_eng.htm

Sie können das interne Seitenzahlenschema auf der Registerkarte "Seiten" dieses Freeware-Tools hinzufügen / entfernen / ändern.

Und seien Sie vorsichtig, der PDF xchange Viewer zeigt das Seitennummernschema nicht an, und Foxitreader hat das richtige Ergebnis. Ich habe den Acrobat Reader nicht getestet.

Sulisu
quelle