опция сжатия pdftk


94

Я использую pdftk для сжатия PDF- файла с помощью следующей командной строки

pdftk file1.pdf output file2.pdf compress

Это работает, поскольку вес моего файла уменьшился.

Есть [варианты] поменять компрессию ???

Или, может быть, другие решения для сжатия моего файла? Это тяжело, потому что в некоторой графике много точек . Есть ли способ преобразовать эти графики, например, в jpg и адаптировать сжатие?


1
По моему опыту, это зависит от того, что находится внутри вашего pdf. Например, если это график с множеством точек, лучшим решением будет преобразовать график в png и включить этот png в pdf.
RockScience

Ответы:


123

У меня была такая же проблема, и я нашел два разных решения (подробнее см. В этой ветке ). Оба файла резко уменьшили размер моего несжатого PDF-файла.

  • Пиксельный (с потерями):

    convert input.pdf -compress Zip output.pdf
    
  • Без пикселов (без потерь, но может отображаться немного иначе):

    gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dBATCH  -dQUIET -sOutputFile=output.pdf input.pdf
    

Изменить : я только что обнаружил еще один вариант (для сжатия без потерь), который позволяет избежать неприятной команды gs. qpdf - удобный инструмент, который конвертирует PDF-файлы (сжатие / распаковка, шифрование / дешифрование) и работает намного быстрее, чем команда gs:

qpdf --linearize input.pdf output.pdf

3
Потрясающие. gs у меня сработал, преобразовав файл размером 4 МБ в 339 КБ. Была потеря качества, но это послужило моей цели.
Шридхар Сарнобат

27
Вы можете использовать настройку PDF «принтер» для лучшего качества:gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.5 -dPDFSETTINGS=/printer -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf
imriss

10
Чтобы настроить качество (и, следовательно, размер), измените значение PDFSETTINGS. См ghostscript.com/doc/current/Ps2pdf.htm#Options
1in9ui5t

6
Обратите внимание, что gsкоманда в ответе не совсем без потерь, поскольку она снижает разрешение и качество встроенных файлов JPG. Но это без потерь. текст, сохраняя его как текст, в то время как convertкоманда преобразует его в растровую графику.
tanius

14
Установка опции -dPDFSETTINGS=на /ebookдает мне очень хороший результат: конечно, он сжат и видны некоторые артефакты jpg, но он полностью читается при разумном размере. Благодарность!
Joël

35

эта процедура работает очень хорошо

pdf2ps large.pdf very_large.ps

ps2pdf very_large.ps small.pdf

попробуйте.


8
Это не общее решение. Во многих случаях результирующий PDF-файл больше.
rotskoff

4
Это сработало для меня лучше всего из всех упомянутых решений. Несколько больших изображений уменьшились с 23 МБ до 1,4 МБ с наименьшей потерей качества.
AerandiR

1
@rotskoff Вероятно, общего решения нет, потому что существуют разные типы документов. Однако я понимаю вашу точку зрения. Было бы неплохо иметь программное обеспечение, определяющее, что лучше всего подходит для нас.
tiktak

Спасибо, у меня это сработало, а qpdf и gs не уменьшили размер выходного файла.
Себастьян

1
Как упоминалось здесь, еще одним недостатком этого метода является то, что он нарушает URL-ссылки внутри документа.
ptomato

31

Пытаюсь сжать PDF-файл, который я сделал с разрешением 400 пикселей на дюйм, в основном 8-битным, несколько 24-битным, со сжатием PackBits, используя tiff2pdfсжатие с помощью Zip / Deflate. У меня была одна проблема с каждым из этих методов: ни один из вышеперечисленных методов не сохранил оглавление закладок, которое я кропотливо вручную создал в Acrobat Pro X. Даже рекомендуемый ebookпараметр для gs. Конечно, я мог бы просто открыть копию оригинала с неповрежденным оглавлением и сделать это, Replace pagesно, к сожалению, ни один из этих методов с самого начала не дал удовлетворительной работы. Либо они уменьшили размер настолько, что качество было недопустимо пиксельным, либо они не уменьшили размер вообще, а в одном случае фактически увеличили его, несмотря на потерю качества.

pdftk compress:

no change in size
bookmarks TOC are gone

gs screen:

takes a ridiculously long time and 100% CPU
errors:
    sfopen: gs_parse_file_name failed.                                 ? 
    | ./base/gsicc_manage.c:1651: gsicc_set_device_profile(): cannot find device profile
74.8MB-->10.2MB hideously pixellated
bookmarks TOC are gone

gs printer:

takes a ridiculously long time and 100% CPU
no errors
74.8MB-->66.1MB
light blue background on pages 1-4
bookmarks TOC are gone

gs ebook:

errors:
    sfopen: gs_parse_file_name failed.
      ./base/gsicc_manage.c:1050: gsicc_open_search(): Could not find default_rgb.ic 
    | ./base/gsicc_manage.c:1651: gsicc_set_device_profile(): cannot find device profile
74.8MB-->32.2MB
badly pixellated
bookmarks TOC are gone

qpdf --linearize:

very fast, a few seconds
no size change
bookmarks TOC are gone

pdf2ps:

took very long time
output_pdf2ps.ps 74.8MB-->331.6MB

ps2pdf:

pretty fast
74.8MB-->79MB
very slightly degraded with sl. bluish background
bookmarks TOC are gone

2
Это чрезвычайно ценное исследование (спасибо!), Но это также не ответ, что на мгновение я подумал о голосовании против.
ndemou 08

3
Как это не ответ?
hmj6jmh

22

Если размер файла все еще слишком велик, можно использовать ps2pdf для уменьшения разрешения создаваемого файла pdf:

pdf2ps input.pdf tmp.ps
ps2pdf -dPDFSETTINGS=/screen -dDownsampleColorImages=true -dColorImageResolution=200 -dColorImageDownsampleType=/Bicubic tmp.ps output.pdf

Настройте значение параметра -dColorImageResolution для достижения результата, который соответствует вашим потребностям (значение описывает разрешение изображения в точках на дюйм ). Если ваш входной файл имеет оттенки серого, замена цвета на серый или использование обоих параметров в приведенной выше команде также может помочь. Дальнейшая тонкая настройка возможна путем изменения параметра -dPDFSETTINGS на / default или / printer . Для объяснения всех возможных опций обратитесь к руководству ps2pdf .


1
Спасибо за отзыв. С -dPDFSETTINGS я мог уменьшить размер отсканированного PDF-файла
eshwar

2
СПАСИБО. Я не думаю, что есть общее решение для каждого варианта использования, но я пробовал почти все решения в этой теме, и это единственное, что сработало для меня !!! Возможность «настроить» параметр dColorImageResolution была ключевой - необходимо было получить документ достаточно маленького размера, чтобы этот правительственный сайт мог его принять, но достаточно большого, чтобы его можно было разобрать. Спасибо, дядя Сэм, за еще один болезненный обруч, который нужно преодолеть :)
Майкл Клер,

4

Попробовав gpdf, как предлагал nullglob , я обнаружил, что получил те же результаты сжатия (файл размером ~ 900 МБ до ~ 30 МБ), просто используя принтер cups-pdf. Это может быть проще / предпочтительнее, если вы уже просматриваете документ и вам нужно сжать только один или два документа.

В Ubuntu 12.04 вы можете установить это с помощью

sudo apt-get install cups-pdf

После установки обязательно проверьте Системные инструменты > Администрирование > Печать > щелкните правой кнопкой мыши «PDF» и установите для него значение «включить».

По умолчанию вывод сохраняется в папке с именем PDF в вашем домашнем каталоге.


4

Вариант однострочного pdf2ps (автор Lee) фактически увеличил размер pdf. Однако два первых шага оказались лучше. И его можно объединить в один, используя перенаправление от & на стандартный ввод / вывод и каналы:

pdf2ps large.pdf - | ps2pdf - small.pdf

уменьшил PDF-файл, созданный xsane, с 18 мес. до 630 ко!

Ссылки теряются, но для данного примера это не проблема ... и это был самый простой способ добиться желаемого результата.


ps2pdfВместо этого вы можете попробовать , см. Мой комментарий к ответу @ Lee.
myrdd

3

pdf2ps large.pdf small.pdf достаточно, вместо двух шагов

pdf2ps large.pdf very_large.ps 
ps2pdf very_large.ps small.pdf

Однако ps2pdf large.pdf small.pdfэто лучший выбор.

  • ps2pdf намного быстрее
  • без указания дополнительных параметров pdf2psиногда создает файл большего размера.

Где вы нашли этот вариант? Это функция в какой-то последней версии? У меня не получилось. Хотя я назвал выходной файл out.pdf, он стал файлом PS ( mimetype out.pdfговорит out.pdf: application/postscript).
myrdd

у меня самая последняя версия 9.xx. не уверен, что ваш.
Ли

Я использую упакованную версию debian stable ("stretch"), то есть 9.25. Не могли бы вы проверить, действительно ли у вас есть файл pdf, набрав mimetype small.pdf?
myrdd

выход mimetype small.pdfесть small.pdf: application/pdf. Я думаю, программа может автоматически определять тип файла по суффиксу.
Ли

1
@myrdd да, я сделал тесты. ps2pdfлучше.
Lee

1

Я не заметил значительного уменьшения размера файла при использовании qpdf. Лучший способ, который я нашел, - это после завершения pdftk использовать ghostscript для преобразования pdf в postscript, а затем обратно в pdf. В PHP вы должны использовать exec:

$ps = $save_path.'/psfile.ps';
exec('ps2ps2 ' . $pdf . ' ' . $ps);
unlink($pdf);
exec('ps2pdf ' .$ps . ' ' . $pdf);
unlink($ps);

Я использовал это несколько минут назад, чтобы увеличить вывод pdftk с 490k до 71k.


2
PHP добавляет совершенно ненужную сложность и сужает применимость этого ответа
ndemou

-2

У меня была такая же проблема, и я использовал эту функцию для сжатия отдельных страниц, в результате чего размер файла сжимался до 1/3 исходного размера.

for (int i = 1; i <= theDoc.PageCount; i++)
{
       theDoc.PageNumber = i;
       theDoc.Flatten();
}

1
вы используете C ++ библиотеку pdftk?
RockScience

-3

Если вы хотите сжать PDF-файл, содержащий много текста, который можно выбрать, в Windows вы можете использовать NicePDF Compressor - выберите опцию «Flate». Попробовав все (cpdf, pdftk, gs), он наконец помог мне сжать мой 1360-страничный PDF-файл с 500 МБ до 10 МБ.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.