Сжатие PDF-файлов

У меня есть требование динамически создавать и сжимать большие партии файлов PDF.

Рассматриваю обычные алгоритмы

  • Почтовый индекс
  • Туз
  • Рар

Любые другие предложения приветствуются.

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

Также имеет значение, много ли у меня маленьких файлов или меньше файлов большего размера в каждом архиве.

Большая часть моей обработки будет выполняться на PHP, но я счастлив при необходимости взаимодействовать со сторонними исполняемыми файлами.

Изменить:

Документы представляют собой в первую очередь счета-фактуры и не должны содержать никаких других изображений, кроме логотипа компании.


person Neil Aitken    schedule 23.11.2009    source источник
comment
Во многом это зависит от того, есть ли в документе изображения и в каком формате они находятся. Возможно, вы захотите добавить туда некоторую информацию.   -  person Pekka    schedule 23.11.2009
comment
Но PDF уже сжат, не так ли? en.wikipedia.org/wiki/Portable_Document_Format   -  person Pierre    schedule 23.11.2009
comment
@Pekka Спасибо, внес правку. @Pierre Да, PDF-файл уже сжат, но я думаю, что его можно сжать и дальше, также каждый архив будет содержать несколько PDF-файлов, поэтому там может быть разница.   -  person Neil Aitken    schedule 23.11.2009
comment
См. Мой ответ для хорошего решения уже сжатой проблемы.   -  person schnaader    schedule 23.11.2009
comment
Могли ли быть проблемы с использованием "нестандартного" формата сжатия, т.е. у получателя должна быть программа, которая позволила бы им распаковать файл. Если файл отправляется людям, не имеющим доступа администратора к своему компьютеру, или тем, кто не хочет устанавливать неизвестное программное обеспечение, у вас может быть проблема. Таким образом, zip может быть лучшим вариантом, так как его можно разархивировать в Windows без какого-либо программного обеспечения. Очевидно, все зависит от того, кому вы отправляете файл.   -  person andyface    schedule 23.11.2009
comment
@Andy Сжатые файлы предназначены только для архивирования. Заказчик получит стандартный файл PDF.   -  person Neil Aitken    schedule 23.11.2009


Ответы (6)


У меня не было большого успеха сжимать PDF-файлы. Как уже отмечалось, они уже сжаты при составлении (хотя некоторые инструменты для создания PDF-файлов позволяют указать «уровень сжатия»). Если это вообще возможно, первый подход, который вам следует предпринять, - это уменьшить размер скомпонованных PDF-файлов.

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

По моему опыту, довольно сложно сжимать изображения в PDF-файлах, и именно изображения оказывают наибольшее влияние на размер файла. Перед началом убедитесь, что у вас есть оптимизированные изображения. Стоит даже запустить тестовый прогон без ваших изображений, чтобы просто посмотреть, какой размер они вносят.

Другой компонент - это шрифт, и если вы используете несколько встроенных шрифтов, вы упаковываете больше данных в файл. Просто используйте один шрифт, чтобы уменьшить размер, или используйте шрифты, которые обычно устанавливаются, чтобы их не нужно было встраивать.

person Kirk Broadhurst    schedule 23.11.2009

Я думаю, что 7z - лучший в настоящее время, а RAR - второй, но я бы порекомендовал вам попробовать оба, чтобы узнать, что лучше всего подходит для вас.

person dusoft    schedule 23.11.2009

LZMA - лучший вариант, если вам нужен файл наименьшего размера.

И, конечно, PDF может быть сжат сам.

person silent    schedule 23.11.2009
comment
Спасибо, кажется, новые версии 7z действительно используют LZMA - person Neil Aitken; 23.11.2009

Я сомневаюсь, что вы получите много / какое-либо уменьшение размера файла при сжатии PDF-файлов. Однако, если все, что вы делаете, это собираете несколько файлов в один, почему бы не tar это сделать?

person Skilldrick    schedule 23.11.2009

Мы делали это в прошлом для больших (и многих) PDF-файлов, в которых хранится много текста - «Учебные пакеты для учебных организаций в Австралии». Это примерно 96% текста (информация о курсе и т. Д.) И несколько небольших диаграмм. Размеры варьируются от 1-2 Мбайт до 8 или 9 Мбайт, и обычно они бывают объемом 4 или более.

Мы обнаружили, что сжатие с помощью Zip OK дает хорошее сжатие, поскольку формат PDF уже сильно сжат, и нашим пользователям было проще загружать все это пакетно, а не беспокоиться о размерах файлов. Чтобы дать вам представление, файл размером 2,31 МБ - много текста, несколько полностраничных диаграмм - сжат до 1,92 МБ в ZIP и 1,90 МБ в RAR.

Я бы порекомендовал использовать LZMA, чтобы получить лучший обзор использования ресурсов при сжатии и распаковке.

Насколько велики эти файлы? Получите копию WinRAR, WinAce и 7Zip и отдайте ее назад.

person Thushan Fernando    schedule 23.11.2009
comment
Спасибо за подробную информацию. Сейчас я играю с разными алгоритмами, чтобы посмотреть, какой из них дает хорошие показатели. 7z, работающий в LZMA, пока что кажется лучшим - person Neil Aitken; 23.11.2009

Совместите мой отличный инструмент Precomp с 7-Zip. Он распаковывает потоки zLib внутри PDF, поэтому 7-Zip (или любой другой компрессор) может лучше справиться с ними. Вы получите размер файла около 50% от исходного размера без потерь. Этот инструмент особенно хорошо работает с файлами PDF, но также хорош для других сжатых (zLib / LZW) потоков как ZIP / GZip / JAR / GIF / PNG ...

Примеры результатов см. здесь или здесь. Скорость может быть низкой для части предварительного сжатия (PDF-> PCF), но будет очень высокой для части рекомпрессии / реконструкции (PCF-> PDF).

Для получения даже лучших результатов, чем с Precomp + 7-Zip, вы можете попробовать варианты lprepaq и prevq, но будьте осторожны, особенно, когда с помощью PreqQ есть slooww :) - яркая сторона заключается в том, что PreQQ предлагает лучшее сжатие (PDF), доступное в настоящее время.

person schnaader    schedule 23.11.2009
comment
Спасибо, я разберусь с этим. Хотя, возможно, придется убедить боссов использовать неизвестный инструмент. - person Neil Aitken; 23.11.2009
comment
Текущая версия все еще является тестовой, но работает нормально. На всякий случай вы можете убедиться, что восстановленные PDF-файлы имеют одинаковую md5sum, или сравнить их в другом месте. - person schnaader; 23.11.2009
comment
Хорошая идея, мы в любом случае используем MD5 для проверки целостности импорта, поэтому сохранение хэша сгенерированного файла не проблема. - person Neil Aitken; 23.11.2009
comment
Интересно - сделай больше, чтобы стало меньше! - person RichardOD; 03.12.2009