опція стиснення pdftk


94

Я використовую pdftk для стиснення pdf за допомогою наступного командного рядка

pdftk file1.pdf output file2.pdf compress

Це працює, оскільки вага мого файлу зменшилася.

Чи є [варіанти] змінити стиснення ???

А може, інші рішення для стиснення мого файлу? Це важко, тому що деякі графіки мають багато точок . Чи є спосіб перетворити ці графіки в jpg, наприклад, і адаптувати стиснення?


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

Відповіді:


122

У мене була та сама проблема, і я знайшов два різні рішення (докладніше див. У цій темі ). І те, і інше різко зменшило розмір мого нестиснутого 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-посилання всередині документа.
птомато

30

Спроба стиснення PDF-файлу, яку я зробив із позначками 400ppi, переважно 8-бітовими, кількома 24-бітними, із стисненням PackBits, використовуючи tiff2pdfстиснене за допомогою Zip / Deflate. У мене була проблема з кожним із цих методів: жоден із зазначених вище методів не зберігав закладок TOC, які я копітко створював вручну в Acrobat Pro X. Навіть не рекомендовані ebookналаштування для gs. Звичайно, я міг просто відкрити копію оригіналу з цілим TOC і зробити це, 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

3
Як це не відповідь?
hmj6jmh

22

Якщо розмір файлу все ще занадто великий, це може допомогти використанню ps2pdf для зменшення роздільної здатності створеного PDF-файлу:

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

Відрегулюйте значення параметра -dColorImageResolution, щоб досягти результату, який відповідає вашим потребам (значення описує роздільну здатність зображення в DPI). Якщо ваш вхідний файл у відтінках сірого, заміна кольору на сірий або використання обох параметрів у наведеній вище команді також може допомогти. Подальше точне налаштування можливо, змінивши параметр -dPDFSETTINGS на / за замовчуванням або / принтер . Для пояснення всіх можливих варіантів зверніться до керівництва ps2pdf .


1
Дякую за підказку. За допомогою -dPDFSETTINGS я міг зменшити розмір відсканованого PDF
eshwar

2
ДЯКУЮ. Я не думаю, що існує загальне рішення для всіх випадків використання - але я перепробував майже кожне рішення в цій темі, і це єдине, що працювало для мене !!! Можливість «налаштувати» параметр dColorImageResolution була ключовою - потрібно було отримати розмір документа, достатньо малий, щоб цей урядовий сайт прийняв його, але достатньо великий, щоб бути розбірливим. Дякую, дядьку Сем, за ще один болісний обруч, через який можна стрибнути :)
Майкл Клер

4

Після спроби gpdf , як nullglob запропонував, я виявив , що я отримав ті ж результати стиснення (а ~ 900Mb файл до ~ 30MB) тільки з допомогою принтера стаканчики-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 ("stretch"), яка становить 9.25. Чи можете ви перевірити, чи справді у вас є файл PDF, набравши текст mimetype small.pdf?
myrdd

вихід mimetype small.pdfє small.pdf: application/pdf. Я думаю, програма може автоматично визначати тип файлу відповідно до суфікса.
Lee

1
@myrdd так, я зробив тести. ps2pdfкраще.
Лі

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.