Як можна зменшити розмір відсканованого файлу PDF?


372

У мене є PDF-файл в розмірі 72,9 Мб, який мені потрібно скоротити на рівні менше 500 КБ.

Файл являв собою зображення JPEG, яке я відсканував, а потім перетворив у pdf.


1
це залежить від того, що споживає простір ... потрібно набагато більше інформації. стиснення простору зображення може допомогти, але якщо ви намагаєтеся розпорошити велику кучу файлів, це не допоможе. серйозно потрібна додаткова інформація.
RobotHumans

1
конвертувати його в DjVu, замість цього намагайтеся зменшити до неможливого розміру PDF (за джерелом)
zetah

файл був зображенням jpeg, яке я просканував, а потім перетворив у pdf.
tamimym

Це, здається, трохи допомагає розмістити файли, але pdfoptмає простий синтаксис і покращує швидкість завантаження та перегортання сторінок в епоху iPad. :-)
Арі Б. Фрідман

1
PDF в PS не ефективний у відсканованому PDF-файлі, я намагаюся конвертувати 56 MB pdf у файл ps, але ps-файл конвертувати в 1,3 ГБ і знову ps2pdf перетворюється у файл 45 Мб

Відповіді:


145

aking1012 правильно. Маючи більше інформації про можливі вбудовані зображення, гіперпосилання тощо., Відповісти на це питання буде набагато простіше!

Ось пара варіантів сценаріїв та командних рядків. Використовуйте як вважаєте за потрібне.


15
Дякую вам дуже за ваші пропозиції, оболонка ghostscript творила чудеса і скоротила її до 460 Кб :)
tamimym

Це не обов'язково правда. Якщо вміст перейшов від зображення до тексту, це більше, ніж можна зрозуміти. [Це припущення, що текст точно закреслений]
ченці

2
Я рекомендую вам shrinkpdf.sh скрипт, ви можете налаштувати код, щоб використовувати потрібне значення ppi (за замовчуванням 72) і досягти саме того розміру файлів, який вам потрібно пожертвувати найменшою якістю. Це дозволило мені завантажити сканований документ розміром 11 Мб з макс. розміром 3 Мб, не втрачаючи при цьому багато якості.
Северо Роз

4
shrinkpdf чудово працює!
AmanicA

2
Де знаходиться оболонка ghostscript, яку ОП посилається на askubuntu.com/questions/113544/… ?
користувач13107

519

Використовуйте таку команду ghostscript :

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf
  • -dPDFSETTINGS=/screenнижча якість, менший розмір. ( 72 dpi )
  • -dPDFSETTINGS=/ebookдля кращої якості, але трохи більші pdfs. ( 150 dpi )
  • -dPDFSETTINGS=/prepressвихід аналогічний налаштуванню "Додрук оптимізований" Acrobat Distiller ( 300 dpi )
  • -dPDFSETTINGS=/printerвибирає вихід, аналогічний налаштуванню "Оптимізований друк" Acrobat Distiller ( 300 dpi )
  • -dPDFSETTINGS=/default вибирає вихід, призначений бути корисним для широкого спектру використання, можливо за рахунок більшого вихідного файлу

5
Це має бути прийнятою відповіддю. ghostscript - це реалізація у форматі PDF, XPS та PS для єдиноборств і може в основному робити все, що забезпечує найкращу якість ...
dom0

7
@Sina: Насправді існує Nautilus Script із простим інтерфейсом на основі Zenity, який використовує цю команду gs з усіма її параметрами на рівні якості: launchpad.net/compress-pdf
Sadi

36
Це правильна відповідь на це запитання (стиснення PDF-файлу, який є переважно растровими даними). Я виявив, що цей screenпараметр був для мене занадто низькою якістю, але він ebookпрацював добре, скоротивши PDF-файл на базі 33 Мб до 3,6 Мбіт і зберегши його читання. Інші параметри цього -dPDFSETTINGSваріанту перераховані тут: milan.kupcevic.net/ghostscript-ps-pdf , і було б корисно включити їх у цю відповідь.
naught101

5
gs доступні параметри конфігурації: ghostscript.com/doc/current/Ps2pdf.htm
Антоніос Хаджігеоргаліс

3
17.10 вона склала 42 mb pdf до 127 mb :(
YaSh Chaudhary

156

Мій улюблений спосіб зробити це - перетворити PDF в PS і назад. Не завжди це працює, але коли це працює, результати хороші:

ps2pdf input.pdf output.pdf

Це також безпосередньо працює на PDF-файлах, як це запропоновано в коментарях.

Деякі користувачі також повідомляють про більший успіх при використанні налаштувань електронної книги таким чином:

ps2pdf -dPDFSETTINGS=/ebook input.pdf output.pdf 

4
Це дуже простий та ефективний спосіб зробити це. Я був здивований, побачивши, наскільки цей метод стискав файли. Дякую тобі!
Габріель

16
Незважаючи на те, що цей єдиний підхід став моїм улюбленим рішенням для стиснення файлів PDF, він порушує URL-посилання, які може мати документ (що не відбувається з підходом @Michael D). Крім цього, дивовижність - це все, що я можу подумати, щоб запустити цей фрагмент! (:
Рубенс

1
@Рубенс Ага. Не знав про те, що він порушує URL-посилання. Дякуємо, що додали це.
don.joey

3
Це обходить захист паролем ... просто говорю
Jojo

8
ps2pdf прийме pdfs як вхідні дані, тому ви можете зробити це одним кроком:ps2pdf intput.pdf output.pdf
frabjous

127

Якщо у вас є pdf із відсканованими зображеннями , ви можете convertстворити pdf із стисненням jpeg (Цей метод можна використовувати на будь-якому pdf, але ви втратите всю текстову інформацію).

Наприклад:

convert -density 200x200 -quality 60 -compress jpeg input.pdf output.pdf

Відрегулюйте щільність (наприклад, 100x100) та якість під свої потреби.

Залежно від вашого введення jpeg стиснення може бути не найкращим вибором через артефактів стиснення. Ви можете обрати BZip, Fax, Group4, JPEG, JPEG2000, Lossless, LZW, RLE або Zip як альтернативні способи стиснення (деякі дозволяють лише ч / б зображення). Детальніше дивіться тут .

Мені вдалося досягти великих коефіцієнтів стиснення для сканованих / сфотографованих документів (залежно від налаштувань). Залежно від джерела документа, ви можете зменшити глибину кольору ( -depthаргумент).


3
Для відсканованого документа, де текст цікавить вас, а тоді зображення та збереження глибини не є проблемою, стиснення jpeg не є хорошою ідеєю, оскільки артефакти, як правило, надзвичайно помітні. Якщо ви використовуєте pdfimages input.pdf pagesдля вилучення PBM файлів, то ви можете зробити що - щось на кшталт: for page in *.pbm; do convert $page -compress Group4 -type bilevel TIFF:- | convert - output.pdf. Будь-який OCR буде втрачено, тому я зазвичай це роблю pdfsandwich output.pdf, що, здається, ще більше зменшує розмір файлу.
Брайан Z

1
@BrianZ впевнений, що стиснення jpeg не завжди є найкращим вибором, але для мене це був найкращий підхід для документів змішаного типу. До відповіді я додав інформацію про інші методи стиснення.
someonr

2
Цей метод в кінцевому рахунку використовується gsза кадром.
alfC

2
Я повинен був використовувати подвійний дефіс для опції для запуску команди --density --quality --compressпроти -density -quality -compress.
Ротарети

1
Якщо якість якості зображення не викликає особливих проблем (а ви просто хочете, щоб цей прикріплений вкладення електронної пошти був досить малим, щоб надсилатись), можна також додати -resize 50%, змінити відсоток залежно від того, скільки DPI було використано під час сканування
chrki,

41

Мені потрібно було зменшити розмір PDF, який містив повнокольорові сканування документа. Кожна моя сторінка була повнокольоровим зображенням, що стосується файлу. Вони були зображеннями сторінок, що містять текст та зображення, але вони були створені шляхом сканування на зображення.

Я використовував комбінацію наведеної нижче команди ghostscript і однієї з іншої теми.

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dDownsampleColorImages=true \
-dColorImageResolution=150 -dNOPAUSE  -dBATCH -sOutputFile=output.pdf input.pdf

Це зменшило роздільну здатність зображення до 150 dpi, скоротивши розмір мого файлу навпіл. Переглядаючи документ, майже не було помітної втрати якості зображення. Текст все ще чудово читається на моєму Nexus7 2012 року.


3
+1 для зменшення вибірки зображень, але збереження тексту як векторів. Зробив величезну різницю в стороні, не зробивши мого тексту піксельним.
Джейсон О'Ніл

Фантастично, що можна налаштувати роздільну здатність за допомогою цієї команди - це дало мені кращі результати, ніж просто використання dPDFSETTINGS = \ screen
обмін

29

Ось сценарій для переписування сканованих файлів pdfs:

#!/bin/sh

gs  -q -dNOPAUSE -dBATCH -dSAFER \
    -sDEVICE=pdfwrite \
    -dCompatibilityLevel=1.3 \
    -dPDFSETTINGS=/screen \
    -dEmbedAllFonts=true \
    -dSubsetFonts=true \
    -dColorImageDownsampleType=/Bicubic \
    -dColorImageResolution=72 \
    -dGrayImageDownsampleType=/Bicubic \
    -dGrayImageResolution=72 \
    -dMonoImageDownsampleType=/Bicubic \
    -dMonoImageResolution=72 \
    -sOutputFile=out.pdf \
     $1

Ви можете трохи налаштувати його, щоб зробити його більш багаторазовим, але якщо у вас є лише один pdf, ви можете просто замінити $1його ім'ям pdf-файлу і зв'язати його в терміналі.


1
Працює частування, дякую Олі. Ви вже майже відповіли на все, про що я тут просив :-D
Роб Коуелл

Це хороша відповідь, але в моєму випадку, принаймні, потрібно багато часу, щоб перетворити дещо великий (> 10 Мб) PDF-файл (більше хвилини).
Габріель

Я не впевнений, що трапиться, але PDF в 30 МБ дає файл у розмірі 68 Мб. Замість зменшення він збільшується. Вихід однаковий, якщо використовується безпосередньо ps2pdf, як зазначено в наступній відповіді.
Ед Віллегас

@EdVillegas Єдине, про що я можу придумати (пояснити таке збільшення), це те, що зображення мають меншу роздільну здатність, ніж ті, що створюються (72dpi). Або якимось чином вбудовування шрифтів засмоктує всі шрифти.
Олі

21

Я зазвичай використовую ps2pdf для цього (простіший синтаксис), приблизно так:

ps2pdf -dPDFSETTINGS=/ebook BiggerPdf SmallerPDF

Я використовую наступний скрипт python, щоб зменшити розмір усіх pdf-файлів у dir на виробничому сервері (8.04). Тож має працювати.

#!/usr/bin/python

import os

for fich in os.listdir('.'):
        if fich[-3:]=="pdf":
                os.system("ps2pdf -dPDFSETTINGS=/ebook %s reduc/%s" % (fich,fich))

Дякуємо за альтернативне рішення. Я спробував спочатку Олі, і це дало мені потрібний результат, але я збережу цю для подальшого використання.
Роб Коуелл

1
-dPDFSETTINGS = / параметр принтера зробить 50% розмір. зробити електронну книгу на 90%.
neouyghur

17
  1. Я використовую LibreOffice Draw для відкриття PDF-файлу.
  2. Потім я "експортую як pdf"
  3. А також встановіть "якість стиснення jpeg" на 50%, а "роздільна здатність" - на 150 dpi

Це матиме хороший результат.


Найгірше можливе рішення проблеми! Це повністю зіпсувало мій файл!

9

Найкраще для мене було

convert -compress Zip -density 150x150 input.pdf output.pdf

Інші способи:

#### gs
gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf $INPUTFILE

### pdf2ps && ps2pdf
pdf2ps input.pdf output.ps && ps2pdf output.ps output.pdf

### Webservice
http://compress.smallpdf.com/de

з повагою


Прекрасне рішення. Легко запам’ятати, і він приніс мій pdf від 32 до 3,5 Мб без розумної втрати читабельності.
Іммануїл Вайхнахтен

Мені сподобався другий спосіб pdf2ps input.pdf temp.ps && ps2pdf14 temp.ps output.pdf && rm temp.ps
McPeppr

5

Я просто зіткнувся з цією проблемою сам. Якщо ви користуєтеся простим скануванням, виберіть текстовий режим для сканування низької роздільної здатності, і вам не потрібно буде турбуватися про інформацію в командному рядку. Просто кажу.


1
Це єдина відповідь у цій темі, яка вирішила мою проблему. Я оманув Simplescan, але це справді було для мене відповіддю, а не битися проти Xsane у тому, що здавалося нескінченною агонією.
проти

4

Контроль якості стиснення:

#!/bin/sh
INPUT=$1; shift
OUTPUT=$1; shift
GS_BIN=/usr/bin/gs
QFACTOR="0.40"

# Image Compression Quality
#
# Quality HSamples VSamples QFactor
# Minimum [2 1 1 2] [2 1 1 2] 2.40
# Low     [2 1 1 2] [2 1 1 2] 1.30
# Medium  [2 1 1 2] [2 1 1 2] 0.76
# High    [1 1 1 1] [1 1 1 1] 0.40
# Maximum [1 1 1 1] [1 1 1 1] 0.15 

${GS_BIN} -dBATCH -dSAFER -DNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=${OUTPUT} -c "<< /ColorImageDict << /QFactor ${QFACTOR} /Blend 1 /HSample [1 1 1 1] /VSample [1 1 1 1] >> >> setdistillerparams" -f ${INPUT}

... значить, і INPUT і OUTPUT є одним і тим же аргументом? Ви можете додати інструкції щодо використання.
mikew незалежно від

2
Зверніть увагу на shift. Перший параметр - це вхідний файл, другий - вихідний файл, а решта параметрів буде передана gsяк є.
Мікко Ранталайнен

Я думаю, що ви хочете / HSample s та / VSample s , а не / HSample та / VSample. Див., Наприклад, документи до ps2pdf або посібник з мови PostScript. Також, можливо, варто відзначити, що дозволений діапазон QFactor становить від 0 до 1 000 000, а нижчі значення дають більш високу якість.
Понт

3

Оскільки це посилання було першим для мене, коли я шукав в Google, я подумав, що додаю ще одну можливість. Жодне з перерахованих вище рішень не працювало для мене на PDF, експортованому з Inkscape (15 mb), але я нарешті зміг зменшити його до 1 mb, відкривши його в GIMP і знову експортувавши як pdf.

Інший варіант, який наблизився (але текст був трохи нечітким) - це утиліта для перетворення ImageMagick:

convert -compress Zip input.pdf output.pdf

Я думаю, це те, що ви мали на увазі під «трохи нечітким», але просто для уточнення convert -compress Zipвиявилося, щоб розсіяти всі вектори.
Sparhawk

3

Зрештою я написав свій власний Баш скрипт , щоб вирішити цю проблему, він використовує mogrify, convertі gsдля вилучення Pdf сторінки в форматі PNG, змінювати їх розмір, конвертувати їх в 1-бітному форматі BMP , а потім відновити їх у форматі PDF. Зменшення розміру файлу може перевищувати 90%. Доступно за адресою http://www.timedicer.co.uk/programs/help/pdf-compress.sh.php .


3

Я настійно рекомендую pdfsizeopt .

Це набагато більш ефективним з точки зору зменшення розмірів , ніж будь-який з попередніх CLI і GUI програмне забезпечення , яке я спробував ( в тому числі convert, gs, pdftkі т.д.) - хоча , можливо , повільніше pngoutактивовано - і не деякі з їхніх питань (не сильно пікселізовані / деградовані зображення, відсутність втрати закладок тощо).

Тепер, якщо вам потрібно домогтися певного розміру незалежно від наслідків (включаючи пониження зображень до точки нечитабельності), це може бути не потрібним інструментом, а як завжди працююче рішення для зменшення зайвих великих розмірів в PDF-файлах, не втрачаючи читабельності, інформації та прийнятної якості зображення, я вважаю, що це найкращий варіант. (Примітка. Я схильний використовувати його після того, як вперше зробив векторизацію-OCR в Adobe Acrobat [функція, яку називали "CleanScan"], яка може мати драматичний вплив на розмір деяких сканованих текстових документів.)


Я рекомендую загальну установку Unix :

  1. Встановіть усі необхідні залежності:

  2. Завантажте та встановіть виконуваний файл:

    curl -L -o https://raw.githubusercontent.com/pts/pdfsizeopt/master/pdfsizeopt.single
    cp pdfsizeopt.single /usr/local/bin/pdfsizeopt
    

Використання:

pdfsizeopt original.pdf [compressed.pdf]

Примітка для користувачів Mac, які знаходять цю публікацію (або користувачів Linuxbrew): існує формула установки Homebrew:

brew install --HEAD pts/utils/pdfsizeopt

2

Я зіткнувся з тією ж проблемою, і був радий знайти цю нитку. Зокрема, у мене був PDF-файл, сформований із відсканованих зображень, і він міг зменшити його розмір байтів у 6 разів.

На жаль, жодне з вищезгаданих рішень не спрацювало :(. Тоді я зрозумів, що десь у процесі сканування-> jpeg-> pdf розмір сторінки роздувся у коефіцієнт aprx 4. Документи, які я сканував, були розміром усіх літер, але pdf мав розмір

identify -verbose doc_orig.pdf | grep "Print size"
 Print size: 35.4167x48.7222

Нарешті, я отримав бажані результати за допомогою команди "конвертувати", яка зробила як розмір, так і стиснення в одному:

convert -density 135x135 -quality 70 -compress jpeg -resize 22.588% doc_orig.pdf doc_lowres.pdf

Зауважимо, що doc_orig мав щільність 72x72 dpi.


1

Якщо перетворення на djvu також буде нормальним, і якщо жодні кольори не задіяні, ви можете спробувати наступне:

Перетворити pdf у jpg-файли, використовуючи pdfimages -j

Якщо ви отримаєте файли pbm замість цього, слід зробити проміжний крок:

for FILENAME in $(ls *.pbm); do convert $FILENAME ${FILENAME%.*}.jpg ;done

Команда перетворення - з пакету imagemagick.

Потім скористайтеся скантайлором, щоб зробити з нього тиф .

На останньому кроці ви переходите до сканерів з дирекцій (де розташовані тифи ) і застосовуєте djvubind до цього каталогу.

Це повинно різко зменшити розмір файлів без великих втрат якості тексту. Якщо ви хочете більш тонкий контроль над ocr-backend, ви можете спробувати djvubind --no-ocrскористатися ocrodjvu, щоб потім додати шар ocr.

Якщо у вас в документі є кольори, все стає дещо складніше. Замість djvubind ви можете використовувати didjvu, а в Scantailor вам доведеться перейти на змішаний режим і вибирати іноді кольорові зображення вручну.


1

завантажити зображення або навіть PDF-файл у Inkscape.

З Inkscape: Збережіть у векторному форматі (як рідний .svg).

Імпортуйте векторні файли в scribus, редагуйте макет та експортуйте / зберігайте як .pdf звідти


0

Супер простий інструмент для стиснення PDF: сторінка GitHub.

Установка на Ubuntu:

sudo add-apt-repository ppa:jfswitz/released

sudo apt-get update

sudo apt-get install pdf-compressor

Тут використовується ghostscript.


0

Ви можете спробувати це:

$ time pdftk myFile.pdf output myFile__SMALLER.pdf compress
GC Warning: Repeated allocation of very large block (appr. size 16764928):
    May lead to memory leak and poor performance.
GC Warning: Repeated allocation of very large block (appr. size 8384512):
    May lead to memory leak and poor performance.
GC Warning: Repeated allocation of very large block (appr. size 11837440):
    May lead to memory leak and poor performance.
GC Warning: Repeated allocation of very large block (appr. size 8384512):
    May lead to memory leak and poor performance.
GC Warning: Repeated allocation of very large block (appr. size 33525760):
    May lead to memory leak and poor performance.
GC Warning: Repeated allocation of very large block (appr. size 7254016):
    May lead to memory leak and poor performance.
GC Warning: Repeated allocation of very large block (appr. size 34041856):
    May lead to memory leak and poor performance.
GC Warning: Repeated allocation of very large block (appr. size 33525760):
    May lead to memory leak and poor performance.

real    0m23.677s
user    0m23.142s
sys     0m0.540s
$ du myFile*.pdf
108M    myFile.pdf
74M     myFile__SMALLER.pdf

Це швидше, gsале стискає до 30% у цьому випадку для вхідного файлу 107,5 Мбіт.


0

Для мене screenваріант gs був надто поганий, а той ebookзанадто великий.

Мій оригінальний документ містив текст у вигляді кольорових та чорно-білих зображень (залежно від сторінки).

Найкраще рішення, яке я придумав:

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dDownsampleColorImages=true -dDownsampleGrayImages=true -dDownsampleMonoImages=true -dColorImageResolution=130 -dGrayImageResolution=130 -dMonoImageResolution=130 -r130 -dNOPAUSE  -dBATCH -sOutputFile=output_lr.pdf input.pdf

Зауважте, що рівень стиснення не є лінійним. Якщо я вказував 135, він не стискався, я виявив, що 130 має бути (у моєму випадку) максимальним дозволом, що досягає стиснення.


-1

Я використовував команди нижче, але це не суттєво стискало мій pdf-файл. Деякі рази частина порції чорніла після стиснення.

  1. gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf $INPUTFILE

  2. "ps2pdf -dPDFSETTINGS=/ebook %s %s" % (input_file_path, out_file_path)

Після занадто багато блукань по Інтернету я просто не зміг знайти потрібну бібліотеку стиснення. Я натрапив pdfcompressor.com. Це просто приголомшливий веб-сайт. Він стискає pdf на 95% (15 Мб файлів). Тому я використовував селен і Тор для автоматизації компресії. Оформити мій сховище Github. [GITHUB] ( https://github.com/gugli28/PdfCompressor )

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.