Bagaimana cara mengubah nomor halaman internal dalam meta data PDF?

34

Saya memiliki dokumen pdf yang saya buat melalui cara non-Acrobat (mencetak ke pdf, kemudian menggabungkan banyak pdf), tetapi saya ingin secara manual mengubah nomor halaman (yaitu beberapa halaman pertama hanyalah halaman judul, halaman yang adalah label "halaman 1" adalah benar-benar lembar-7 pdf). Apa cara paling sederhana (dan idealnya, gratis) untuk melakukan ini?

Untuk lebih jelasnya, saya tidak mencoba mengubah angka pada halaman itu sendiri, tetapi nomor halaman dalam "metadata" yang disimpan pdf (halaman itu sendiri sudah diberi nomor dengan benar; saya hanya ingin "pergi ke halaman 1" untuk pergi ke halaman berlabel 1, yang bisa berupa lembaran 7).

Untuk apa nilainya, saya di Windows, meskipun saya memiliki akses ke Mac juga.

YGA
sumber
Saya tidak yakin apakah saya memahami uraian + persyaratan Anda sepenuhnya. Bisakah Anda memberikan tautan ke sampel PDF yang ingin Anda ubah?
Kurt Pfeifle
apakah ada alat baris perintah untuk melakukan itu, misalnya pada file pdf besar tanpa benar-benar membuka file txt?
jj_p
seperti misalnya pdftk?
jj_p

Jawaban:

36

Apa yang Anda inginkan memang disebut label halaman dan dapat dengan mudah ditambahkan langsung dalam kode sumber PDF. Ubah nama ekstensi file dari pdfmenjadi txtdan buka file dalam editor teks (ini bisa lambat, tergantung pada ukuran file, bersabar). Informasi tentang label halaman disimpan dalam simpul yang disebut katalog dokumen yang terlihat seperti ini:

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

Ini mungkin mengandung lebih banyak hal yang membingungkan, tetapi ini adalah struktur dasar. Hanya ada satu katalog, jadi dalam file besar Anda bisa mencari node yang berisi /Catalog. Sekarang Anda dapat membuat perubahan yang diinginkan dengan memasukkan /PageLabelsentri:

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

Ada 3 baris dimulai dengan angka, yang disebut indeks halaman . Halaman 1 memiliki indeks 0, halaman 2 indeks 1dan sebagainya. Mereka selalu menggambarkan rentang, sehingga baris dengan 1 <<...>>berlaku untuk semua halaman dari indeks 1 hingga 5 dan baris dengan 6 <<...>>berlaku untuk semua halaman dari 6 hingga halaman terakhir. Label untuk 0 <<...>>harus selalu ditentukan.

Anda dapat menemukan informasi lebih lanjut tentang label halaman dan kode sumber PDF dalam standar PDF atau dalam wiki pada standar PDF.

Dane Jacob Hampton
sumber
4
Menakjubkan! Ini adalah satu-satunya tempat di web yang saya temukan informasi langsung dan bermanfaat tersebut. Lagipula, kita tidak semua memiliki Acrobat Reader.
Noldorin
3
Dengan contoh /St 8atau /St 2, Anda menetapkan titik awal untuk label yang ditampilkan; tetapi pilih nomor apa saja di tempat 8 (atau 2), yang harus> = 1. Misalnya, 1 << /S /r /St 12 >>akan menomori halaman dari (sebenarnya) 2-6 sebagai (ditampilkan) xii-xvii - karena '12' sesuai dengan 'xii'.
n611x007
1
terima kasih atas jawabannya, tetapi dalam pengalaman saya metode ini kadang-kadang bekerja dan kadang tidak; juga, saya kebetulan menemukan lebih dari satu Katalog: bagaimana Anda menjelaskannya?
jj_p
1
Informasi hebat. Berikut ini tautan ke sumber lain yang bermanfaat: Menentukan penomoran halaman yang konsisten untuk dokumen PDF dari W3C.
Adam Mackler
2
Apakah Anda yakin ini berfungsi seperti ini? Dari melihat konten mentah dari beberapa file PDF, sepertinya beberapa nomor indeks yang menunjuk ke posisi dalam file setelah katalog harus diperbarui jika panjang konten sebelumnya berubah ..
ATAU Mapper
6

Jika saya mengerti Anda secara benar, di sini adalah bagaimana seharusnya bekerja:

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

Namun, saya sepertinya ingat, bahwa ini tidak andal atau sepenuhnya bekerja terakhir kali saya mencoba ini (sekitar 2 tahun yang lalu).

UPDATE: Ingatan saya tidak mengecewakan saya. Saya sekarang mencoba lagi dan mengajukan laporan bug untuk Ghostscript ( bug 691889 ) mengenai hal ini. Ikuti tautan ke laporan bug untuk melihat detailnya.

Kurt Pfeifle
sumber
4

CATATAN 1: Jawaban yang diterima sebagian besar masih benar, tetapi memiliki beberapa celah. Ini kurang dalam banyak file PDF yang tidak dapat langsung diedit sebagai teks. Bahkan ketika ada, pengeditan seperti itu terkadang dapat merusak PDF sehingga tidak dapat dibaca. Salah satu solusi, yang akan berfungsi untuk Unix dan Microsoft Windows adalah qpdf yang dapat menerjemahkan file PDF menjadi "QDF", bentuk teks yang dapat diedit yang masih merupakan file PDF yang valid. The qpdfpaket datang dengan fix-qdfyang kalkulasi ulang offset setelah file QDF telah diedit untuk memperbaiki kerusakan apapun.

CATATAN 2: Tidak nyaman dengan editor teks? Coba gunakan editor GUI seperti jpdftweak terlebih dahulu. Terkadang editor pdf GUI berfungsi, dalam hal ini, yay, Anda selesai. Namun, ketika mereka gagal, seperti yang sering terjadi pada saya, Anda dapat mencoba alternatif yang lebih kuat ini. Either way, tolong jangan turun memilih jawaban saya karena kurang elegan.


BAGAIMANA CARA Edit Nomor Halaman PDF Menggunakan Qpdf

Ringkasan:

  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. test bar.qdf
  5. qpdf bar.qdf bar.pdf

Langkah-langkah terperinci

Langkah 1.

Ubah dokumen menjadi format QDF yang mudah diedit. Jalankan qpdf dari baris perintah seperti ini:

qpdf -qdf foo.pdf foo.qdf

Catatan: Jika Anda belum menginstal qpdf, file executable Microsoft Windows dapat diunduh dari https://github.com/qpdf/qpdf/releases Sistem Unix, seperti Ubuntu dan Debian GNU / Linux dapat menginstalnya dengan mengetikapt install qpdf .

Langkah 2.

Edit dokumen QDF menggunakan editor teks seperti notepad ++, emacs, atau gedit. Cari kata /Catalogdan perhatikan << kurung sudut >> di dalamnya. Di dekatnya, Anda akan menemukan arus /PageLabels( jika ada ).

Kami akan menambahkan setiap bagian yang harus diberi nomor berbeda ke /PageLabels. Formatnya start-page<< style>>. Perhatikan bahwa ruang putih tidak masalah dan bahwa halaman pertama dokumen itu 0. Kecuali ditentukan lain, bagian baru selalu memulai penomoran halaman dari 1.

Contohnya

Berikut ini adalah contoh lengkap bagaimana rupa PageLabels, dengan komentar yang ditambahkan:

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

Jika file tidak memiliki PageLabels, tambahkan setelah /Type /Catalog. Misalnya, orang mungkin berubah,

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

ke,

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

OPSIONAL: MULAI DARI NOMOR YANG BERBEDA DENGAN /St

Setiap bagian memulai kembali penomoran pada 1 kecuali Anda mengatakan sebaliknya menggunakan /St. Perhatikan bagaimana dalam contoh di atas, halaman keempat dimulai pada 15.

OPSIONAL: MENGGUNAKAN GAYA YANG BERBEDA DENGAN /S

The /SOperator membawa argumen yang memungkinkan Anda memilih gaya penomoran,

  • / D digit (1, 2, 3 ...)
  • / R huruf besar Romawi (I, II, III ...)
  • / r huruf kecil Romawi (i, ii, iii ...)
  • / Abjad huruf besar (A, B, C, ...., X, Y, Z, AA, AB, AC, ...)
  • / abjad huruf kecil (a, b, c, ...., x, y, z, aa, ab, ac, ...)

Jika ada yang menghilangkan /Soperator, maka bagian halaman itu tidak akan memiliki penomoran. Sebagai contoh:

0 << >>         % No label for cover

OPSIONAL: MENAMBAH PREFIX UNTUK SETIAP HALAMAN DENGAN /P

Anda dapat menampilkan string teks apa pun sebelum nomor halaman dengan menentukan kata dalam tanda kurung setelah /P:

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

Menentukan awalan tanpa gaya ( /S), akan memberi Anda halaman yang hanya memiliki kata tanpa nomor apa pun. Ini bisa bermanfaat, misalnya, jika Anda ingin halaman sampul cukup memiliki label "Sampul".

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

Langkah 3.

Jalankan fix-qdfuntuk membuat editan Anda menjadi PDF yang valid dan letakkan hasilnya di bar.qdf.

fix-qdf foo.qdf > bar.qdf

Langkah 4.

Buka bar.qdf di program tampilan PDF Anda dan periksa apakah diberi nomor dengan benar.

Langkah 5.

Konversikan file QDF kembali menjadi PDF normal, seperti:

qpdf bar.qdf bar.pdf

Ta da. Kamu sudah selesai. Anda sekarang memiliki dokumen dengan nomor halaman yang diberi label dengan benar di bar.pdf.

hackerb9
sumber
3

jPdf Tweak adalah utilitas grafis Open Source yang memungkinkan Anda mengedit label halaman dalam file PDF. The dokumentasi Halaman memberikan petunjuk langkah-demi-langkah.

CherryBerry
sumber
Saya menggunakan ini untuk menambahkan label halaman khusus saya sebagai format "kosong" dengan teks sebagai awalan. Bekerja dengan baik!
Matt Sephton
Ini adalah jawaban yang jauh lebih baik daripada mengedit teks dengan tangan
endolith
Silakan tambahkan petunjuk langkah demi langkah di sini alih-alih mengandalkan tautan eksternal. Terima kasih!
hackerb9
2

Ada skrip python kecil, yang dapat melakukan pekerjaan: https://github.com/lovasoa/pagelabels-py

Dalam kasus Anda, panggil sesuatu seperti:

./addpagelabels.py --delete file.pdf
./addpagelabels.py --startpage 1 --type 'roman lowercase' file.pdf
./addpagelabels.py --startpage 7 --type arabic file.pdf
DG
sumber
Ini melakukan pekerjaan persis seperti yang saya butuhkan. Terima kasih!
telotortium
1

Untuk menghapus yang lama, mungkin cara lintas platform paling mudah adalah memotong yang lama. Anda dapat melakukannya dengan, misalnya, dengan BRISS.

Menambahkan yang baru menggunakan alat gratis lebih rumit. Secara pribadi saya mungkin akan melakukannya dengan pdflatex, seperti dalam jawaban StackExchange ini , meskipun itu mungkin solusi yang agak terlibat kecuali Anda memiliki kegunaan lain untuk pdflatex.

Saya pikir itu bisa dilakukan, namun dengan jPdfTweak sebagai gantinya.

luar biasa
sumber
1

Metode yang diberikan oleh Dane H. berfungsi dengan Acrobat Reader (atau, tepatnya, versi Adobe Reader saat ini). Satu hal kecil yang perlu diperhatikan: bidang di atas hanya akan menerima 8 karakter sehingga Anda tidak dapat memasukkan sesuatu seperti 'indeks subjek' ke dalamnya jika label tersebut telah digunakan. Tetapi Anda dapat menggunakan item menu Lihat> Navigasi Halaman> Pergi ke ..., atau setara dengan tombol.

Kiat lain: spesifikasi pdf selalu menetapkan nomor halaman secara berurutan, jadi dalam hal dokumen yang dihasilkan oleh pemindaian pasangan halaman, dua set angka keluar dari langkah (kecuali jika Anda susah payah menomori setiap halaman secara individual). Tetapi Anda dapat dengan mudah mengatur dokumen Anda sehingga konvensi 'buka halaman n membawa Anda ke halaman 2n dan 2n +1' 'berlaku.

pengguna308637
sumber
1

Jawaban Denmark adalah yang terbaik, formatnya sedikit berubah sekarang, ini mungkin membantu:

%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
sumber
1

Saya menemukan pengeditan langsung file (seperti yang tidak dikompresi oleh pdftk) tidak berfungsi jika sudah ada '/ judul' yang ditetapkan di wilayah '/ garis besar'. Teknik penyuntingan langsung yang dijelaskan dalam pos di atas ditunjukkan di Youtube: https://www.youtube.com/watch?v=zoH1Z_hSpak

Tetapi fitur 'pembaruan' dari pdftk mungkin lebih intuitif (dan lebih dapat diandalkan ketika '/ judul' sudah ada di wilayah '/ menguraikan' file PDF) melalui mengedit file 'doc_data.txt' yang digunakan di sini: https: / /www.pdflabs.com/blog/export-and-import-pdf-bookmarks/

Bob
sumber
1
Hai @ Bob, jawaban hanya tautan berkualitas rendah. Mereka tidak akan berguna jika situs target bergerak atau menghilang. Harap edit jawaban Anda dan kutip bagian yang relevan dari solusi di sini.
C0deDaedalus
0

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

Anda dapat menambah / menghapus / mengubah skema nomor halaman internal di tab "halaman" alat freeware ini.

Dan berhati-hatilah, penampil PDF xchange tidak menampilkan skema nomor halaman, dan foxitreader memiliki hasil yang benar. Saya belum menguji pembaca Acrobat.

Sulisu
sumber