Как узнать, сжат ли файл PDF или нет и (не) сжать его

18

Я только что узнал, что PDF-файлы можно сжать, чтобы уменьшить размер их диска.

  1. Мне было интересно, как узнать, был ли PDF-файл уже сжат?
  2. Какие приложения / команды можно использовать для сжатия или распаковки PDF-файла?

Моя среда Linux Ubuntu 10.10.


Некоторые попытки не дают удовлетворительных результатов:

  1. Вот результаты попыток 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
    

    Свойства файлов показывают, что все они не оптимизированы.

  2. Результаты конвертации в ps и затем обратно в 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
    
StackExchange для всех
источник
Я не могу проверить это сейчас, так как у меня нет сжатого PDF под рукой, но попробуйте file. Он должен показать, сжат ли файл или нет.
Полемон
1
@polemon: Спасибо! Это не так. Из положить $file 3.pdfявляется3.pdf: PDF document, version 1.4
StackExchange для всех
Обратите внимание, что отдельные потоки в файле PDF могут быть сжаты. Поэтому вопрос «сжат ли весь PDF-файл» - неправильный вопрос (хотя во многих случаях все или большинство потоков будут сжатыми или несжатыми).
Диркт

Ответы:

30

короче говоря:

Чтобы узнать, сжат ли он уже:

strings your.pdf | grep /Filter

Чтобы (не) сжать PDF, используйте QPDF

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

объяснение:

Ключевое слово «Filter» внутри pdf-файла является индикатором используемого метода сжатия. Некоторые из них:

CCITT G3 / G4 - используется для монохромных изображений
JPEG - алгоритм с потерями, который используется для изображений
JPEG2000 - более современная альтернатива JPEG, которая также используется для сжатия изображений
Flate - используется для сжатия текста, а также изображений
JBIG2 - альтернатива Сжатие CCITT для монохромных изображений
LZW - используется для сжатия текста и изображений, но заменяется на Flate
RLE - используется для монохромных изображений
ZIP - используется для изображений в оттенках серого или цветных изображений

(скопировано отсюда ).

Однако, учитывая сложную файловую структуру PDF, большую часть времени некоторая часть (или «поток») PDF будет каким-то образом уже сжата (и будет отображаться при grepping / Filter), тогда как другая часть не будет, поэтому нет ответа ДА / НЕТ на вопрос, является ли PDF сжатым.
Один из способов преодоления этого - добавить -cопцию в grep, которая возвращает количество вхождений, чтобы вы могли относительно хорошо видеть, насколько хорошо она сжимается. например, если возвращает меньше 10, это довольно несжатый.strings "large.pdf" | grep -c /Filter

Еще одно свойство, касающееся размера в PDF-файлах, заключается в том, были ли они оптимизированы для быстрого доступа, а «оптимизированные» PDF-файлы имеют больший размер, по словам из Википедии :

В файлах PDF есть два макета: нелинейный (не «оптимизированный») и линейный («оптимизированный»). Нелинейные PDF-файлы занимают меньше места на диске, чем их линейные аналоги, хотя доступ к ним медленнее, поскольку части данных, необходимые для сборки страниц документа, разбросаны по всему PDF-файлу. Линейные PDF-файлы (также называемые «оптимизированными» или «веб-оптимизированными» PDF-файлами) создаются таким образом, чтобы их можно было читать в плагине веб-браузера, не дожидаясь загрузки всего файла, поскольку они записываются на диск в линейная (как в порядке страницы) мода. Файлы PDF могут быть оптимизированы с использованием программного обеспечения Adobe Acrobat или QPDF.

Вы можете проверить, оптимизирован ли PDF, используя pdfinfo your.pdf.

человек, любящий учиться
источник
Благодарность! (1) Результаты использования qpdf аналогичны использованию pdftk: при сжатии размер фактически стал немного больше (странный), а при распаковке размер стал намного больше, почти удвоился. (2) Пытаются ли pdftk и gpdf выполнить одно и то же, используя параметры сжатия и распаковки?
StackExchange для всех
@Tim: (простите, я не был здесь). для (1), как я объяснил, PDF уже частично сжат (скорее всего), поэтому сжатие не слишком экономит (и распаковка делает его намного больше, потому что он распаковывает все сжатые потоки). (2) наиболее вероятно qpdfи pdftkделать более или менее то же самое в отношении сжатия, но также qpdfможет оптимизировать (плюс многое другое).
Филомат
10

pdftk - это инструмент для выполнения некоторых операций с файлами PDF, таких как сжатие / распаковка:

$ pdftk test.pdf output compressed_test.pdf compress
uloBasEI
источник
Благодарность! Мне было интересно, как узнать, если PDF-файл уже был сжат?
StackExchange для всех
1
@Tim: pdfinfo file.pdfсообщает, оптимизирован ли PDF . Тем не менее, я не уверен, что это означает сжатый или нет.
Нико
1
@uloBasEI: Я попробовал вашу команду, используя pdftk для сжатия, но размер почти не изменился. Если я распаковываю, размер файла удваивается. Свойства исходного файла, сжатого файла и несжатых файлов показывают, что они не оптимизированы.
StackExchange для всех
@nico: Спасибо! Смотрите мой комментарий выше и мое обновление. Кажется, что сжатие и оптимизация не подразумевают друг друга?
StackExchange для всех
@ Тим: Смотри также это: pandemoniumillusion.wordpress.com/2008/05/07/...
NICO
1

Я нашел способ сжатия в файле PDF. Откройте PDF с текстовым редактором. Запустите Поиск или Найти -enter CCITT, если не найдено, введите JPEG, затем Flate, затем JBIG2, затем LZW, затем RLE, а затем ZIP.
Звучит хуже, чем есть! Очень легко найти метод сжатия потока данных.

bizhubkey1
источник
Это довольно сомнительно. Я использовал ваш метод для проверки несжатого файла PDF (без сжатия в формате qpdf), используя grep as в grep -E "(CCITT | JPEG | Flate | LZW | RLE | ZIP)" uncompressed.pdf, и он возвращает это сообщение. Двоичный файл uncompressed.pdf соответствует . Похоже, что он обнаруживает несжатый файл .pdf, содержащий шаблоны LZW и RLE.
user91822
-1

Просто проверьте его свойства; он скажет, если файл сжат или нет.

rosni
источник
Я думаю, что вопрос Хайди заключается в том, с какой программой проверять свойства, в частности, с программами, основанными на командной строке.
Калеб
> Просто проверьте его свойства - какую [открытую] программу можно было бы использовать для этого, хотя ??
Максим