จะเปลี่ยนหมายเลขหน้าภายในในข้อมูลเมตาของ PDF ได้อย่างไร


37

ฉันมีเอกสาร PDF ที่ฉันสร้างขึ้นด้วยวิธีที่ไม่ใช้ Acrobat (การพิมพ์เป็น pdf จากนั้นจึงรวมไฟล์ PDF เป็นกลุ่ม) แต่ฉันต้องการเปลี่ยนหมายเลขหน้าด้วยตนเอง (เช่นหน้าแรก ๆ หลายหน้าเป็นหน้าชื่อเรื่องหน้าเว็บที่ มีข้อความกำกับว่า "หน้า 1" คือแผ่นงานที่ 7 ของ pdf) อะไรคือวิธีที่ง่ายที่สุด (และดีเลิศ, ฟรี) ในการทำสิ่งนี้?

เพื่อความชัดเจนฉันไม่ได้พยายามเปลี่ยนตัวเลขในหน้าเว็บด้วยตัวเอง แต่เป็นหมายเลขหน้าใน "ข้อมูลเมตา" ที่ร้านค้า pdf (หน้าตัวเองได้รับหมายเลขอย่างถูกต้องแล้วฉันแค่ต้องการ "ไปที่หน้า 1" เพื่อไป ไปยังหน้าที่ระบุว่า 1 ซึ่งอาจเป็นแผ่น 7)

สำหรับสิ่งที่คุ้มค่าฉันอยู่บน Windows แม้ว่าฉันจะสามารถเข้าถึง Mac ได้เช่นกัน


ฉันไม่แน่ใจว่าฉันเข้าใจคำอธิบายของคุณ + ความต้องการอย่างเต็มที่ คุณสามารถให้ลิงค์ไปยังตัวอย่าง PDF ที่คุณต้องการแก้ไขได้หรือไม่?
Kurt Pfeifle

มีเครื่องมือบรรทัดคำสั่งที่จะทำเช่นในไฟล์ PDF ขนาดใหญ่โดยไม่ต้องเปิดไฟล์ txt จริงหรือไม่
jj_p

เช่น pdftk เช่น?
jj_p

คำตอบ:


39

สิ่งที่คุณต้องการนั้นเรียกว่าป้ายกำกับเพจและสามารถเพิ่มได้อย่างง่ายดายในซอร์สโค้ดของ PDF เปลี่ยนชื่อนามสกุลไฟล์จากpdfเป็นtxtและเปิดไฟล์ในเท็กซ์เอดิเตอร์ (ซึ่งอาจช้าได้ขึ้นอยู่กับขนาดไฟล์ของผู้ป่วย) ข้อมูลเกี่ยวกับเลเบลหน้าถูกเก็บไว้ในโหนดที่เรียกว่าแค็ตตาล็อกเอกสารซึ่งมีลักษณะดังนี้:

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

มันอาจมีสิ่งที่สับสนมากกว่า แต่นี่คือโครงสร้างพื้นฐาน /Catalogมีเพียงคนเดียวดังนั้นในแคตตาล็อกไฟล์ขนาดใหญ่คุณสามารถค้นหาโหนดที่มีคือ ตอนนี้คุณสามารถทำการเปลี่ยนแปลงที่คุณต้องการโดยการแทรก/PageLabelsรายการ:

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

มี 3 สายที่เริ่มต้นด้วยตัวเลขที่เรียกว่าเป็นดัชนีหน้า หน้า 1 มีดัชนี0หน้า 2 ดัชนี1และอื่น ๆ พวกเขามักจะอธิบายช่วงดังนั้นบรรทัดที่1 <<...>>ใช้กับทุกหน้าจากดัชนี 1 ถึง 5 และบรรทัดที่6 <<...>>ใช้กับทุกหน้าตั้งแต่ 6 ถึงหน้าสุดท้าย 0 <<...>>ต้องกำหนดป้ายกำกับสำหรับเสมอ

คุณสามารถค้นหาข้อมูลเพิ่มเติมเกี่ยวกับป้ายกำกับหน้าและรหัสต้นฉบับ PDF ในมาตรฐาน PDFหรือในวิกิบนมาตรฐาน PDF


4
มหัศจรรย์! นี่เป็นที่เดียวในเว็บที่ฉันพบข้อมูลที่เป็นประโยชน์และตรงไปตรงมา เราไม่ได้ทั้งหมดมีโปรแกรม Acrobat Reader หลังจากทั้งหมด
Noldorin

3
ด้วยตัวอย่าง/St 8หรือ/St 2คุณตั้งค่าจุดเริ่มต้นสำหรับป้ายกำกับที่แสดง แต่เลือกหมายเลขใด ๆ แทน 8 (หรือ 2) ซึ่งจะต้อง> = 1 ตัวอย่างเช่น1 << /S /r /St 12 >>หมายเลขหน้าจาก (จริง ๆ ) 2-6เป็น (แสดง) xii-xvii - เพราะ '12' สอดคล้องกับ 'xii'
n611x007

1
ขอบคุณสำหรับคำตอบ แต่ในประสบการณ์ของฉันบางครั้งวิธีนี้ใช้งานได้และบางครั้งก็ไม่ได้ ฉันได้พบมากกว่าหนึ่งแคตตาล็อก: คุณอธิบายได้อย่างไร
jj_p

1
ข้อมูลที่ดี นี่คือลิงค์ไปยังแหล่งข้อมูลที่มีประโยชน์อื่น: การระบุหมายเลขหน้าที่สอดคล้องกันสำหรับเอกสาร PDFจาก W3C
Adam Mackler

2
คุณแน่ใจหรือว่าทำงานเช่นนี้? จากการดูเนื้อหาดิบของไฟล์ PDF บางไฟล์ดูเหมือนว่าหมายเลขดัชนีบางตัวที่ชี้ไปที่ตำแหน่งในไฟล์หลังจากแค็ตตาล็อกจะต้องได้รับการอัปเดตหากความยาวของเนื้อหาก่อนหน้าเปลี่ยนไป ..
หรือ Mapper

6

ถ้าผมเข้าใจคุณอย่างถูกต้องและนี่คือวิธีการที่มันควรทำงาน:

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

อย่างไรก็ตามฉันดูเหมือนจะจำได้ว่าสิ่งนี้ไม่น่าเชื่อถือหรือทำงานได้อย่างเต็มที่ในครั้งสุดท้ายที่ฉันลอง (ประมาณ 2 ปีที่แล้ว)

UPDATE:ความทรงจำของฉันไม่ได้ทำให้ฉันผิดหวัง ตอนนี้ฉันลองอีกครั้งและยื่นรายงานข้อผิดพลาดสำหรับ Ghostscript ( ข้อผิดพลาด 691889 )เกี่ยวกับเรื่องนี้ ตามลิงค์ไปยังรายงานข้อผิดพลาดเพื่อดูรายละเอียด


5

หมายเหตุ 1: คำตอบที่ยอมรับนั้นส่วนใหญ่ยังคงถูกต้อง แต่มีช่องว่างบางส่วน มันขาดไฟล์ PDF จำนวนมากที่ไม่สามารถแก้ไขเป็นข้อความได้โดยตรง แม้ว่าจะเป็นเช่นนั้นการแก้ไขดังกล่าวอาจทำให้ PDF เสียหายไม่สามารถอ่านได้ ทางออกหนึ่งที่สามารถใช้ได้กับทั้ง Unix และ Microsoft Windows คือqpdfซึ่งสามารถแปลไฟล์ PDF เป็น "QDF" ซึ่งเป็นรูปแบบที่สามารถแก้ไขข้อความซึ่งยังคงเป็นไฟล์ PDF ที่ถูกต้อง qpdfแพคเกจมาพร้อมกับfix-qdfที่คำนวณชดเชยหลังจากที่ไฟล์ QDF ได้รับการแก้ไขเพื่อแก้ไขความเสียหายใด ๆ

หมายเหตุ 2: อึดอัดกับโปรแกรมแก้ไขข้อความ? ลองใช้โปรแกรมแก้ไข GUI เช่นjpdftweakก่อน บางครั้งโปรแกรมแก้ไขไฟล์ PDF GUI ก็ทำงานได้แล้ว อย่างไรก็ตามเมื่อพวกเขาล้มเหลวอย่างที่เคยเป็นมาสำหรับฉันคุณสามารถลองทางเลือกที่แข็งแกร่งกว่านี้ ไม่ว่าจะด้วยวิธีใดโปรดอย่าลงคะแนนสำหรับคำตอบของฉันเพราะสง่างาม


วิธีแก้ไขหมายเลขหน้า PDF โดยใช้ Qpdf

สรุป:

  1. qpdf -qdf foo.pdf foo.qdf
  2. แก้ไข 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

ขั้นตอนโดยละเอียด

ขั้นตอนที่ 1.

แปลงเอกสารเป็นรูปแบบ QDF ที่แก้ไขได้ง่าย เรียกใช้ qpdf จากบรรทัดคำสั่งดังนี้:

qpdf -qdf foo.pdf foo.qdf

หมายเหตุ: หากคุณไม่ได้ qpdf ติดตั้งแล้ว executables Microsoft Windows สามารถดาวน์โหลดได้จากhttps://github.com/qpdf/qpdf/releasesระบบ Unix เช่น Ubuntu และ Debian GNU / Linux apt install qpdfสามารถติดตั้งได้โดยการพิมพ์

ขั้นตอนที่ 2.

แก้ไขเอกสาร QDF โดยใช้โปรแกรมแก้ไขข้อความเช่น notepad ++, emacs หรือ gedit ค้นหาคำ/Catalogและสังเกต << วงเล็บเหลี่ยมมุม >> อยู่ข้างใน ใกล้เคียงคุณจะพบปัจจุบัน/PageLabels( ถ้ามี )

/PageLabelsเราจะเพิ่มแต่ละส่วนที่ควรจะเป็นเลขที่แตกต่างกันไป รูปแบบคือstart-page<< style>> 0โปรดทราบว่าพื้นที่สีขาวไม่สำคัญและที่หน้าแรกของเอกสาร เว้นแต่จะระบุไว้เป็นอย่างอื่นส่วนใหม่จะเริ่มนับหน้าจาก 1 เสมอ

ตัวอย่าง

นี่คือตัวอย่างเต็มรูปแบบของสิ่งที่ PageLabels อาจมีลักษณะด้วยความคิดเห็นที่เพิ่ม:

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

หากไฟล์ไม่มี PageLabels ให้เพิ่มหลังจาก/Type /Catalogนั้น ตัวอย่างเช่นอาจมีการเปลี่ยนแปลง

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

เข้า

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

ตัวเลือก: เริ่มจากจำนวนที่แตกต่างกันด้วย /St

แต่ละส่วนเตะเลขที่ 1 /Stจนกว่าคุณจะบอกว่ามันเป็นอย่างอื่นใช้ สังเกตว่าในตัวอย่างด้านบนหน้าสี่เริ่มต้นที่ 15

ทางเลือก: การใช้รูปแบบที่แตกต่างด้วย /S

/Sผู้ประกอบการจะใช้เวลาโต้แย้งที่ช่วยให้คุณสามารถเลือกรูปแบบเลขที่

  • / ตัวเลข D (1, 2, 3 ... )
  • / R ตัวพิมพ์ใหญ่ Roman (I, II, III ... )
  • / r ตัวพิมพ์เล็ก Roman (i, ii, iii ... )
  • / A ตัวอักษรตัวพิมพ์ใหญ่ (A, B, C, .... , X, Y, Z, AA, AB, AC, ... )
  • / a ตัวอักษรพิมพ์เล็ก (a, b, c, .... , x, y, z, aa, ab, ac, ... )

หากไม่มี/Sผู้ดำเนินการส่วนของหน้านั้นจะไม่มีหมายเลข ตัวอย่างเช่น:

0 << >>         % No label for cover

ทางเลือก: การเพิ่มคำนำหน้าในแต่ละหน้าด้วย /P

คุณสามารถแสดงสตริงข้อความใด ๆ ก่อนหมายเลขหน้าโดยระบุคำในวงเล็บหลัง/P:

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

การระบุคำนำหน้าโดยไม่มีสไตล์ ( /S) จะให้หน้าเว็บที่มีเพียงคำที่ไม่มีตัวเลขใด ๆ สิ่งนี้มีประโยชน์เช่นหากคุณต้องการให้ใบปะหน้ามีเพียงป้ายกำกับ "ใบปะหน้า"

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

ขั้นตอนที่ 3

เรียกใช้fix-qdfเพื่อให้การแก้ไข PDF ของคุณถูกต้องและใส่ผลลัพธ์ใน bar.qdf

fix-qdf foo.qdf > bar.qdf

ขั้นตอนที่ 4

เปิด bar.qdf ในโปรแกรมดู PDF ของคุณและตรวจสอบว่ามีหมายเลขถูกต้องหรือไม่

ขั้นตอนที่ 5

แปลงไฟล์ QDF กลับเป็น PDF ปกติเช่น:

qpdf bar.qdf bar.pdf

ทาดา คุณทำเสร็จแล้ว ตอนนี้คุณมีเอกสารที่มีหมายเลขหน้ากำกับอย่างถูกต้องใน bar.pdf


4

มีสคริปต์ python เล็กน้อยที่สามารถทำงานได้: https://github.com/lovasoa/pagelabels-py

ในกรณีของคุณโทรหาสิ่งที่ชอบ:

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

มันทำงานได้อย่างที่ฉันต้องการ ขอบคุณ!
telotortium

3

jPdf Tweakเป็นยูทิลิตี้กราฟิกแบบ Open Source ที่ให้คุณแก้ไขป้ายกำกับเพจในไฟล์ PDF เอกสารหน้าให้คำแนะนำทีละขั้นตอน


ฉันใช้สิ่งนี้เพื่อเพิ่มป้ายกำกับเพจที่กำหนดเองเป็นรูปแบบ "ว่างเปล่า" พร้อมข้อความเป็นคำนำหน้า ทำงานได้ดี!
Matt Sephton

นี่เป็นคำตอบที่ดีกว่าการแก้ไขข้อความด้วยมือ
endolith

โปรดเพิ่มคำแนะนำทีละขั้นตอนที่นี่แทนการใช้ลิงก์ภายนอก ขอบคุณ!
hackerb9

1

สำหรับการลบสิ่งเก่าอาจเป็นวิธีข้ามแพลตฟอร์มที่ง่ายที่สุดคือการตัดสิ่งเก่าออก คุณสามารถทำสิ่งนี้กับBRISS

การเพิ่มเครื่องมือใหม่โดยใช้เครื่องมือฟรีนั้นยุ่งยากกว่า โดยส่วนตัวฉันอาจทำกับ pdflatex เช่นเดียวกับในคำตอบ StackExchange นี้แม้ว่าอาจเป็นโซลูชันที่เกี่ยวข้องมากกว่าเว้นแต่คุณจะมีการใช้งานอื่นสำหรับ pdflatex

ฉันคิดว่ามันสามารถทำได้ แต่ด้วยjPdfTweakแทน


1

วิธีการที่กำหนดโดย Dane H. ทำงานร่วมกับ Acrobat Reader (หรือเพื่อความแม่นยำในเวอร์ชันปัจจุบันของAdobe Reader) จุดเล็ก ๆ ที่ควรทราบ: ฟิลด์ที่ด้านบนจะรับได้เพียง 8 ตัวอักษรดังนั้นคุณจะไม่สามารถป้อนบางสิ่งเช่น 'ดัชนีหัวเรื่อง' ลงในฉลากได้หากใช้ป้ายกำกับ แต่คุณสามารถใช้มุมมองรายการเมนู> การนำทางเพจ> ไปที่ ... หรือคีย์ที่เทียบเท่าได้แทน

เคล็ดลับอีกประการหนึ่ง: ข้อมูลจำเพาะ pdf จะกำหนดหมายเลขหน้าอย่างต่อเนื่องดังนั้นในกรณีของเอกสารที่ผลิตโดยการสแกนหน้าคู่ตัวเลขสองชุดจะก้าวออกจากขั้นตอน (เว้นแต่ว่าคุณตั้งใจทำจำนวนหน้าทีละหน้า) แต่คุณสามารถตั้งค่าเอกสารของคุณได้อย่างง่ายดายดังนั้นการประชุม 'ไปที่หน้า n จะนำคุณไปสู่หน้า 2n และ 2n + 1'


1

คำตอบของ Danes นั้นดีที่สุดรูปแบบเปลี่ยนไปเล็กน้อยตอนนี้อาจเป็นประโยชน์:

%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

ฉันพบการแก้ไขโดยตรงของไฟล์ (ตามที่ไม่บีบอัดโดย pdftk) ไม่ทำงานหากมีการตั้งค่า '/ title' ไว้แล้วในภูมิภาค '/ outlines' เทคนิคการแก้ไขโดยตรงที่อธิบายในโพสต์ด้านบนนั้นแสดงให้เห็นบน Youtube: https://www.youtube.com/watch?v=zoH1Z_hSpak

แต่คุณสมบัติ 'อัพเดต' ของ pdftk อาจใช้งานง่ายกว่า (และเชื่อถือได้มากกว่าเมื่อมี '/ title' อยู่ในพื้นที่ '/ outlines' ของไฟล์ PDF) ผ่านการแก้ไขไฟล์ 'doc_data.txt' ที่ใช้ที่นี่: https: / /www.pdflabs.com/blog/export-and-import-pdf-bookmarks/


1
สวัสดี @Bob คำตอบสำหรับลิงก์เท่านั้นมีคุณภาพต่ำ สิ่งเหล่านี้จะไร้ประโยชน์หากเว็บไซต์เป้าหมายเคลื่อนที่หรือหายไป โปรดแก้ไขคำตอบของคุณและอ้างถึงส่วนที่เกี่ยวข้องของการแก้ปัญหาที่นี่
C0deDaedalus

0

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

คุณสามารถเพิ่ม / ลบ / เปลี่ยนชุดรูปแบบหมายเลขหน้าภายในในแท็บ "หน้า" ของเครื่องมือฟรีแวร์นี้

และข้อควรระวังโปรแกรมดูไฟล์ PDF xchange จะไม่แสดงรูปแบบหมายเลขหน้าและ Foxitreader มีผลลัพธ์ที่ถูกต้อง ฉันยังไม่ได้ทดสอบตัวอ่าน Acrobat

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.