Seiten einer PDF neu nummerieren


25

Ich möchte die Metadaten einer gescannten PDF-Datei bearbeiten , um verschiedenen Seiten benutzerdefinierte Seitenzahlen zuzuweisen. Zum Beispiel: Was sind jetzt die Seiten 1-3, die ich möglicherweise als i, ii und iii bezeichnen möchte, und was sind die Seiten 4-10, die ich als 1-7 bezeichnen möchte. Ich möchte die aktuelle Reihenfolge der Seiten nicht ändern.

Gibt es eine Möglichkeit, dies mit kostenlosen Tools zu tun? und B) eine Möglichkeit, dies "im Batch" zu tun (ohne dass jede Seite manuell neu nummeriert werden muss).


1
Würden Sie sich über eine auf LaTeX basierende Lösung freuen? Es wäre möglich, die PDF-Datei in ein ansonsten leeres Dokument aufzunehmen und die PDF-Seitenzahlen nach Ihren Wünschen zu erstellen.
Martin Scharrer

Ich würde mich in der Tat über eine LaTeX-Lösung freuen. Können Sie unten einige Details posten?
MarkovCh1

Antworten:


22

Hier eine Lösung basierend auf LaTeX. Es verwendet das pdfpagesPaket, um das gescannte PDF (hier genannt scan.pdf) einzuschließen . Die gewünschten PDF-Seitenbezeichnungen können mithilfe des hyperrefPakets mit pdfpagelabelsaktivierter Option festgelegt werden. Es verwendet das normale \thepageMakro als Beschriftung, mit der römische Kleinbuchstaben definiert werden können. Der Seitenzähler wird dann zurückgesetzt und auf normale Zahlen zurückgesetzt.

\documentclass[a4paper]{article}% or use 'letterpaper'
\usepackage{pdfpages}
\usepackage[pdfpagelabels]{hyperref}
\begin{document}
% Set lower case roman numbers (\Roman would be upper case):
\renewcommand{\thepage}{\roman{page}}
\includepdf[pages=1-3]{scan.pdf}
% Back to normal (arabic) numbers:
\renewcommand{\thepage}{\arabic{page}}
% Reset page counter to 1:
\setcounter{page}{1}
\includepdf[pages=4-]{scan.pdf}
\end{document}

Fügen Sie den obigen Code in eine Datei ein (zB scan_mod.tex) und kompilieren Sie ihn mit pdflatex:

# pdflatex scan_mod

Dies wird produzieren scan_mod.pdf. Besondere Anmerkungen inkl. Hyperlinks verschwinden. Dies sollte bei gescannten PDFs kein Problem sein.

Wenn Sie dies öfter benötigen, können Sie ein Skript schreiben, das die Anzahl der römisch nummerierten Seiten und den Dateinamen als Argumente akzeptiert und eine Datei mit dem obigen Code erstellt, in der der Name und die Nummern Variablen sind, die dann kompiliert werden.


Vielen Dank für eine so gründliche Antwort! Dies ist eine großartige Lösung. Die einzigen anderen Lösungen, von denen ich wusste, dass sie entweder .NET oder etwas ähnlich Schreckliches beinhalten oder Dialoge in Adobe Acrobat durchlaufen (was ich mir sowieso nicht leisten kann). Das ist sogar skriptfähig!
MarkovCh1

Schöne lösung! Ich habe mich über dieselbe Frage der Stapelgenerierung von Lesezeichen / Umrissen im linken Bereich mit Hyperlinks zum Anfang jedes Abschnitts / Kapitels gewundert. Ist es auch möglich, LaTex zu verwenden? Hier ist meine Frage askubuntu.com/questions/27312/bookmark-pdf-and-djvu-files . Vielen Dank!
Tim


Das ist eine fantastische Antwort, ich habe sie benutzt und sie funktioniert perfekt.
Andrea Lazzarotto

1
@TiGR: Ja, das liegt daran, dass die Seiten der Original-PDF zu einer neuen PDF hinzugefügt werden und dabei Hyperlinks und ähnliche Dinge verworfen werden (aus Sicherheitsgründen, wie ich mich erinnere). Da es beim OP um gescannte PDFs ging, war dies kein Problem.
Martin Scharrer

10

Sie können dies mit einem Texteditor tun.

Öffnen Sie, wie in der Antwort angegeben, eine PDF-Datei mit einem Texteditor, suchen Sie nach einem /CatalogEintrag und fügen Sie einen Eintrag mit folgendem Namen hinzu /PageLabels:

/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
]
>>

Beachten Sie, dass die Seitenindizes (physische Seitenzahlen) mit beginnen 0.

Natürlich können Sie dies automatisch mit Skriptsprachen tun.

PDF-Standards - Seitenbeschriftungen sind detailliert spezifiziert.


+1 Diese Antwort ist viel einfacher und besser als die akzeptierte, und der Link zur Spezifikation ist eine große Hilfe.
JJ

6

jPDF Tweak ist ein grafisches Open Source-Dienstprogramm, das Seitennummerierung (der richtige Begriff ist "Seitenbeschriftung") und viele andere Anfänger- bis Fortgeschrittene-PDF-Bearbeitungsfunktionen bietet. Es läuft auf Ubuntu und anderen Betriebssystemen.

Die Dokumentationsseite enthält schrittweise Anweisungen.


Danke, das hat mir wirklich geholfen, Formen und alles zu bewahren. jPDF Tweak ist wirklich mächtig, allerdings mit einer nicht sehr praktischen Oberfläche.
TiGR

Wenn die ursprüngliche Frage keine Batch-Jobs erwähnte, würde ich sagen, dass diese Antwort wirklich die akzeptierte verdient.
Brian Z

4

Es gibt ein Tool namens PDF Mod, mit dem Sie die Seiten einer PDF-Datei kostenlos neu anordnen können.

Es kann vom Ubuntu Software Center in Ubuntu 10.10 und höher installiert werden.

So installieren Sie in Ubuntu 9.10 oder 10.04:

So installieren Sie Fügen Sie das ppa ppa:pdfmod-team/ppazu Ihren Softwarequellen hinzu (so geht 's ) und installieren Sie pdfmod über das Software-Center

Angepasst von: http://www.webupd8.org/2011/03/edit-pdf-documents-in-linux-with-pdf.html

Viel Glück: D


4
Ah, aber bei meiner Frage ging es nicht darum, wie die Seiten neu angeordnet werden sollen. Es sollte die Metadaten für die Seiten ändern: die Seitenzahlen neu beschriften (römische Ziffern als die ersten Seiten einfügen, vielleicht ein paar überspringen; PDFs unterstützen die ersteren sicherlich).
MarkovCh1

3

Habe gerade einen Zeiger gefunden, den es dafür geben könnte ghostscript, hier:Habe pdftk - Lesezeichen zu pdf hinzufügen und bearbeiten - Unix und Linux - Stack Exchange # 18600 ; es bezieht sich auf links:

Die obigen Ausführungen befassen sich jedoch mit Lesezeichen - nicht mit logischer Paginierung. Es ergibt sich aus pdfmarkReference.pdf , der erforderliche "Befehl" ist ' /Label' (oder ' /PAGELABEL') - und es wird weiter auf PDFReference.pdf, Kapitel 8.3.1 "Seitenbeschriftungen" verwiesen. Leider wird in diesem Kapitel nicht unbedingt erklärt, wie PDF-Markierungen mit Seitenbeschriftungen verwendet werden können.

Das / PAGELABEL-PDF-Kennzeichen hat keinen / Page-Schlüssel, daher kann das Kennzeichen nur für die 'aktuelle' Seite (und folglich nur für jeweils eine Seite) festgelegt werden. Da Sie es von Anfang an aufrufen, wird erwartet, dass für die erste Seite und nur für diese eine Bezeichnung festgelegt wird.

Mehrere / PAGELABELs für dieselbe Seite: Die pdfmark-Referenz besagt, dass die letzte wirksam wird, sodass das Ergebnis Ihrer ersten Befehlszeile in Ordnung ist. Beachten Sie, dass die Taste / Page ignoriert wird.

Wie werden Seitenbeschriftungen in PostScript festgelegt? Ich kann mir 2 Methoden vorstellen:

(A) Der 100% dokumentierte Weg:

Stellen Sie auf jeder Seite ein / PAGELABEL aus.

(B) Der weniger dokumentierte Weg: ...

gswin32c -sDEVICE=pdfwrite -sOutputFile=50pages.pdf -dNOPAUSE

GS>[/_objdef {pl} /type /dict /OBJ pdfmark
GS>[{pl} <</Nums [0 <</P (Page ) /S /r /St 10>> 2 <<>>]>> /PUT pdfmark
GS>[{Catalog} <</PageLabels {pl}>> /PUT pdfmark
GS>50 { showpage } repeat
GS>quit

... und weiter in diesem Thread:

Um diese Arbeit zu machen; Da es sich bei der Originaldatei um eine PDF-Datei handelt, können Sie jede Seite einzeln aus der Datei ausführen. Sie können also das PAGELABEL-PDF-Kennzeichen für Seite 1 festlegen, Seite 1 in der Originaldatei ausführen, das PAGELABEL für Seite 2 festlegen, Seite 2 in der Originaldatei ausführen usw.

Da die Beschriftung (wie in SaGS angegeben) auf die aktuelle Seite angewendet wird, sollte dies die Beschriftungen für jede Seite in der PDF-Ausgabedatei korrekt festlegen. (Einschränkung: Ich habe das noch nicht ausprobiert)

BEARBEITEN: nur um dies zu zeigen - wenn Sie dies als pdfmarksDatei gespeichert haben:

[ /Label (-1) /PAGELABEL pdfmark
showpage
[ /Label (0) /PAGELABEL pdfmark
showpage
[ /Label (1) /PAGELABEL pdfmark
showpage

... und du rufst an:

gs -q -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=outfile.pdf infile.pdf pdfmarks

... dann werden am Ende drei leere Seiten mit den infile.pdfBezeichnungen -1, 0 und 1 angehängt :)

 

Naja, vielleicht hilft das irgendwann, ein einfacheres gsSkript zum Umnummerieren von Seiten zu finden :)
Prost!

 

EDIT2: Verstanden, ich denke - benutze den gleichen gsBefehl wie oben - und unten ist der Inhalt des pdfmarksSkripts, das die infile.pdf neu nummeriert, also beginnt es mit -1, 0, 1 ... Es ist im Grunde ein modifiziertes Beispiel von die PDF-Referenz (siehe Kommentare für mehr):

% Type name (Optional) The type of PDF object that this dictionary describes; if present, must be PageLabel for a page label dictionary.
% S name (Optional) The numbering style to be used for the numeric portion of each page label:
%       D Decimal arabic numerals
%       R Uppercase roman numerals
%       r Lowercase roman numerals
%       A Uppercase letters (A to Z for the first 26 pages, AA to ZZ for the next 26, and so on)
%       a Lowercase letters (a to z for the first 26 pages, aa to zz for the next 26, and so on)
% P text string (Optional) The label prefix for page labels in this range.
% St integer (Optional) The value of the numeric portion for the first page label in the range. Subsequent pages will be numbered sequentially from this value, which must be greater than or equal to 1. Default value: 1.

% renumber first 25 pages - push each by 10, and add prefix:
% [/_objdef {pl} /type /dict /OBJ pdfmark
% [{pl} <</Nums [0 <</P (Page ) /S /D /St 10>> 25 <<>>]>> /PUT pdfmark
% [{Catalog} <</PageLabels {pl}>> /PUT pdfmark

[/_objdef {pl} /type /dict /OBJ pdfmark
[{pl} <</Nums [ 0 << /P (-1) >>         % just label -1 (no style) for pg 0;
                1 << /P (0) >>          % just label  0 (no style) for pg 1;
                2 << /S /D /St 1 >>     % decimal style, start from 1, for pg2 and on.
                ]>> /PUT pdfmark
[{Catalog} <</PageLabels {pl}>> /PUT pdfmark

Groß! Danke, du machst keine Witze :)
MarkovCh1

2

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

In Ihrem Fall rufen Sie an:

./addpagelabels.py --delete file.pdf
./addpagelabels.py --startpage 1 --type 'roman lowercase' file.pdf
./addpagelabels.py --startpage 4 --type arabic file.pdf

1
Dies ist eine großartige Lösung!
Mikemtnbikes

1

Openoffice / Libreoffice kann den Trick mit der PDF-Import-Erweiterung und einem Paginierungsmakro machen.

Keine perfekte Lösung, aber es funktioniert für mich (abgesehen von der Verwendung von PDF Mod - was ich sehr empfehlen würde).


Die PDF-Import-Erweiterung scheint für OpenOffice.org 3.2 kaputt zu sein. Beim Importieren (in Draw and Writer) wird ein "E / A-Fehler" ausgegeben.
MarkovCh1

0

Versuchen Sie es mit pyPdf , einer Python-Bibliothek zum Bearbeiten von PDF-Dokumenten. Einige, aber nicht viele Programmierungen wären erforderlich.

Sie können sich auch PDFtk ansehen , obwohl ich nicht überprüft habe, ob es das Ändern der Seitenzahl für einzelne Seiten unterstützt. Beide sind als Pakete in Ubuntu verfügbar.


1
Hm, PDFtk scheint das nicht zu können. pyPdf bietet viele Methoden zum Extrahieren von Metadaten, scheint diese jedoch nicht in das Dokument zurückschreiben zu können.
MarkovCh1

0

Es gibt eine andere App namens PDFEdit, die auf Source Forge gehostet wird. Source Forge-Projektseite - Dies ist jedoch nicht hilfreich, da nicht die von Ihnen benötigte Funktionalität vorhanden ist

Textbearbeitung in PDFEdit


1
Ich glaube nicht, dass PDF Edit die Seitenzahlen ändern kann. Ich habe es auf jeden Fall versucht und habe es nicht geschafft.
MarkovCh1

2
@Syzygy - in der Tat nur angekreuzt: pdfeditKann Catalog/PageLabelsDict anzeigen, wenn ein Dokument es hat, aber wenn es ausgewählt ist, heißt es: " Dieses Wörterbuch hat keine direkt bearbeitbaren Eigenschaften " ... Prost!
Sdaau
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.