it-swarm-ru.tech

PDF в JPG без потери качества; gscan2pdf

Когда я конвертирую файл PDF в кучу файлов JPG, используя

convert -quality 100 file.pdf page_%04d.jpg

У меня заметная потеря качества.

Однако, если я сделаю следующее, нет (заметной) потери качества:

Запустите gscan2pdf, выберите file-> import (и выберите file.pdf). Затем перейдите во временный каталог gscan2pdf. Существует множество файлов pnm (по одному на каждую страницу pdf-файла). Сейчас делаю

  for file in *.pnm; do            
  convert $file $file.jpg done

Получающиеся jpg-файлы (примерно) того же качества, что и исходный pdf (что я и хочу).

Теперь мой вопрос: есть ли простой способ командной строки для преобразования файла PDF в набор файлов JPG без заметной потери качества? (Решение выше является слишком сложным и трудоемким).

56
student

Непонятно, что вы подразумеваете под "потерей качества". Это может означать много разных вещей. Не могли бы вы опубликовать несколько образцов для иллюстрации? Возможно, вырежьте тот же раздел из версий низкого качества и хорошего качества (как PNG, чтобы избежать дальнейшей потери качества).

Возможно, вам нужно использовать -density для преобразования с более высоким dpi:

convert -density 300 file.pdf page_%04d.jpg

(При необходимости вы можете добавить -units PixelsPerInch или -units PixelsPerCentimeter. Моя копия по умолчанию имеет значение ppi.)

Обновление: Как вы указали, gscan2pdf (то, как вы его используете) - это просто оболочка для pdfimages (из poppler ). pdfimages не делает то же самое, что convert делает при вводе PDF в качестве ввода.

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

pdfimages просматривает PDF встроенные растровые изображения и экспортирует каждое из них в файл. Он просто игнорирует любые текстовые или векторные команды рисования в PDF.

В результате, если у вас есть PDF, который является просто оберткой для ряда растровых изображений, pdfimages сделает намного лучшую работу по их извлечению, потому что он получает необработанные данные на своем первоначальный размер. Возможно, вы также захотите использовать параметр -j для pdfimages, поскольку PDF может содержать необработанные данные JPEG. По умолчанию pdfimages преобразует все в формат PNM, а преобразование JPEG> PPM> JPEG - процесс с потерями.

Поэтому постарайтесь

pdfimages -j file.pdf page

Вам может потребоваться, а может и не понадобиться, с шагом convert to .jpg (в зависимости от того, какой формат растрового изображения использовал PDF).

Я попробовал эту команду на PDF, который я сделал сам из последовательности изображений JPEG. Извлеченные файлы JPEG были побайтно идентичны исходным изображениям. Вы не можете получить более высокое качество, чем это.

101
cjm

В ответе ученика сказано, что pdfimages - хороший вариант. Исходя из моего опыта, gs и ​​convert экспортируются с низким качеством независимо от того, правильно ли вы указали dpi.

Но если pdf имеет несколько слоев на странице pdfimages, не работает и извлекает слои как отдельное изображение, в этом случае лучше всего использовать inskcape для экспорта страницы, как видно.

Это команды, которые я использую:

pdftk combined_to_do.pdf burst output pg_%04d.pdf
ls ./pg*.pdf | xargs -L1 -I {}  inkscape {} -z --export-dpi=300 --export-area-drawing --export-png={}.png

Первая команда разбивает все страницы, вторая команда преобразует страницу за страницей в png. Вы можете сохранить их PNG или просто конвертировать их в JPEG

ls ./p*.png | xargs -L1 -I {} convert {}  -quality 100 -density 300 {}.jpg

По сравнению с pdfimages, gs и ​​ImageMagick's convert, экспорт inkscape является лучшим по качеству.

4
Eduard Florinescu

ответ @cjm правильный, но если вам нравится GUI и вы не хотите отображать все страницы PDF, просто чтобы получить изображение, используйте gimp.

Откройте pdf с помощью gimp, и вы получите окно импорта со всеми отображаемыми страницами. Выберите нужные страницы и установите разрешение 600 пикселей/дюйм (во многих случаях я обнаружил, что резкость слишком велика на 300). Сохранить в нужный формат с помощью "Файл/экспорт"

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

3
albfan

Глядя на исходный код gscan2pdf, я заметил, что он использует pdfimages. Так pdfimages file.pdf page приведет к page-001.ppm, page-002.ppm так далее.

2
student

Что неясно в вашем вопросе, так это то, говорите ли вы о текстовой и векторной графике в вашем PDF-файле или содержит ли ваш PDF-файл встроенные изображения.

Прочитав, что такое gscan2pdf, я предполагаю, что ваши PDF-файлы содержат (только) встроенную графику.

convert по сути "печатает" ваш pdf безотносительно к содержанию. Как подсказывает @cjm, вы можете изменить плотность печати. Это единственный способ повысить качество векторной графики.

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

2
asoundmove