Bir PDF'nin meta verilerinde dahili sayfa numaraları nasıl değiştirilir?


37

Acrobat olmayan araçlarla oluşturduğum bir pdf belgesine sahibim (pdf'e yazdırdıktan sonra bir sürü pdfs'i birleştirerek), ancak sayfa numaralarını el ile değiştirmek istiyorum (örneğin, ilk birkaç sayfa yalnızca başlık sayfalarıdır, sayfa olduğu etiketli "sayfa 1") pdf 7. levha gerçekten. Bunu yapmanın en basit (ve ideal olarak ücretsiz) yolu nedir?

Açıkçası, sayfaların üzerindeki sayıları değiştirmeye çalışmıyorum, pdf'nin depoladığı "meta verilerdeki" sayfa numaraları (sayfaların kendileri zaten doğru şekilde numaralandırılmış; yalnızca "sayfa 1'e git" i istiyorum. etiketli sayfa 1, sayfa 7 olabilir.

Buna değer, ben de Windows'um, ancak Mac'lere de erişebiliyorum.


Tanımınızı ve gereksinimlerinizi tam olarak anladığımdan emin değilim. Değiştirmek istediğiniz örnek bir PDF'ye link verebilir misiniz?
Kurt Pfeifle

Bunu yapmak için bir komut satırı aracı var, örneğin aslında txt dosyasını açmadan büyük bir pdf dosyasında?
jj_p 20:13

örneğin pdftk gibi mi?
jj_p

Yanıtlar:


39

İstediğiniz aslında sayfa etiketleri olarak adlandırılır ve doğrudan PDF'nin kaynak koduna doğrudan eklenebilir. Dosya uzantısını yeniden adlandırma pdfiçin txtve bir metin editörü dosyası (bu sabırlı olun, dosya boyutuna bağlı olarak, yavaş olabilir) açın. Sayfa etiketleriyle ilgili bilgiler, şuna benzer bir şekilde belge kataloğu adı verilen bir düğümde depolanır :

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

Kafa karıştırıcı şeyler içerebilir, ancak temel yapı budur. Sadece bir katalog var, böylece büyük bir dosyada içerilen düğümü arayabilirsiniz /Catalog. Şimdi /PageLabelsgirişi ekleyerek istediğiniz değişiklikleri yapabilirsiniz :

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

Sayfa indeksleri adı verilen ve sayılarla başlayan 3 satır vardır . Sayfa 1, dizin 0, sayfa 2, dizin 1vb. Her zaman aralıkları tanımlarlar; bu nedenle, satır 1 <<...>>1 ile 5 arasındaki tüm sayfalara ve satır 6 <<...>>6 ile son sayfaya kadar olan tüm sayfalara uygulanır. Her 0 <<...>>zaman için bir etiket tanımlanmalıdır.

Sayfa etiketleri ve PDF kaynak kodu hakkında daha fazla bilgiyi PDF standardında veya wiki'de PDF standartlarında bulabilirsiniz.


4
Muhteşem! Bu web üzerinde doğrudan ve faydalı bilgiler bulduğum tek yer burası. Biz yok hepsi sonuçta Acrobat Reader gerekir.
Noldorin

3
Örneğin /St 8veya /St 2, görüntülenen etiket için bir başlangıç ​​noktası belirlersiniz; ancak 8 (veya 2) yerine,> = 1 olması gereken herhangi bir sayıyı seçin. Örneğin, 1 << /S /r /St 12 >>(aslında) 2-6 arasında (gösterilen) xii-xvii'den sayfaları numaralandırır - çünkü '12', 'xii' değerine karşılık gelir.
n611x007

1
Cevabınız için teşekkürler, ama benim tecrübeme göre bu yöntem bazen işe yarar ve bazen işe yaramaz; ayrıca birden fazla katalog buldum: Bunu nasıl açıklarsınız?
jj_p

1
Harika bilgi İşte başka bir faydalı kaynağa bir link: W3C'den PDF dokümanları için tutarlı sayfa numaralandırması belirtme .
Adam Mackler

2
Bunun böyle çalıştığından emin misin? Bazı PDF dosyalarının işlenmemiş içeriğine bakıldığında, önceki içeriğin uzunluğu değişirse, katalogdan sonra dosyadaki konumlara işaret eden bazı dizin sayıları gibi görünüyordu ..
VEYA Eşleştiricisi

6

Seni doğru anlıyorsam, işte nasıl çalışması gerektiği :

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

Ancak, ben görünüyor bu güvenilir veya tamamen (önce 2 yıl kadar) Bunu denedim son kez işe yaptım, hatırlamak.

GÜNCELLEME: Hafızam başarısız oldu. Şimdi tekrar denedim ve bununla ilgili Ghostscript ( bug 691889 ) için bir hata raporu hazırladım . Ayrıntıları görmek için hata raporunun bağlantısını izleyin.


5

NOT 1: Kabul edilen cevap hala çoğunlukla doğrudur, ancak bazı boşluklar vardır. Birçok PDF dosyasının doğrudan metin olarak düzenlenememesi nedeniyle eksik. Böyle bir düzenleme bile olsa, PDF'yi bazen okunamaz hale getirerek zarar verebilir. Hem Unix hem de Microsoft Windows için işe yarayacak bir çözüm, PDF dosyalarını hala geçerli bir PDF dosyası olan metin düzenlenebilir bir form olan " QDF " ye çevirebilen qpdf'dir . qpdfPaket ile birlikte gelen fix-qdfbir QDF dosyadan sonraki yeniden hesaplar uzaklıklar herhangi bir zarar düzeltmek için düzenlendi söyledi.

NOT 2: Metin editörlerinden rahatsız mı oldunuz? Önce jpdftweak gibi bir GUI editörü kullanmayı deneyin . Bazen GUI pdf editörleri çalışır, bu durumda, yay, bitirdiniz. Ancak, başarısız olduklarında, çoğu zaman olduğu gibi, bu daha güçlü alternatifi deneyebilirsiniz. Her iki durumda da, lütfen cevaplarımın zarif olmadıklarından dolayı oy kullanmayın.


Qpdf Kullanarak PDF Sayfa Numaralarını Düzenleme NASIL

Özet:

  1. qpdf -qdf foo.pdf foo.qdf
  2. düzenle 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 çubuğu.qdf
  5. qpdf bar.qdf bar.pdf

Detaylı adımlar

Aşama 1.

Belgeyi kolayca düzenlenebilir QDF formatına dönüştürün. Qpdf komutunu komut satırından şöyle çalıştırın:

qpdf -qdf foo.pdf foo.qdf

Not: Eğer önceden qpdf kurulu değilse, Microsoft Windows çalıştırılabilir dosyaları https://github.com/qpdf/qpdf/releases adresinden indirilebilir. Ubuntu ve Debian GNU / Linux gibi Unix sistemlerini yazarak yükleyebilirsinizapt install qpdf .

Adım 2.

QDF belgesini notepad ++, emacs veya gedit gibi bir metin düzenleyici kullanarak düzenleyin. Sözcüğü arayın /Catalogve içindeki << açılı ayraçları >> not edin. Yakınlarda, mevcut olanı /PageLabels( varsa ) bulacaksınız .

Farklı şekilde numaralandırılması gereken her bölümü ekleyeceğiz /PageLabels. Format start-page<< style>>. Beyaz alanın önemli olmadığını ve belgenin ilk sayfasının olduğunu unutmayın 0. Aksi belirtilmedikçe, yeni bir bölüm her zaman 1'den başlayan sayfaları numaralandırmaya başlar.

Örnekler

Yorum eklenmiş olarak PageLabels'in neye benzeyebileceğinin tam bir örneği:

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

Dosyada PageLabels yoksa, sonradan ekleyin /Type /Catalog. Örneğin, biri değişebilir,

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

içine

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

OPSİYONEL: FARKLI BİR SAYDAN İLE BAŞLATMA /St

Aksi takdirde kullanmadığınız sürece her bölüm 1 numaralandırmayı yeniden başlatır /St. Yukarıdaki örnekte dördüncü sayfanın 15'de nasıl başladığına dikkat edin.

İSTEĞE BAĞLI: FARKLI BİR TARZ KULLANIMI /S

/SOperatör, numaralandırma stili seçmek sağlayan bir argüman alır

  • / D basamakları (1, 2, 3 ...)
  • / R büyük harf Roman (I, II, III ...)
  • / r küçük harf Roman (i, ii, iii ...)
  • / Alfabetik bir büyük harf (A, B, C, ...., X, Y, Z, AA, AB, AC, ...)
  • / küçük harf alfabetik (a, b, c, ...., x, y, z, aa, ab, ac, ...)

Biri /Soperatörü ihmal ederse , o zaman sayfaların bu bölümünde numaralandırma olmaz. Örneğin:

0 << >>         % No label for cover

İSTEĞE BAĞLI: İLE HER SAYFAYA PREFIX EKLEME /P

Sonra parantez içinde bir kelime belirterek sayfa numarasından önce herhangi bir metin dizesini gösterebilirsiniz /P:

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

Bir stile ( /S) sahip olmayan bir önek belirtmek , size yalnızca kelimesi olmayan, yalnızca kelimesi olan sayfaları verecektir. Bu, örneğin bir kapak sayfasının "Kapak" etiketini içermesini istiyorsanız, yararlı olabilir.

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

Aşama 3.

Run fix-qdfdüzenlemelerinizi geçerli PDF yapabilir ve bar.qdf çıktı koymak.

fix-qdf foo.qdf > bar.qdf

4. adım

PDF görüntüleme programınızda bar.qdf dosyasını açın ve doğru numaralandırıldığından emin olun.

Adım 5.

QDF dosyasını tekrar normal bir PDF'ye dönüştürün, şöyle:

qpdf bar.qdf bar.pdf

Ta da Sen bittin. Artık bar.pdf’de doğru şekilde etiketlenmiş sayfa numaralarına sahip bir belgeniz var.


4

İşi yapabilen küçük bir python betiği var: https://github.com/lovasoa/pagelabels-py

Senin durumunda böyle bir şey arayın:

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

Bu işi tam olarak ihtiyacım olduğu gibi yaptı. Teşekkürler!
telotortium

3

jPdf Tweak , PDF dosyalarındaki sayfa etiketlerini düzenlemenizi sağlayan bir Açık Kaynak grafik yardımcı programdır. Dokümantasyon sayfa adım adım talimatlar verilmektedir.


Özel sayfa etiketlerimi metin olarak önek olarak "boş" biçiminde eklemek için bunu kullandım. İyi çalıştı!
Matt Sephton

Bu elle metin düzenleme işleri daha iyi bir cevaptır
endolith

Lütfen harici bir bağlantıya güvenmek yerine adım adım talimatları ekleyin. Teşekkürler!
hackerb9

1

Eskileri çıkarmak için, muhtemelen en kolay çapraz platform yolu sadece eskileri kesmektir. Bunu BRISS ile yapabilirsiniz.

Ücretsiz araçlar kullanarak yenilerini eklemek daha zordur. Şahsen ben muhtemelen olduğu gibi pdflatex yapardım bu Stack Exchange cevap size pdflatex diğer kullanımları vardır sürece oldukça dahil çözüm olabileceğini ifade.

Ancak bunun yerine jPdfTweak ile yapılabileceğini düşünüyorum .


1

Dane H. tarafından verilen yöntem Acrobat Reader (ya da tam olarak Adobe Reader'ın güncel hali ) ile çalışır. Dikkat edilmesi gereken küçük bir nokta: En üstteki alan sadece 8 karakter kabul eder, böylelikle eğer böyle bir etiket kullanılmışsa içine 'konu dizini' gibi bir şey giremezsiniz. Ancak bunun yerine Görünüm> Sayfa Gezinme> Git ... menü öğesini veya anahtar eşdeğerini kullanabilirsiniz.

Başka bir ipucu: pdf özelliği her zaman arka arkaya sayfa numaralarını atar, bu nedenle sayfa çiftleri taranarak üretilen bir belge söz konusu olduğunda , iki sayı kümesi adımdan çıkar (her sayfayı tek tek zahmetle numaralandırmadığınız sürece). Ancak, belgenizi çok az çaba sarf ederek, '' n numaralı sayfaya git ve 2n ve 1n numaralı sayfalara götürür '' sözleşmesinin geçerli olacağı şekilde yapabilirsiniz.


1

Danimarkalıların cevapları en iyisidir, formatlar şimdi biraz değişti, bu yardımcı olabilir:

%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

Dosyanın doğrudan (pdftk tarafından sıkıştırılmamış) düzenlenmesini, '/ outlines' bölgesinde önceden ayarlanmış '/ başlıklar' varsa çalışmamasını buldum. Yukarıdaki bir yayında açıklanan doğrudan düzenleme tekniği Youtube'da gösterilmiştir: https://www.youtube.com/watch?v=zoH1Z_hSpak

Ancak, pdftk'in 'update' özelliği, burada kullanılan 'doc_data.txt' dosyasını düzenleyerek daha sezgisel olabilir (ve PDF dosyasının '/ anahatları' bölgesinde zaten '/ başlıklar' varken) daha güvenilir olabilir: https: / /www.pdflabs.com/blog/export-and-import-pdf-bookmarks/


1
Merhaba @Bob, Sadece Link cevapları düşük kalitededir. Hedef site hareket ederse veya kaybolursa, işe yaramazlar. Lütfen cevabınızı düzenleyin ve çözümün ilgili bölümünü burada belirtin.
C0deDaedalus

0

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

Bu ücretsiz aracın "sayfalar" sekmesinde dahili sayfa numaraları düzenini ekleyebilir / kaldırabilir / değiştirebilirsiniz.

Dikkatli olun, PDF xchange görüntüleyicisi sayfa numarası düzenini göstermiyor ve foxitreader'ın doğru bir sonucu var. Acrobat okuyucuyu test etmedim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.