Zmień numerację stron pliku PDF

25

Chcę edytować metadane zeskanowanego pliku PDF, aby przypisać niestandardowe numery stron do różnych stron. Na przykład, jakie są teraz strony 1-3, chciałbym zadzwonić do i, ii i iii, a jakie są strony 4-10, chcę zadzwonić do 1-7. Ja nie chce zmienić rzeczywistą kolejność stron.

Czy istnieje A) sposób, aby to zrobić w ogóle za pomocą bezpłatnych narzędzi; oraz B) Sposób na wykonanie tego „wsadowo” (bez konieczności ręcznej numeracji każdej strony).

MarkovCh1
źródło
1
Czy byłbyś zadowolony z rozwiązania opartego na LaTeX? Możliwe byłoby dołączenie pliku PDF do innego pustego dokumentu i utworzenie numerów stron PDF, jak chcesz.
Martin Scharrer
Byłbym naprawdę zadowolony z rozwiązania LaTeX. Czy możesz zamieścić kilka szczegółów poniżej?
MarkovCh1

Odpowiedzi:

22

Oto rozwiązanie oparte na LaTeX. Używa tego pdfpagespakietu, aby dołączyć zeskanowany plik PDF (tutaj nazywany scan.pdf). Wymagane etykiety stron PDF można ustawić za pomocą hyperrefpakietu z pdfpagelabelswłączoną opcją. Wykorzystuje normalne \thepagemakro jako etykietę, którą można zdefiniować dla małych cyfr rzymskich. Licznik stron jest następnie resetowany i przywracany do normalnych wartości.

\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}

Umieść powyższy kod w pliku (np. scan_mod.tex) I skompiluj go z pdflatex:

# pdflatex scan_mod

To wytworzy scan_mod.pdf. Jednak wszelkie specjalne adnotacje, w tym. hiperłącza znikną. Nie powinno to stanowić problemu w przypadku zeskanowanych plików PDF.

Jeśli potrzebujesz tego częściej, możesz napisać skrypt, który akceptuje liczbę stron z cyframi rzymskimi i nazwy plików jako argumenty i tworzy plik tymczasowy z powyższym kodem, w którym nazwa i liczby są zmiennymi, które są następnie kompilowane.

Martin Scharrer
źródło
Dziękuję za tak dokładną odpowiedź! To świetne rozwiązanie. Jedyne inne znane mi rozwiązania obejmowały albo .NET albo coś równie okropnego, albo brodzenie przez okna dialogowe w Adobe Acrobat (na które i tak nie mogę sobie pozwolić). To jest nawet skryptowalne!
MarkovCh1
Fajne rozwiązanie! Zastanawiałem się nad tym samym pytaniem o generowanie partii zakładek / konturów na lewym panelu z hiperłączami do początku każdej sekcji / rozdziału. Czy można również korzystać z LaTex? Oto moje pytanie askubuntu.com/questions/27312/bookmark-pdf-and-djvu-files . Dzięki!
Tim
2
@Tim: Możesz tworzyć zakładki PDF za pomocą LaTeX podczas łączenia plików PDF. Zobacz moją odpowiedź na temat Jak używać LaTeX do tworzenia spisu treści (nagłówki rozdziałów, podsekcje itp.) Dla zestawu plików pdf, które łączę w jeden duży plik pdf? na TeX.SX.
Martin Scharrer
To fantastyczna odpowiedź, użyłem jej i działa idealnie.
Andrea Lazzarotto
1
@TiGR: Tak, to dlatego, że strony oryginalnego pliku PDF są dodawane do nowego pliku PDF iw tym procesie hiperłącza i podobne rzeczy są odrzucane (dla bezpieczeństwa, jak pamiętam). Ponieważ OP dotyczyło zeskanowanego pliku PDF, nie był to problem.
Martin Scharrer
10

Możesz to zrobić za pomocą edytora tekstu.

Jak mówi odpowiedź, otwórz plik PDF za pomocą edytora tekstów, wyszukaj /Catalogpozycję, a następnie dołącz pozycję o następującej nazwie /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
]
>>

Zauważ, że indeksy stron (fizyczne numery stron) zaczynają się od 0.

Oczywiście możesz to zrobić automatycznie, używając języków skryptowych.

Standardy PDF - Etykiety stron mają szczegółową specyfikację.

Akihiro HARAI
źródło
+1 Ta odpowiedź jest znacznie prostsza i lepsza niż zaakceptowana, a link do specyfikacji jest świetną pomocą.
jja
6

jPDF Tweak to graficzne narzędzie Open Source, które oferuje numerację stron (poprawnym terminem jest „etykietowanie stron”) i wiele innych zaawansowanych funkcji edycji PDF. Działa na Ubuntu i innych systemach operacyjnych.

Strona Dokumentacja zawiera instrukcje krok po kroku.

Cherry Berry
źródło
Dzięki, to naprawdę mi pomogło, zachowując formy i wszystko. jPDF Tweak to naprawdę potężna rzecz, choć z niezbyt wygodnym interfejsem.
TiGR
Gdyby pierwotne pytanie nie wymieniało zadań wsadowych, powiedziałbym, że ta odpowiedź naprawdę zasługuje na akceptację.
Brian Z
4

Istnieje narzędzie o nazwie PDF Mod, które jest bezpłatnym narzędziem do zmiany układu stron pliku PDF.

Można go zainstalować z Centrum oprogramowania Ubuntu w systemie Ubuntu 10.10 i nowszych.

Aby zainstalować w Ubuntu 9.10 lub 10.04:

Aby zainstalować Dodaj ppa ppa:pdfmod-team/ppado źródeł oprogramowania ( oto jak to zrobić ) i zainstaluj pdfmod z centrum oprogramowania

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

Powodzenia: D

Wilsonzaizai
źródło
4
Ach, ale moje pytanie nie dotyczyło sposobu zmiany kolejności stron. Miała to na celu zmianę metadanych dla stron: ponowne oznaczenie numerów stron (wstaw cyfry rzymskie jako kilka pierwszych stron, być może pomiń kilka; pliki PDF obsługują te pierwsze z pewnością).
MarkovCh1
3

Właśnie znalazłem wskaźnik, którego można by ghostscriptdo tego użyć , tutaj: pdftk - Dodaj i edytuj zakładki do pdf - Unix i Linux - Stack Exchange # 18600 ; odnosi się do linków:

Powyższe dotyczy jednak zakładek - nie logicznego podziału na strony. Okazuje się, że z pdfmarkReference.pdf potrzebne „polecenie” to „ /Label” (lub „ /PAGELABEL”) - i dalej odnosi się do PDFReference.pdf rozdział 8.3.1 „Etykiety stron”. Niestety ten rozdział niekoniecznie wyjaśnia, w jaki sposób można używać znaczników pdf z etykietami stron - ale ten post:

Znak pdf / PAGELABEL nie ma żadnego klawisza / Page, więc można ustawić etykietę tylko dla „bieżącej” strony (aw konsekwencji tylko dla jednej strony na raz). Ponieważ nazywasz to na samym początku, oczekuje się, że określi etykietę dla 1. strony i tylko dla niej.

Wiele / PAGELABEL dla tej samej strony: odwołanie do znacznika pdf mówi, że ostatnia obowiązuje, więc wynik pierwszego wiersza poleceń jest OK. Uwaga: klawisz / Page jest ignorowany.

Jak ustawić etykiety stron z PostScript? Mogę wymyślić 2 metody:

(A) W 100% udokumentowany sposób:

Wydaj / PAGELABEL jako część każdej strony.

(B) Mniej udokumentowany sposób: ...

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

... i dalej w tym wątku:

Co do tego, żeby to działało; ponieważ oryginalny plik jest plikiem PDF, możesz uruchomić każdą stronę z pliku osobno. Możesz więc ustawić znak pdf PAGELABEL dla strony 1, uruchomić stronę 1 z oryginalnego pliku, ustawić PAGELABEL dla strony 2, uruchomić stronę 2 z oryginalnego pliku i tak dalej.

Ponieważ etykieta jest (jak powiedział SaGS) stosowana do bieżącej strony, powinno to poprawnie ustawić etykiety dla każdej strony w wyjściowym pliku PDF. (zastrzeżenie: nie próbowałem tego)

EDYCJA: aby to pokazać - jeśli masz to zapisane jako pdfmarksplik:

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

... a ty dzwonisz:

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

... wtedy na końcu zostaną dodane trzy puste strony infile.pdf, oznaczone jako -1, 0 i 1 :)

 

Cóż, może to kiedyś pomoże uzyskać prostszy gsskrypt do zmiany numeracji stron :)
Pozdrawiam!

 

EDIT2: Rozumiem, myślę - użyj tego samego gspolecenia co powyżej - a poniżej znajduje się zawartość pdfmarksskryptu, który zmieni numerację pliku infile.pdf, więc zaczyna się od -1, 0, 1 ... Jest to w zasadzie zmodyfikowany przykład z odniesienie do pliku PDF (więcej komentarzy w komentarzach):

% 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
sdaau
źródło
Świetny! Dzięki, nie żartujesz :)
MarkovCh1
2

Istnieje mały skrypt Pythona, który może wykonać zadanie: https://github.com/lovasoa/pagelabels-py

W twoim przypadku zadzwoń:

./addpagelabels.py --delete file.pdf
./addpagelabels.py --startpage 1 --type 'roman lowercase' file.pdf
./addpagelabels.py --startpage 4 --type arabic file.pdf
DG ”
źródło
1
To świetne rozwiązanie!
mikemtnbikes
1

Openoffice / Libreoffice może załatwić sprawę dzięki rozszerzeniu importu pdf i Makro stronicowania.

Nie jest to idealne rozwiązanie, ale działa dla mnie (oprócz używania PDF Mod - co zdecydowanie zaleciłbym).

RolandiXor
źródło
Wydaje się, że rozszerzenie pdf-import zostało zablokowane dla OpenOffice.org 3.2. Importowanie (do Draw and Writer) powoduje „błąd we / wy”.
MarkovCh1
0

Wypróbuj pyPdf , bibliotekę Pythona do manipulowania dokumentami PDF. Konieczne byłoby trochę programowania, ale niewiele.

Możesz także zajrzeć na PDFtk , chociaż nie sprawdziłem, czy obsługuje zmianę numeru strony powiązanego z poszczególnymi stronami. Oba są dostępne jako pakiety w Ubuntu.

Loevborg
źródło
1
Hm, PDFtk nie wydaje się być w stanie tego zrobić. pyPdf ma wiele metod wydobywania metadanych, ale wydaje się, że nie jest w stanie zapisać ich z powrotem w dokumencie.
MarkovCh1
0

Jest jeszcze jedna aplikacja o nazwie PDFEdit - hostowana w źródłowej kuźni. Source Project Forge Project Page - Jednak to nie pomaga, ponieważ nie spełnia wymaganej funkcjonalności

Edycja tekstu w PDFEdit

lazyPower
źródło
1
Nie sądzę, że edycja PDF może zmienić numery stron. W każdym razie próbowałem i nie udało mi się.
MarkovCh1
2
@Syzygy - rzeczywiście, właśnie zaznaczone: pdfeditmoże pokazać Catalog/PageLabelsDict, jeśli dokument go zawiera, ale jeśli jest zaznaczony, mówi: „ Ten słownik nie ma żadnych bezpośrednio edytowalnych właściwości ” ... Pozdrawiam!
sdaau