วิธีดูและแก้ไขรหัสของไฟล์ PDF


12

ฉันสงสัยว่าจะดูและแก้ไขรหัสของไฟล์ PDF ได้อย่างไร

  1. โดยการดูฉันไม่ต้องการเห็นรูปแบบไบนารีดังนั้นฉันคิดว่าhexdumpอาจไม่ใช่สิ่งที่ฉันต้องการ ฉันลองใช้geditแต่ไม่สามารถใช้วิธีการเข้ารหัสเพื่อถอดรหัสเนื้อหา PDF

  2. โดยการแก้ไขฉันต้องการค้นหา/Fitและเปลี่ยน /XYZเป็นตัวอย่างเช่น sed แต่คำสั่งของฉันsed s/\/Fit/\/XYZ/ < 1.pdf > 2.pdfดูเหมือนจะไม่เปลี่ยนรูปลักษณ์ของ PDF ตามที่คาดไว้แม้ว่าจะไม่ได้รายงานข้อผิดพลาดก็ตาม ฉันสงสัยว่าsedสามารถใช้งานไฟล์ PDF ได้หรือไม่ราวกับเป็นข้อความธรรมดา?

บริบทของคำถามของฉันสามารถพบได้จากคำถามนี้ ระบบปฏิบัติการของฉันคือ Ubuntu 10.10

คำตอบ:


9

คุณสามารถใช้sedกับไฟล์ไบนารี (อย่างน้อย GNU sed; การใช้งานบางอย่างอาจมีปัญหากับไฟล์ที่มีอักขระ null หรือไม่ลงท้ายด้วยอักขระขึ้นบรรทัดใหม่) แต่คำสั่งที่คุณใช้จะแทนที่การเกิดขึ้นครั้งแรกของ/Fitแต่ละบรรทัดเท่านั้นและบรรทัดนั้นไม่มีความหมายในไฟล์ PDF คุณต้องแทนที่เหตุการณ์ทั้งหมด:

 sed s/\/Fit/\/XYZ/g

มันจะมีประสิทธิภาพมากขึ้นแทนที่เฉพาะใน/Fitกรณีที่มันไม่ได้ตามมาด้วยคำว่าองค์ประกอบ (เช่นไม่แทนที่/Fitnessฉันไม่ทราบว่าไฟล์ของคุณมีการเกิดขึ้นของ/Fitที่จะทำให้เกิดปัญหา) นี่คือวิธีหนึ่ง:

perl -pe 's!/Fit\b!/XYZ!g'

ขอบคุณ! มันใช้งานได้แล้ว! (1) ฉันสงสัยว่าตัวละครใน sed มีเนื้อหาแบบไบนารีอย่างไร? sed เข้ารหัสตัวอักษรคิวรีก่อนค้นหาหรือไม่ (2) ในคำสั่งสุดท้ายสิ่งที่ไม่!, \bและgหมายความว่าอย่างไร มันสามารถทำได้โดยไม่ต้อง Perl เพียงกับ sed?
ทิม

1
@Tim (1) โหลดข้อมูลลงในหน่วยความจำดำเนินการกับมันแล้วพิมพ์ออกมา ทำไมต้องเข้ารหัสอะไร (2) gหมายถึงการแทนที่เหตุการณ์ที่เกิดขึ้นทั้งหมดในแต่ละบรรทัดทั้งใน sed และ perl !เป็นตัวคั่น คุณสามารถเลือก (เกือบ) ตัวละครใด ๆ เป็นตัวคั่นสำหรับsคำสั่ง (ซึ่งจะไปทั้งใน sed และ perl) \bหมายถึงขอบเขตของคำ มันมีอยู่ใน Perl แต่ไม่ได้อยู่ใน sed
Gilles 'หยุดความชั่วร้าย'

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

@Tim Text เป็นข้อมูลไบนารีที่มนุษย์สามารถอ่านได้
Gilles 'หยุดชั่วร้าย'

1
@Tim ใช่คุณสามารถส่งผ่านข้อมูลเลขฐานสองในแบบสอบถาม คุณจะต้องใส่ตัวอักษรลงไปในรหัส sed หรือ shell source
Gilles 'หยุดชั่วร้าย'

17

เกี่ยวกับคำถามที่ 1 ของคุณ ("การดูซอร์สโค้ด แต่ไม่มีไบนารี่"): มีตัวเลือกสองสามตัวเลือกที่คุณมีเพื่อที่จะบีบอัดสตรีมไบนารีภายในซึ่งแนบมากับวัตถุจำนวนมาก

เครื่องมือที่ฉันโปรดปรานสำหรับรุ่นนี้คือQPDFซึ่งมีอยู่ในแพลตฟอร์มระบบปฏิบัติการหลักทั้งหมด คำสั่งต่อไปนี้จะบีบอัดสตรีมทั้งหมดและสตรีมวัตถุทั้งหมด:

 qpdf --qdf --object-streams=disable orig.pdf expanded.pdf

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

ต้องการอีกครั้งบีบอัดexpanded.pdfอีกครั้งหลังจากการแก้ไขคุณสามารถเรียกใช้:

 qpdf expanded.pdf orig2.pdf

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


1
คุณยังสามารถเพิ่มหรือลบข้อความได้ เมื่อความยาวของวัตถุกระแสเปลี่ยนการ byte offsets สามารถคำนวณใหม่โดยใช้fix-qdfโปรแกรมที่เป็นส่วนหนึ่งของ qpdf คุณยังต้องระวังให้ดี ดูqpdf.sourceforge.net/files/qpdf-manual.html#ref.qdf
H. Rittich

@ H. Rittich: ขอบคุณสำหรับความคิดเห็น ... สิ่งใดที่คุณคิดว่าจะเปิดมุมมองใหม่เกี่ยวกับปัญหา? คุณคิดว่าเราไม่ทราบว่าเราสามารถเพิ่มหรือลบข้อความได้ด้วยวิธีนี้
Kurt Pfeifle

@ KursPfeifle: ฉันไม่ได้ตั้งสมมติฐานในสิ่งที่คุณรู้ คำตอบระบุว่าการแก้ไข PDF ด้วยวิธีนี้จำเป็นต้องสงวนไบต์ออฟเซ็ตของวัตถุในไฟล์ มันเป็น fix-qdfแต่เป็นไปได้ที่จะเปลี่ยนการชดเชยไบต์เมื่อภายหลังแก้ไขได้โดยใช้ ดังนั้นหากคุณต้องการแทนที่สตริงด้วยสตริงที่มีความยาวต่างกันก็เป็นไปได้ แต่คุณต้องใช้fix-qdfเครื่องมือ ฉันจะบอกว่านี่เป็นคำตอบที่มีประโยชน์
H. Rittich

@ H. Rittich: ขอบคุณที่ให้มุมมองของคุณ เมื่อฉันย้ำถึงความจำเป็นที่จะต้องรักษาอ็อฟเซ็ตไบต์ของวัตถุฉันไม่ต้องการที่จะแนะนำผู้คนเกี่ยวกับวิธีที่พวกเขาควรทำสิ่งนี้ ถ้าคุณพูดความคิดเห็นของคุณแตกต่างกันเล็กน้อยฉันจะเข้าใจความตั้งใจของคุณได้เร็วขึ้น
Kurt Pfeifle

1

sedเป็น line-oriented ทำให้ไม่เหมาะสำหรับไฟล์ไบนารีซึ่งมีโครงสร้างเป็นบล็อกไม่ใช่บรรทัด
ลองใช้ bbe (bbe-.sourceforge.net) แทน

อีกทางเลือกหนึ่งทั้ง Emacs (GNU และ XEmacs) และกลุ่มไฟล์ PDF เปิดได้อย่างราบรื่น แน่นอนว่ามันไม่ได้พิมพ์ออกมาสวยมากเนื่องจากเป็นข้อความแบบผสมและไบนารี แต่ก็เพียงพอสำหรับการแก้ไขของคุณ
มีปลั๊กอินPdftkสำหรับกลุ่มที่ทำให้ทุกอย่างง่ายขึ้นดาวน์โหลดได้ที่นี่ (ไฟล์ zip)
อย่างที่คุณอาจทราบแล้วทั้งสองบรรณาธิการด้านบนมีความสามารถในการค้นหาและแทนที่ที่มีประสิทธิภาพ

นอกจากนี้การแปลง PDF เป็นโหมด QDFก่อนทำให้การแก้ไขไฟล์ PDF เป็นเรื่องง่าย


คุณอาจลองแก้ไขsedโดยใช้-bสวิตช์ หากใช้งานได้ฉันจะเพิ่มสิ่งนี้ในคำตอบของฉัน
Philomath

@Tim: คุณหมายถึงอะไรโดย "ไม่แสดงอะไร" เพียงแค่เปล่า? ข้อความแสดงข้อผิดพลาดใด ๆ นอกจากนี้คุณสามารถลองกับ XEmacs ได้หรือไม่? (ทั้งสามคนทำงานให้ฉัน)
Philomath

ไม่เป็นไร-bcygwin เป็นเรื่องเฉพาะ
Philomath

Emacs กล่าวว่า "ไฟล์ 1.pdf มีขนาดใหญ่ (9MB) เปิดจริงหรือ (y หรือ n)" ฉันเลือก "y" แล้วไม่มีอะไรอยู่
ทิม

ส่วนใหญ่เป็นปัญหา Emacs คุณมี XEmacs หรือไม่? (ฉันเพิ่งเปิด PDF ขนาด 31 MB โดยไม่มีปัญหา)
Philomath

0

ใช้ LibreOffice หรือ OpenOffice เพื่อเปิด PDF ดูเปลี่ยนสิ่งเขียน PDF ใหม่ ฯลฯ ฉันคิดว่าคุณสามารถใช้งานได้จากบรรทัดคำสั่งหรือโดยทางโปรแกรมหากมีเอกสารจำนวนมากที่ต้องดำเนินการ

โปรดทราบว่า PDF จากแหล่งข้อมูลบางอย่างเช่นสแกนเนอร์มักจะมีหน้าเป็นรูปภาพแทนที่จะเป็นข้อความดังนั้นคุณจะโชคดีกับการใช้การค้นหาและแทนที่


3
(1/2) ระวังข้อเท็จจริงต่อไปนี้: LibreOffice ไม่ใช่โปรแกรมแก้ไข PDF ดั้งเดิม เมื่อเปิด PDF มันจะแปลงทุกหน้าเป็นภาพเวกเตอร์ (ซึ่งอาจป้องกันส่วนแรสเตอร์จาก PDF ต้นฉบับเป็นส่วนแรสเตอร์) และเปิดในLibreOffice Drawส่วนหนึ่งของชุด LibreOffice จากนั้นเมื่อบันทึกไฟล์ PDF ที่แก้ไขแล้วมันจะเป็นไฟล์ PDF ซึ่งถูกส่งออกจากรูปแบบ LibreOffice Draw แบบเนทีฟ (ด้วยคำต่อท้าย. odg ) เป็น PDF
Kurt Pfeifle

3
(2/2) ขั้นตอนการทำงานนี้อาจมีผลข้างเคียงที่ไม่คาดคิด นอกจากนี้แอปพลิเคชัน LibreOffice Draw อาจไม่สามารถนำเข้าองค์ประกอบทั้งหมดจาก PDF ต้นฉบับได้อย่างถูกต้อง อย่างไรก็ตามในหลาย ๆ กรณีมันอาจเป็นเครื่องมือที่มีประโยชน์สำหรับคนที่ไม่มีวิธีการที่ดีกว่า
Kurt Pfeifle
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.