Làm thế nào để biết một tệp PDF có được nén hay không và (không) nén nó


18

Tôi mới biết rằng các tệp PDF có thể được nén để giảm kích thước đĩa của chúng.

  1. Tôi đã tự hỏi làm thế nào để biết nếu một tập tin PDF đã được nén?
  2. Những ứng dụng / lệnh nào có thể được sử dụng để nén hoặc giải nén tệp PDF?

Môi trường của tôi là Linux Ubuntu 10.10.


Một số nỗ lực không cho kết quả khả quan:

  1. Dưới đây là kết quả của việc thử pdftk:

    $ pdftk 3.pdf output 5.pdf uncompress 
    $ pdftk 3.pdf output 3comp.pdf compress 
    $ ls -l 3.pdf 3comp.pdf 5.pdf
    -rwxrwx--- 1 root plugdev  8652269 2011-07-30 12:27 3comp.pdf
    -rwxrwx--- 1 root plugdev  8652319 2011-07-29 22:15 3.pdf
    -rwxrwx--- 1 root plugdev 16829828 2011-07-30 12:27 5.pdf
    

    Thuộc tính của các tập tin cho thấy rằng tất cả chúng không được tối ưu hóa.

  2. Kết quả chuyển đổi sang ps và sau đó trở lại pdf:

    $ pdf2ps 3.pdf 3.ps
    $ ps2pdf 3.ps 3c.pdf
    $ ls -l 3.pdf 3.ps 3c.pdf
    -rwxrwx--- 1 root plugdev   8808946 2011-07-30 13:14 3c.pdf
    -rwxrwx--- 1 root plugdev   8652319 2011-07-29 22:15 3.pdf
    -rwxrwx--- 1 root plugdev 122375966 2011-07-30 13:14 3.ps
    

Tôi không thể kiểm tra nó ngay bây giờ, vì tôi không có sẵn tệp PDF nén, nhưng hãy thử file. Nó sẽ hiển thị cho dù tập tin được nén hay không.
Polemon

1
@polemon: Cảm ơn! Nó không. Đặt ra $file 3.pdf3.pdf: PDF document, version 1.4
Tim

Lưu ý rằng các luồng riêng lẻ trong tệp PDF có thể được nén. Vì vậy, hỏi "toàn bộ tệp PDF có bị nén không" là câu hỏi sai (mặc dù trong nhiều trường hợp, hoặc hầu hết các luồng sẽ bị nén hoặc không nén).
dirkt

Câu trả lời:


30

Nói ngắn gọn:

Để biết nó đã được nén chưa:

strings your.pdf | grep /Filter

Để (un) nén tệp PDF, sử dụng QPDF

qpdf --stream-data=compress your.pdf compressed.pdf
qpdf --stream-data=uncompress compressed.pdf uncompressed.pdf  

giải trình:

Từ khóa "Bộ lọc" bên trong tệp pdf là một chỉ báo về phương pháp nén được sử dụng. Một số trong số họ là:

CCITT G3 / G4 - được sử dụng cho hình ảnh đơn sắc
JPEG - thuật toán mất dữ liệu được sử dụng cho hình ảnh
JPEG2000 - một giải pháp thay thế hiện đại hơn cho JPEG, cũng được sử dụng để nén hình ảnh
Flate - được sử dụng để nén văn bản cũng như hình ảnh
JBIG2 - thay thế cho Nén CCITT cho hình ảnh đơn sắc
LZW - được sử dụng để nén văn bản cũng như hình ảnh nhưng được thay thế bằng Flate
RLE - được sử dụng cho hình ảnh đơn sắc
ZIP - được sử dụng cho hình ảnh thang độ xám hoặc màu

(sao chép từ đây ).

Tuy nhiên, với cấu trúc tệp phức tạp PDF, phần lớn thời gian một phần (hoặc "luồng") của PDF sẽ bị nén theo một cách nào đó (và sẽ hiển thị khi grepping / Filter) trong khi một số phần khác sẽ không không có câu trả lời CÓ / KHÔNG cho câu hỏi liệu PDF có được nén hay không.
một cách để khắc phục điều này là thêm -ctùy chọn vào grep, trả về số lần xuất hiện, do đó bạn có thể thấy nó được nén tương đối tốt như thế nào. ví dụ: nếu trả về ít hơn 10 thì nó không bị nén.strings "large.pdf" | grep -c /Filter

Một thuộc tính khác liên quan đến kích thước trong các tệp PDF là liệu chúng có được tối ưu hóa để truy cập nhanh hay không, với các tệp PDF "được tối ưu hóa" có kích thước lớn hơn, để trích dẫn từ wikipedia :

Có hai bố cục cho các tệp PDF, phi tuyến tính (không "tối ưu hóa") và tuyến tính ("tối ưu hóa"). Các tệp PDF phi tuyến tính tiêu thụ ít không gian đĩa hơn so với các bản sao tuyến tính của chúng, mặc dù chúng truy cập chậm hơn vì các phần dữ liệu cần thiết để lắp ráp các trang của tài liệu nằm rải rác trong tệp PDF. Các tệp PDF tuyến tính (còn được gọi là các tệp PDF "được tối ưu hóa" hoặc "tối ưu hóa web") được xây dựng theo cách cho phép chúng được đọc trong plugin trình duyệt Web mà không cần chờ toàn bộ tệp tải xuống, vì chúng được ghi vào đĩa trong một thời trang tuyến tính (như theo thứ tự). Các tệp PDF có thể được tối ưu hóa bằng phần mềm Adobe Acrobat hoặc QPDF.

Bạn có thể kiểm tra xem PDF có được tối ưu hóa hay không pdfinfo your.pdf.


Cảm ơn! (1) Kết quả của việc sử dụng qpdf tương tự như sử dụng pdftk: với nén, kích thước thực sự trở nên lớn hơn một chút (lạ) và với giải nén, kích thước trở nên lớn hơn nhiều, gần gấp đôi. (2) Pdftk và gpdf có cố gắng hoàn thành điều tương tự, sử dụng các tùy chọn nén và giải nén không?
Tim

@Tim: (xin lỗi tôi không có ở đây). đối với (1), như tôi đã giải thích, PDF đã được nén một phần (rất có thể), đó là lý do tại sao việc nén không tiết kiệm quá nhiều, (và việc giải nén làm cho nó lớn hơn nhiều, vì nó giải nén tất cả các luồng được nén). (2) hầu hết có thể qpdfpdftkthực hiện ít nhiều cùng một điều liên quan đến nén, nhưng qpdfcũng có thể tối ưu hóa (cộng với nhiều thứ khác).
Philomath

10

pdftk là một công cụ để thực hiện một số thao tác trên các tệp PDF, như nén / giải nén:

$ pdftk test.pdf output compressed_test.pdf compress

Cảm ơn! Tôi đã tự hỏi làm thế nào để biết nếu một tập tin pdf đã được nén?
Tim

1
@Tim: pdfinfo file.pdfcho bạn biết nếu PDF được tối ưu hóa . Tuy nhiên, tôi không chắc điều đó có nghĩa là nén hay không.
nico

1
@uloBasEI: Tôi đã thử lệnh của bạn bằng cách sử dụng pdftk để nén, nhưng kích thước hầu như không thay đổi. Nếu tôi giải nén, kích thước tập tin tăng gấp đôi. Các thuộc tính của tệp gốc, tệp nén và tệp không nén đều cho thấy chúng không được tối ưu hóa.
Tim

@nico: Cảm ơn! Xem bình luận của tôi ở trên và cập nhật của tôi. Có vẻ như nén và tối ưu hóa không ngụ ý lẫn nhau?
Tim

@ Tim: cũng thấy điều này: pandemoniumillusion.wordpress.com/2008/05/07/...
nico

1

Tôi tìm thấy phương pháp nén trong tập tin pdf. Mở tệp PDF bằng trình soạn thảo văn bản. Chạy CCITT Tìm kiếm hoặc Tìm kiếm trung tâm nếu không tìm thấy, nhập JPEG, sau đó Flate, sau đó JBIG2, sau đó LZW, sau đó RLE và sau đó ZIP.
Âm thanh tệ hơn nó là! Rất dễ dàng để tìm phương pháp nén của luồng dữ liệu.


Đây là khá iffy. Tôi đã sử dụng phương pháp của bạn để kiểm tra tệp PDF không nén (không nén bởi qpdf) bằng grep như trong grep -E "(CCITT | JPEG | Flate | LZW | RLE | ZIP)" unsompression.pdf và nó trả về thông báo này Tệp nhị phân không nén.pdf trận đấu . Có vẻ như nó phát hiện tệp unsompression.pdf để chứa cả các mẫu LZW và RLE.
dùng91822

-1

Chỉ cần kiểm tra thuộc tính của nó; Nó sẽ nói nếu tập tin được nén hay không.


Tôi nghĩ câu hỏi Heidi là chương trình nào để kiểm tra các thuộc tính, đặc biệt là với các chương trình dựa trên dòng lệnh có thể viết được.
Caleb

> Chỉ cần kiểm tra các thuộc tính của nó - chương trình [nguồn mở] mà người ta có thể sử dụng để làm điều này, mặc dù ??
Tối đa
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.