Вопрос или проблема
У меня есть PDF, созданный с помощью PDF Sandwich. Каждая страница PDF содержит фоновое изображение и некоторый текст на переднем плане.
Я хочу уменьшить размер файла (не разрешение) фонового изображения и сохранить возможность выделения текста.
- Использование
convert
от ImageMagick уменьшает размер, но удаляет текст. ps2pdf
не существенно уменьшает размер файла.gs -sDEVICE=pdfwrite -dPDFSETTINGS=/screen …
уменьшает разрешение, но кажется, что не пере сжимает изображения.qpdf --compress-streams=y --recompress-flate --optimize-images in.pdf out.pdf
дает лишь незначительное изменение.
Если я извлеку фоновое изображение и использую pngquant
или подобное, размер файла сокращается значительно. Но у меня нет возможности использовать это новое изображение для замены старого.
Есть ли способ сжать изображения в PDF, сохранив текст нетронутым?
Как предложено в комментариях, выполнение pdfimages -list output.pdf
дает:
страница номер тип ширина высота цвет комп бцп кодировка интерполяция ID объекта x-ppi y-ppi размер соотношение
--------------------------------------------------------------------------------------------
1 0 изображение 3483 4800 rgb 3 8 jpeg нет 11 0 300 300 1147K 2.3%
2 1 изображение 3483 4800 rgb 3 8 jpeg нет 24 0 300 300 397K 0.8%
3 2 изображение 3483 4800 rgb 3 8 jpeg нет 37 0 300 300 1441K 2.9%
4 3 изображение 3483 4800 rgb 3 8 jpeg нет 50 0 300 300 1880K 3.8%
5 4 изображение 3483 4800 gray 1 8 jpeg нет 63 0 300 300 1050K 6.4%
…
qpdf
имеет режимы для пере сжатия потоков данных и особенно изображений в PDF.
Итак, что-то вроде
qpdf --compress-streams=y --recompress-flate --optimize-images in.pdf out.pdf
ocrmypdf
– изначально разработанный для применения OCR (tesseract) к PDF предлагает способ оптимизации размера PDF с использованием кодировщика JBIG2 и pngquant
под капотом. Это может быть недостающим звеном для вас, чтобы использовать pngquant
и действительно заменить изображения.
Вот пример генерации PDF (не архивного PDF). В моем случае он уменьшил размер скана на 75%:
ocrmypdf [-l eng] --output-type pdf --optimize 3 input.pdf output.pdf
Обратите внимание, что у него есть очевидный побочный эффект – извлечение текста из вашего документа. Вы можете отключить это, используя параметры --tesseract-timeout=0 --skip-text
(что также ускоряет процесс).
Ответ или решение
Чтобы уменьшить размер файла PDF, содержащего текст на фоне изображения, важно учитывать несколько аспектов. Ваша задача состоит в том, чтобы сохранить текст в формате PDF доступным для выделения, при этом эффективно значительно сжимая размеры изображений. Рассмотрим основные методы и инструменты, которые могут помочь в этом процессе.
1. Инструменты для работы с PDF
PDF Sandwich — это мощное средство, но Для конкретной задачи по оптимизации файла нам необходимо использовать другие инструменты, так как методы, такие как ImageMagick
и ps2pdf
, работают не всегда оптимально, так как они могут удалить текст или не дать нужного эффекта сжатия.
2. Исследование содержимого PDF
Первым шагом к успешному сжатию PDF является анализ его содержимого с помощью команды:
pdfimages -list yourfile.pdf
Это позволит вам получить информацию о всех изображениях на страницах PDF, включая их размер, формат и сжатие. У вас есть изображения в формате JPEG, которые занимают большую часть объема файла.
3. Оптимизация изображений
В случае, если вы хотите использовать улучшенные алгоритмы сжатия изображений, вам следует рассмотреть использование инструмента pngquant
для преобразования изображений в PNG формата с лучшей компрессией. Имейте в виду, что извлечение изображений из PDF и последующая их замена может быть трудоемким процессом.
4. Использование OCRmyPDF
Рекомендуется использовать ocrmypdf
для достижения желаемого результата. Этот инструмент имеет возможность не только проводить оптическое распознавание текста, но также оптимизировать PDF файлы, применяя алгоритмы сжатия.
Пример команды для оптимизации файла:
ocrmypdf [-l eng] --output-type pdf --optimize 3 input.pdf output.pdf
Параметры команды:
-l eng
— указывает язык для распознавания, если необходимо.--output-type pdf
— устанавливает вывод в формате PDF.--optimize 3
— максимизирует сжатие, используя передовые методы, такие как JPEG 2000, JBIG2 и сжатие PNG черезpngquant
.
Если вы хотите сохранить исходный текст без распознавания, вы можете добавить следующие опции для ускорения процесса:
--tesseract-timeout=0 --skip-text
Эти параметры позволят игнорировать встраивание текста, что сэкономит время обработки.
Заключение
Оптимизация размеров PDF-файла с текстом и изображениями может быть выполнена с помощью различных инструментов. Используя ocrmypdf
, вы можете быстро и эффективно уменьшить размер файла, сохраняя текст в доступном для выделения формате. Это решение позволяет сохранить качество, избежать удаления текста и достичь необходимых результатов по сжатию.
Не забудьте протестировать полученный файл, чтобы убедиться, что все элементы, включая текст и изображения, остались в вашем PDF исправными и доступны для дальнейшего использования.