Cách xem và chỉnh sửa mã của tệp PDF


11

Tôi đã tự hỏi làm thế nào để xem và chỉnh sửa mã của một tập tin PDF?

  1. Bằng cách xem, tôi không muốn xem định dạng nhị phân, vì vậy tôi nghĩ hexdumpcó thể không phải là điều tôi muốn. Tôi đã thử gedit, nhưng không có phương pháp mã hóa nào có thể được sử dụng để giải mã nội dung PDF.

  2. Bằng cách chỉnh sửa, tôi muốn tìm kiếm /Fitvà thay đổi chúng thành /XYZví dụ sed. Nhưng lệnh của tôi sed s/\/Fit/\/XYZ/ < 1.pdf > 2.pdfdường như không thay đổi giao diện PDF của tôi như tôi mong đợi, mặc dù nó không báo cáo bất kỳ lỗi nào. Tôi đã tự hỏi nếu sedthực sự có thể làm việc trên các tập tin PDF như thể chúng là văn bản thuần túy?

Bối cảnh của câu hỏi của tôi có thể được tìm thấy từ câu hỏi này . Hệ điều hành của tôi là Ubuntu 10.10.

Câu trả lời:


9

Bạn có thể sử dụng sedvới các tệp nhị phân (ít nhất là GNU sed; một số triển khai có thể gặp sự cố với các tệp chứa ký tự null hoặc không kết thúc bằng ký tự dòng mới). Nhưng lệnh bạn đã sử dụng chỉ thay thế lần xuất hiện đầu tiên /Fittrên mỗi dòng và các dòng này khá vô nghĩa trong tệp PDF. Bạn cần thay thế tất cả các lần xuất hiện:

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

Nó sẽ mạnh mẽ hơn /Fitnếu chỉ thay thế nếu nó không được theo sau bởi một từ cấu thành (ví dụ: không thay thế /Fitness; tôi không biết liệu tệp của bạn có xuất hiện sự cố /Fitđó sẽ gây rắc rối không). Đây là một cách:

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

Cảm ơn! Bây giờ nó hoạt động! (1) Tôi đã tự hỏi làm thế nào các nhân vật tìm kiếm sed trong nội dung nhị phân? Liệu sed trước tiên có mã hóa các ký tự truy vấn trước khi tìm kiếm không? (2) Trong lệnh cuối cùng !, có nghĩa là gì \bgcó nghĩa là gì? Nó có thể được thực hiện mà không perl chỉ với sed?
Tim

1
@Tim (1) Sed tải dữ liệu vào bộ nhớ, hoạt động trên đó và in ra. Tại sao nó cần phải mã hóa bất cứ thứ gì? (2) gcó nghĩa là thay thế tất cả các lần xuất hiện trên mỗi dòng, trong cả sed và perl. !là dải phân cách; bạn có thể chọn (gần như) bất kỳ ký tự nào làm dấu phân cách cho slệnh (điều này đi cả trong sed và perl). \bcó nghĩa là một ranh giới từ; nó tồn tại trong perl nhưng không phải trong sed.
Gilles 'SO- ngừng trở nên xấu xa'

Giới thiệu (1), bởi vì các ký tự mà bạn đưa cho sed trong lệnh có thể đọc được. Nếu nội dung để tìm kiếm là hoàn toàn nhị phân, làm thế nào sed có thể tìm thấy từ truy vấn ở đó?
Tim

@Tim Văn bản là dữ liệu nhị phân có thể đọc được.
Gilles 'SO- ngừng trở nên xấu xa'

1
@Tim Có, bạn có thể truyền dữ liệu nhị phân trong truy vấn. Bạn sẽ phải chèn các ký tự theo nghĩa đen trong mã nguồn sed hoặc shell của bạn.
Gilles 'SO- ngừng trở nên xấu xa'

16

Về câu hỏi đầu tiên của bạn ("xem mã nguồn, nhưng không có nhị phân"): có một vài tùy chọn mà bạn có để giải nén các luồng nhị phân nội bộ được gắn vào nhiều đối tượng.

Công cụ yêu thích của tôi cho việc này là QPDF , có sẵn trên tất cả các nền tảng HĐH chính. Lệnh sau sẽ nén tất cả các luồng và tất cả các luồng đối tượng:

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

Bây giờ bạn có thể mở tệp PDF của mình trong bất kỳ trình soạn thảo văn bản nào. (Vẫn có thể có một số đốm nhị phân trong đó: ví dụ: tệp phông chữ và hồ sơ ICC, sẽ không có ý nghĩa đối với QPDF để mở rộng).

Để tái nén những expanded.pdfmột lần nữa sau khi chỉnh sửa, bạn có thể chạy:

 qpdf expanded.pdf orig2.pdf

(Cẩn thận khi chỉnh sửa PDF theo cách thủ công! Bạn cần biết nhiều về cú pháp nội bộ của chúng để thực hiện đúng. Ngay khi bạn thêm hoặc xóa một byte đơn, bạn có thể nhận được thông báo lỗi từ trình đọc PDF không còn có thể mở nó ra, vì ToC bên trong của PDF bị hỏng, dựa trên các tính toán bù byte. Chỉ cần thay thế Fitbằng các XYZchuỗi sẽ ổn, mặc dù ...)


1
Bạn cũng có thể thêm hoặc xóa văn bản. Khi độ dài của luồng đối tượng thay đổi, các byte bù có thể được tính toán lại bằng cách sử dụng fix-qdfchương trình là một phần của qpdf. Bạn vẫn phải cẩn thận một chút, mặc dù. Xem qpdf.sourceforge.net/files/qpdf-manual.html#ref.qdf
H. Rittich

@ H.Rittich: Thx cho nhận xét ... Theo bạn, điều này mở ra một quan điểm mới về vấn đề này như thế nào? Bạn có nghĩ rằng chúng tôi không biết rằng chúng tôi có thể thêm hoặc xóa văn bản theo cách này?
Kurt Pfeifle

@KursPfeifle: Tôi không đưa ra bất kỳ giả định nào về những gì bạn biết. Câu trả lời nói rằng chỉnh sửa PDF theo cách này cần phải bảo toàn độ lệch byte của các đối tượng trong tệp. Tuy nhiên, có thể thay đổi độ lệch byte khi sau đó sửa chúng bằng cách sử dụng fix-qdf. Do đó, nếu bạn muốn thay thế một chuỗi bằng một chuỗi có độ dài khác nhau, có thể, nhưng bạn cần sử dụng fix-qdfcông cụ. Tôi muốn nói rằng đây là một bổ sung hữu ích cho câu trả lời.
H. Rittich

@ H.Rittich: Thx đã đưa ra quan điểm của bạn. Khi tôi nhấn mạnh sự cần thiết phải giữ gìn offsets byte của các đối tượng Tôi không muốn những lời khuyên mọi người về CÁCH họ nên làm điều này. Nếu bạn nói từ bình luận của bạn hơi khác, tôi sẽ hiểu ý định bình luận của bạn nhanh hơn.
Kurt Pfeifle

1

sedđược định hướng theo dòng, điều này làm cho nó không phù hợp với các tệp nhị phân, được cấu trúc như các khối không phải là các dòng.
Thay vào đó, hãy thử sử dụng bbe (bbe-.sourceforge.net).

Ngoài ra, cả Emacs (GNU và XEmacs) và vim đều mở các tệp PDF một cách liền mạch. Tất nhiên, nó không được in rất đẹp, vì nó là văn bản hỗn hợp và nhị phân, nhưng nó đủ cho mục đích chỉnh sửa của bạn.
Có một plugin Pdftk cho vim giúp mọi thứ dễ dàng hơn, tải xuống tại đây (tệp zip).
Như bạn có thể biết, cả hai trình soạn thảo ở trên đều có khả năng tìm kiếm và thay thế mạnh mẽ.

Ngoài ra, chuyển đổi chế độ PDF sang chế độ QĐF trước khi thực hiện chỉnh sửa tệp PDF thực sự dễ dàng.


Bạn cũng có thể thử chỉnh sửa bằng sedcách sử dụng công -btắc. Nếu nó hoạt động tôi sẽ thêm nó vào câu trả lời của tôi.
Philomath

@Tim: ý của bạn là "không hiển thị gì cả", chỉ trống rỗng? có thông báo lỗi nào không? Ngoài ra, bạn có thể thử với XEmac không? (cả ba người trong số họ làm việc cho tôi).
Philomath

Đừng bận tâm -b, đó là cygwin cụ thể.
Philomath

Emacs nói "Tệp 1.pdf lớn (9MB), thực sự mở? (Y hoặc n)". Tôi đã chọn "y", và sau đó không có gì ở đó.
Tim

Rất có thể là một vấn đề Emacs, bạn có XEmac không? (Tôi vừa mở tệp PDF 31 MB mà không gặp vấn đề gì).
Philomath

0

Sử dụng LibreScript hoặc OpenOffice để mở tệp PDF, xem nó, thay thế mọi thứ, viết một tệp PDF mới, v.v ... Tôi nghĩ rằng bạn thậm chí có thể sử dụng nó từ dòng lệnh hoặc lập trình nếu có nhiều tài liệu để xử lý.

Lưu ý rằng các tệp PDF từ một số nguồn, ví dụ Máy quét, thường chứa các trang dưới dạng hình ảnh thay vì văn bản, do đó bạn sẽ không gặp may mắn khi sử dụng tìm kiếm và thay thế.


3
(1/2) Hãy nhận biết thực tế sau đây: LibreOffice không phải là trình soạn thảo PDF gốc. Khi mở tệp PDF, nó sẽ chuyển đổi tất cả các trang thành hình ảnh vector (có thể giữ các phần raster từ PDF gốc thành các phần raster) và mở nó trong phần LibreOffice Draw của bộ LibreOffice. Sau đó, khi lưu tệp PDF đã chỉnh sửa, nó sẽ là tệp PDF được xuất từ ​​định dạng LibreOffice Draw (với hậu tố .odg ) sang PDF.
Kurt Pfeifle

3
(2/2) Quy trình làm việc này có thể có tác dụng phụ không mong muốn. Ngoài ra, ứng dụng LibreOffice Draw có thể không thể nhập chính xác tất cả các thành phần từ tệp PDF gốc. Tuy nhiên, trong nhiều trường hợp, nó vẫn có thể là một công cụ hữu ích cho tất cả những người không có phương tiện tốt hơn.
Kurt Pfeifle
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.