PDF сжатие библиотека / инструмент
Я работаю над проектом, чтобы уменьшить размер PDF, сжать их. Мне интересно, есть ли на рынке хорошие инструменты / библиотеки (.NET), которые действительно хороши. Я попробовал несколько инструментов, таких как Onstream Compression, но результаты не были удовлетворительными.
3 ответа
Некоторые дополнительные (мегабайтные) байты можно легко выжать из PDF-файлов. Например, является ли хорошо известный "PDF32000_2008.pdf" достаточно оптимизированным? Размер файла 8,995,189
байт. Он использует потоки объектов и внешних ссылок, (почти) никаких изображений, все плотно упаковано. Или нет?
Посмотрите на странице словаря:
Dict:9 [1 0 R]
. /Annots Array:3
. /Contents Stream:3 [2 0 R]
. /CropBox Array:4
. /MediaBox Array:4
. /Parent Dict:4 [124248 0 R]
. /Resources Dict:4
. /Rotate 0 (Number)
. /StructParents 2 (Number)
. /Type Page (Name)
Rotate 0
по умолчанию, почему он там? Что такое CropBox
там для? По умолчанию MediaBox
и в этом документе нет страницы с CropBox
Кроме как MediaBox
, Почему MediaBox
там? Это наследуется, все страницы имеют одинаковый размер, поэтому переместите его в корень дерева страниц! Есть 756 страниц, то есть избыточная (или бесполезная) информация, тиражированная 756 раз.
Посмотрите на типичный аннотационный словарь:
Dict:6 [3548 0 R]
. /A Dict:2
. . /S URI (Name)
. . /URI http://www.iso.org/iso/iso_catalogue/... (String)
. /Border Array:3
. . [0] 0 (Number)
. . [1] 0 (Number)
. . [2] 0 (Number)
. /Rect Array:4
. . [0] 82.14 (Number)
. . [1] 576.8 (Number)
. . [2] 137.1 (Number)
. . [3] 587.18 (Number)
. /StructParent 3 (Number)
. /Subtype Link (Name)
. /Type Annot (Name)
В этом документе тысячи (может быть> 10 000?) Аннотаций ссылок. /Type
ключ не обязателен, почему он там? Это невидимые прямоугольники. Как вы думаете, важна ли их точность размещения, кроме целого числа точек? Округлите его до целого числа.
Посмотрите на фрагмент типичного потока содержимого страницы, оператор отображения текста:
[(w)7(ed)-6( b)21(u)1(t shal)-6(l no)-6(t b)-6(e)1( ed)-6(ite)-6(d)1( un)-6(less the typef)23(aces wh)-6(ich )]TJ
Кернинг меньше некоторого значения практически невидим. Это значение может быть обсуждено, это похоже на уровень качества сжатия JPEG - приемлемый для некоторых, другие не согласны. Я думаю, что очень консервативная оценка (то есть сохранение наибольшего качества) с эффектом, невидимым для обычного человека, состоит в том, что кернинг с абсолютной величиной менее 10 может быть опущен. (Конечно, нужно соблюдать осторожность, чтобы сохранить оправдание). (И я даже не упоминаю, что есть файлы с дробным кернингом с точностью до 3-6 знаков после запятой! Но не в этом файле)
И, с упомянутыми выше оптимизациями, размер файла стал 7,982,478
байт. Один мегабайт сбрил. И это, конечно, не предел, может быть, другие, которые скрыты лучше, источники оптимизации.
Чтобы добавить еще несколько примечаний к и без того хорошим ответам, существует целый ряд приложений / библиотек, которые уменьшают размер файлов PDF. Первый вопрос, наряду с ответом @Jongware, заключается в том, можно ли что-нибудь сделать для начала.
Если ваши PDF-файлы поступают отовсюду (вы не можете контролировать источник), соберите образец файлов и определите, каковы ваши требования к полученным PDF-файлам. Если вы хотите показывать их только на экране, например, у вас есть возможность изменить выборку изображений с гораздо более низким разрешением (будьте осторожны, для мобильных устройств это уже не так). Если PDF-файлы являются внутренними, вам будет проще, потому что вы можете проверить их и посмотреть, где можно сохранить.
Используйте функцию Adobe Acrobat "Космический аудит". Похоже, что Adobe с удовлетворением скрывает этот прекрасный инструмент и перемещает его между версиями Acrobat, но в Acrobat Pro XI его можно найти, открыв файл PDF и выбрав "Файл> Сохранить как другое> Оптимизированный PDF..." (не "Уменьшенный размер PDF", как вы думаете). В открывшемся диалоговом окне есть кнопка "Аудит использования пространства", которая откроет информационное окно, показывающее, сколько элементов пространства используется в PDF.
В зависимости от того, что вы там найдете, вы можете сделать несколько вещей, большинство из которых уже упоминалось, но вот неполный список:
- Downsample изображений.
- Измените цветовые пространства изображений с CMYK на RGB. Будьте осторожны с этим, так как это а) не обеспечит экономию места, которое, как вы думаете, (из-за сжатия), и б) может оказаться непродуктивным, если вам не повезло (из-за индексации и других хитрых уловок изображений).
- Удалите метаданные уровня документа и объекта (у меня есть несколько примеров наборов файлов страниц журнала, которые содержат больше метаданных, чем фактическое содержимое).
- Удалите данные проприетарного приложения (у Illustrator есть неприятная привычка встраивать весь документ Illustrator в файл PDF, если вы не будете осторожны).
- Сжатие потоков объектов и таблиц XRef, если вы уверены, что все читатели, которые вы используете, смогут справиться с этим.
- Используйте оптимальное сжатие, если ваши целевые читатели с этим справятся (JBIG2, JPEG2000...)
- Оптимизируйте структуру файла (некоторые плохие файлы PDF не оптимизируют шрифты и другие объекты и будут иметь несколько копий, разбросанных по всему файлу).
- Подмножество всех шрифтов в документе.
- Удалите профили ICC, если они не нужны.
Если вы хотите выполнить эти задачи, есть много инструментов, которые могут помочь. Либо библиотеки, позволяющие вам реализовать это самостоятельно, либо коммерческие (и, возможно, другие) инструменты, которые будут работать через командную строку с предопределенными действиями. callas pdfToolbox является одним из этих инструментов (я связан с этой компанией!), Enfocus PitStop имеет функциональность в этой области, Apago также имеет функциональность здесь (хотя я не уверен, что у них есть версия командной строки верхней части моего голова).
@Jongware правильно. Маловероятно, что вы сможете значительно уменьшить размер правильно созданного файла PDF.
Но многие PDF в дикой природе могут быть сжаты лучше. Это связано с тем, что многие PDF-файлы не используют объектные и перекрестные ссылки, представленные в более новой версии спецификации PDF. Кроме того, PDF-файлы часто содержат неиспользуемые объекты, которые можно безопасно удалить. И да, изображения в PDF-файлах могут быть изменены / повторно сжаты для дальнейшего уменьшения размера PDF-файла.
Если вас устраивают коммерческие решения, возможно, вас заинтересует мой ответ на аналогичный вопрос. Ответ содержит код, который показывает, как сжимать PDF-файлы с помощью библиотеки Docotic.Pdf (я являюсь одним из разработчиков библиотеки).
Существует рубиновый камень PDFBeads.
Он работает с RubyInstaller 2.3.3 32-разрядной с DevKit. (Более высокие версии требуют излишне большого MSYS2 DevKit.)
Для Windows необходимы следующие программы:
- 32-разрядная dll-версия ImageMagick 6.9.x с заголовками разработки C/C++ ( http://ftp.icm.edu.pl/pub/graphics/ImageMagick/binaries или https://yadi.sk/d/4DGwC9Ie3Lkkgo)
- jbig2 ( http://soft.rubypdf.com/software/windows-version-jbig2-encoder-jbig2-exe или https://yadi.sk/d/4DGwC9Ie3Lkkgo)
- libiconv ( http://gnuwin32.sourceforge.net/packages/libiconv.htm)
iconv gem должен быть установлен отдельно с
gem install iconv -- --with-iconv-include="<path>" --with-iconv-lib="<path>"
(работает с простыми, короткими путями)