Как я могу уменьшить размер отсканированного файла PDF?


372

У меня есть PDF-файл размером 72,9 МБ, который нужно сжать до 500 КБ.

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


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

1
преобразовать его в DjVu, вместо этого пытаясь уменьшить PDF до невозможного размера (по словам источника)
Зета

файл представлял собой изображение в формате jpeg, которое я отсканировал, а затем преобразовал в pdf.
Тамимым

Кажется, что это немного помогает в размерах файлов, но pdfoptимеет простой синтаксис и повышает скорость загрузки и переворачивания страниц в эпоху iPad. :-)
Ари Б. Фридман

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

Ответы:


145

aking1012 прав. С дополнительной информацией о возможных встроенных изображениях, гиперссылках и т. Д. Было бы намного проще ответить на этот вопрос!

Вот пара сценариев и решений для командной строки. Используйте по своему усмотрению.


15
Большое спасибо за ваши предложения, оболочка ghostscript творила чудеса и сократила ее до 460 КБ :)
tamimym

Это не обязательно правда. Если содержание перешло из изображения в текст, это более чем понятно. [Предполагается, что текст точно написан]
monksy

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

4
shrinkpdf прекрасно работает!
AmanicA

2
Где находится оболочка ghostscript, которую OP ссылается на askubuntu.com/questions/113544/… ?
user13107

521

Используйте следующую команду ghostscript :

gs -sDEVICE=pdfwrite -dCompatibilityLevel=1.4 -dPDFSETTINGS=/screen -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf
  • -dPDFSETTINGS=/screenнизкое качество, меньший размер. ( 72 т / д )
  • -dPDFSETTINGS=/ebookдля лучшего качества, но немного больше PDF. ( 150 точек на дюйм )
  • -dPDFSETTINGS=/prepressвыходной сигнал аналогичен настройке Acrobat Distiller «Prepress Optimized» ( 300 dpi )
  • -dPDFSETTINGS=/printerвыбирает вывод, аналогичный настройке Acrobat Distiller «Print Optimized» ( 300 точек на дюйм )
  • -dPDFSETTINGS=/default выбирает вывод, предназначенный для использования в широком спектре применений, возможно за счет большего выходного файла

5
Это должен быть принятый ответ. ghostscript - это реализация PDF, XPS и PS для unices, которая может выполнять практически все, обеспечивая наилучшее качество ...
dom0

7
@Sina: На самом деле существует скрипт Nautilus с простым графическим интерфейсом на основе Zenity, который использует эту команду gs со всеми ее параметрами уровня качества: launchpad.net/compress-pdf
Sadi

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

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

3
17.10 это сделало 42 мб pdf к 127 мб :(
YaSh Chaudhary

157

Мой любимый способ сделать это - конвертировать PDF в PS и обратно. Это не всегда работает, хотя, но когда это работает, результаты хороши:

ps2pdf input.pdf output.pdf

Это также напрямую работает с PDF, как это предлагается в комментариях.

Некоторые пользователи также сообщают об успешном использовании параметров электронной книги следующим образом:

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

4
Это очень простой и эффективный способ сделать это. Я был удивлен, увидев, насколько этот метод сжал файлы. Спасибо вам!
Габриэль

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

1
@Rubens Ах. Не знал о том, что он ломает ссылки 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. Любое распознавание будет потеряно, поэтому я обычно делаю это pdfsandwich output.pdf, что, похоже, еще больше уменьшает размер файла.
Брайан З,

1
@BrianZ уверен, что сжатие в формате JPEG не всегда лучший выбор, но для меня это был лучший подход для документов смешанного типа. Я добавил в ответ некоторые сведения о других методах сжатия.
Someonr

2
Этот метод в конечном итоге используется gsза кадром.
alfC

2
Мне пришлось использовать двойную черту для вариантов запуска команды --density --quality --compressпротив -density -quality -compress.
Ротарети

1
Если качество изображения не является самой важной задачей (и вы просто хотите, чтобы это чертово вложение электронной почты было достаточно маленьким для отправки), можно также добавить -resize 50%, изменить процент в зависимости от того, сколько
точек

41

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

Я использовал комбинацию из приведенной ниже команды ghostscript и команды из другого потока.

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

Это уменьшило разрешение изображения до 150 точек на дюйм, сократив размер моего файла вдвое. Глядя на документ, заметных потерь качества изображения практически не было. Текст все еще отлично читается на моем Nexus7 2012 года.


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

Фантастично, что можно настроить разрешение с помощью этой команды - это дало мне лучшие результаты, чем просто использование dPDFSETTINGS = \ screen
exchange

29

Вот скрипт для перезаписи отсканированных PDF-файлов:

#!/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-файла (более минуты).
Габриэль

Я не уверен, что происходит, но 30 МБ PDF приводит к 68 МБ файла. Вместо уменьшения оно увеличивается. Тот же вывод при использовании напрямую ps2pdf, как указано в следующем ответе.
Эд Виллегас

@EdVillegas Единственное, что я могу придумать (чтобы объяснить это увеличение), это то, что изображения имеют более низкое разрешение, чем генерируемые (72 точек на дюйм). Или каким-то образом встраивание шрифтов засасывает все шрифты.
Оли

21

Я обычно использую ps2pdf для этого (упрощенный синтаксис), что-то вроде этого:

ps2pdf -dPDFSETTINGS=/ebook BiggerPdf SmallerPDF

Я использую следующий скрипт на python, чтобы уменьшить размер всех файлов pdf в директории на производственном сервере (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 точек на дюйм

Это будет иметь хороший результат.


Худшее из возможных решений проблемы! Это полностью испортило мой файл!

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}

... так что и ВХОД, и ВЫХОД - это один и тот же аргумент? Вы можете добавить руководство по использованию.
mikewh независимо от

2
Обратите внимание shift. Первый параметр - это входной файл, второй - выходной файл, а остальные параметры будут переданы gsкак есть.
Микко Ранталайнен

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

3

Так как эта ссылка была первой для меня, когда я искал в Google, я решил добавить еще одну возможность. Ни одно из вышеперечисленных решений не работало для меня на PDF, экспортированном из Inkscape (15 МБ), но я наконец смог уменьшить его до 1 МБ, открыв его в 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 размер страницы увеличился в 4 раза. Все отсканированные документы были размером Letter, но PDF имел размер

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

Наконец, я получил желаемые результаты с помощью команды «convert», которая выполняла как изменение размера, так и этапы сжатия в одном:

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

Обратите внимание, что doc_orig имеет плотность 72x72 точек на дюйм.


1

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

Конвертируйте pdf в jpg файлы используя pdfimages -j

Если вместо этого вы получаете файлы pbm, вам следует выполнить промежуточный шаг:

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

Команда convert находится в пакете imagemagick.

Затем используйте скантейлер, чтобы сделать из него тиф.

На последнем шаге вы переходите в директорию scantailors out (где находятся tif) и применяете 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 МБ файлов). Поэтому я использовал селен и Tor для автоматизации сжатия. Оформить заказ на мой репозиторий Github. [GITHUB] ( https://github.com/gugli28/PdfCompressor )

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