Jak zmienić wewnętrzne numery stron w metadanych pliku PDF?


37

Mam dokument pdf, który utworzyłem za pomocą programów innych niż Acrobat (drukowanie do pdf, a następnie scalanie kilku plików pdf), ale chciałbym ręcznie zmienić numery stron (tzn. Kilka pierwszych stron to po prostu strony tytułowe, strona, która jest oznaczony jako „strona 1”, tak naprawdę jest to 7. arkusz pdf). Jaki jest najprostszy (a najlepiej bezpłatny) sposób na zrobienie tego?

Żeby było jasne, nie próbuję zmieniać liczb na samych stronach, ale numery stron w „metadanych”, które przechowuje pdf (same strony są już poprawnie ponumerowane; chcę tylko „przejść do strony 1”, aby przejść do strony oznaczonej jako 1, którą może być arkusz 7).

Jeśli chodzi o wartość, korzystam z systemu Windows, ale mam również dostęp do komputerów Mac.


Nie jestem pewien, czy w pełni rozumiem twój opis + wymaganie. Czy możesz podać link do przykładowego pliku PDF, który chcesz zmodyfikować?
Kurt Pfeifle 14.01.11

czy jest do tego narzędzie wiersza poleceń, np. na dużym pliku pdf bez otwierania pliku txt?
jj_p,

jak np. pdftk?
jj_p,

Odpowiedzi:


39

To, czego potrzebujesz, nazywa się etykietami stron i można je łatwo dodać bezpośrednio w kodzie źródłowym pliku PDF. Zmień nazwę rozszerzenia pliku pdfna txti otwórz plik w edytorze tekstu (może to być powolne, w zależności od rozmiaru pliku, bądź cierpliwy). Informacje o etykietach stron są przechowywane w węźle zwanym katalogiem dokumentów, który wygląda mniej więcej tak:

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

Może zawierać więcej mylących elementów, ale jest to podstawowa struktura. Jest tylko jeden katalog, więc w dużym pliku możesz wyszukać węzeł, który zawiera /Catalog. Teraz możesz wprowadzić żądane zmiany, wstawiając /PageLabelswpis:

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

Istnieją 3 wiersze rozpoczynające się od liczb, zwane indeksami stron . Strona 1 ma indeks 0, strona 2 indeks 1i tak dalej. Zawsze opisują zakresy, więc linia z 1 <<...>>odnosi się do wszystkich stron od indeksu 1 do 5, a linia z 6 <<...>>dotyczy wszystkich stron od 6 do ostatniej strony. Etykieta dla 0 <<...>>zawsze musi być zdefiniowana.

Więcej informacji na temat etykiet stron i kodu źródłowego PDF można znaleźć w standardzie PDF lub na wiki o standardach PDF.


4
Cudowny! To jedyne miejsce w sieci, w którym znalazłem takie bezpośrednie i przydatne informacje. W końcu nie wszyscy mamy Acrobat Reader.
Noldorin

3
Na przykład /St 8lub /St 2ustawiasz punkt początkowy wyświetlanej etykiety; ale wybierz dowolną liczbę zamiast 8 (lub 2), która musi być> = 1. Na przykład 1 << /S /r /St 12 >>numeruje strony od (faktycznie) 2-6 jako (wyświetlane) xii-xvii - ponieważ „12” odpowiada „xii”.
n611x007

1
dzięki za odpowiedź, ale z mojego doświadczenia wynika, że ​​ta metoda czasami działa, a czasem nie; również zdarzyło mi się znaleźć więcej niż jeden katalog: jak to wyjaśnić?
jj_p

1
Świetna informacja. Oto link do innego przydatnego źródła: Określanie spójnej numeracji stron dla dokumentów PDF z W3C.
Adam Mackler,

2
Czy jesteś pewien, że tak to działa? Patrząc na surową zawartość niektórych plików PDF, wydawało się, że niektóre numery indeksów wskazujące pozycje w pliku po katalogu będą musiały zostać zaktualizowane, jeśli zmieni się długość poprzedniej zawartości.
LUB Mapper

6

Jeśli dobrze cię rozumiem, oto jak powinno to działać:

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

Jednakże, wydaje się , aby pamiętać, że to nie działa w pełni wiarygodnie lub ostatni raz próbowałem to (około 2 lata temu).

AKTUALIZACJA: Moja pamięć mnie nie zawiodła. Teraz spróbowałem ponownie i zgłosiłem raport o błędzie dotyczący Ghostscript ( błąd 691889 ) dotyczący tego. Kliknij link do raportu o błędzie, aby zobaczyć szczegóły.


5

UWAGA 1: Akceptowana odpowiedź jest nadal w większości poprawna, ale ma pewne luki. Brakuje tego, że wielu plików PDF nie można bezpośrednio edytować jako tekstu. Nawet jeśli tak, taka edycja może czasem uszkodzić plik PDF, uniemożliwiając jego odczytanie. Jednym z rozwiązań, które będzie działać zarówno w systemach Unix, jak i Microsoft Windows, jest qpdf, który może tłumaczyć pliki PDF na „QDF”, edytowalną formę tekstową, która nadal jest poprawnym plikiem PDF. qpdfPakiet jest wyposażony fix-qdfże przelicza przesunięcia po pliku QDF został stworzony w celu skorygowania żadnych szkód.

UWAGA 2: Niewygodne z edytorami tekstu? Najpierw spróbuj użyć edytora GUI, takiego jak jpdftweak . Czasami działają edytory GUI pdf, w takim przypadku tak, gotowe. Jednak gdy zawiodą, jak to często bywało dla mnie, możesz wypróbować tę bardziej niezawodną alternatywę. Tak czy inaczej, proszę nie głosować w dół moją odpowiedzią za bycie mniej niż eleganckim.


JAK Edytować numery stron PDF za pomocą Qpdf

Podsumowanie:

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

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

Szczegółowe kroki

Krok 1.

Konwertuj dokument do łatwo edytowalnego formatu QDF. Uruchom qpdf z wiersza poleceń tak:

qpdf -qdf foo.pdf foo.qdf

Uwaga: Jeśli nie masz jeszcze zainstalowanego qpdf, pliki wykonywalne Microsoft Windows można pobrać ze strony https://github.com/qpdf/qpdf/releases Systemy Unix, takie jak Ubuntu i Debian GNU / Linux, można zainstalować, piszącapt install qpdf .

Krok 2.

Edytuj dokument QDF za pomocą edytora tekstu, takiego jak notepad ++, emacs lub gedit. Wyszukaj słowo /Catalogi zwróć uwagę na << nawiasy kątowe >>, które są w środku. W pobliżu znajdziesz bieżący /PageLabels( jeśli istnieje ).

Dodamy każdą sekcję, która powinna być inaczej numerowana do /PageLabels. Format to start-page<< style>>. Zwróć uwagę, że białe znaki nie mają znaczenia i że pierwsza strona dokumentu to 0. O ile nie określono inaczej, nowa sekcja zawsze rozpoczyna numerowanie stron od 1.

Przykłady

Oto pełny przykład tego, jak mogą wyglądać etykiety stron z dodanymi komentarzami:

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

Jeśli plik nie ma etykiet PageLab, dodaj je później /Type /Catalog. Na przykład można się zmienić,

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

w,

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

OPCJONALNIE: ROZPOCZĘCIE OD INNEGO NUMERU /St

Każda sekcja ponownie rozpoczyna numerację od 1, chyba że zostanie to inaczej określone za pomocą /St. Zauważ, jak w powyższym przykładzie czwarta strona zaczyna się od 15.

OPCJONALNIE: ZA POMOCĄ INNEGO STYLU /S

/SOperator pobiera argument, który pozwala wybrać styl numeracji,

  • / D cyfry (1, 2, 3 ...)
  • / R wielkie litery Roman (I, II, III ...)
  • / r małe litery Roman (i, ii, iii ...)
  • / Wielkie litery alfabetu (A, B, C, ...., X, Y, Z, AA, AB, AC, ...)
  • / małe litery alfabetu (a, b, c, ...., x, y, z, aa, ab, ac, ...)

Jeśli pominiemy /Soperatora, wówczas ta sekcja stron nie będzie miała numeracji. Na przykład:

0 << >>         % No label for cover

OPCJONALNIE: DODAWANIE PREFIKSU DO KAŻDEJ STRONY /P

Możesz wyświetlić dowolny ciąg tekstu przed numerem strony, określając słowo w nawiasach po /P:

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

Podanie prefiksu bez stylu ( /S) da strony, które zawierają tylko słowo bez żadnej liczby. Może to być przydatne, na przykład, jeśli chcesz, aby strona tytułowa miała po prostu etykietę „Okładka”.

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

Krok 3.

Uruchom, fix-qdfaby dokonać poprawnych zmian w pliku PDF i umieścić wynik w bar.qdf.

fix-qdf foo.qdf > bar.qdf

Krok 4.

Otwórz plik bar.qdf w programie do przeglądania plików PDF i sprawdź, czy jest poprawnie ponumerowany.

Krok 5.

Konwertuj plik QDF z powrotem na normalny plik PDF, na przykład:

qpdf bar.qdf bar.pdf

Ta da. Jesteś skończony. Masz teraz dokument z poprawnie oznaczonymi numerami stron w bar.pdf.


4

Jest mały skrypt python, 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 7 --type arabic file.pdf

Wykonało to pracę dokładnie tak, jak potrzebowałem. Dzięki!
telotortium

3

jPdf Tweak to graficzne narzędzie Open Source, które pozwala edytować etykiety stron w plikach PDF. Strona dokumentacji zawiera instrukcje krok po kroku.


Użyłem tego, aby dodać niestandardowe etykiety stron jako „pusty” format z tekstem jako prefiksem. Działało dobrze!
Matt Sephton,

To zdecydowanie lepsza odpowiedź niż ręczne edytowanie tekstu
endolith

Dodaj instrukcje krok po kroku, zamiast polegać na zewnętrznym łączu. Dzięki!
hackerb9

1

Aby usunąć stare, prawdopodobnie najłatwiejszym sposobem na wiele platform jest po prostu przycięcie starych. Możesz to zrobić na przykład za pomocą BRISS.

Dodanie nowych przy użyciu bezpłatnych narzędzi jest trudniejsze. Osobiście prawdopodobnie zrobiłbym to z pdflatex, tak jak w tej odpowiedzi StackExchange , choć może to być dość skomplikowane rozwiązanie, chyba że masz inne zastosowania dla pdflatex.

Myślę, że można to zrobić, ale zamiast tego za pomocą jPdfTweak .


1

Metoda podana przez Dane H. działa z programem Acrobat Reader (a ściślej mówiąc z bieżącą wersją programu Adobe Reader). Należy wspomnieć o jednym drobnym: pole u góry akceptuje tylko 8 znaków, więc nie można wprowadzić do niego czegoś takiego jak „indeks tematyczny”, jeśli taka etykieta została użyta. Możesz jednak zamiast tego użyć pozycji menu Widok> Nawigacja strony> Idź do ... lub równoważnego klawisza.

Kolejna wskazówka: specyfikacja pdf zawsze przypisuje numery stron kolejno, więc w przypadku dokumentu utworzonego przez skanowanie par stron dwa zestawy liczb wypadają poza krok (chyba że pracochłonne numerowanie każdej strony indywidualnie). Ale możesz bez wysiłku skonfigurować swój dokument, aby konwencja „przejdź do strony n prowadziła do stron 2n i 2n + 1”.


1

Odpowiedź Duńczyków jest najlepsza, formaty nieco się zmieniły, może to być pomocne:

%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

1

Odkryłem, że bezpośrednia edycja pliku (jako nieskompresowana przez pdftk) nie działa, jeśli w regionie „/ kontury” są już ustawione „/ titles”. Technikę bezpośredniej edycji opisaną w powyższym poście pokazano na YouTube: https://www.youtube.com/watch?v=zoH1Z_hSpak

Ale funkcja „aktualizacji” programu pdftk może być bardziej intuicyjna (i bardziej niezawodna, gdy „/ tytuły” już istnieją w regionie „/ kontury” pliku PDF) poprzez edycję pliku „doc_data.txt” użytego tutaj: https: / /www.pdflabs.com/blog/export-and-import-pdf-bookmarks/


1
Cześć @Bob, odpowiedzi tylko do łącza są niskiej jakości. Będą bezużyteczne, jeśli docelowa strona się poruszy lub zniknie. Edytuj swoją odpowiedź i podaj tutaj odpowiednią część rozwiązania.
C0deDaedalus

0

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

Możesz dodać / usunąć / zmienić wewnętrzny schemat numerów stron w zakładce „strony” tego darmowego narzędzia.

I bądź ostrożny, przeglądarka plików PDF xchange nie pokazuje schematu numerów stron, a foxitreader ma właściwy wynik. Nie testowałem czytnika Acrobat.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.