Как дистиллировать / растеризовать PDF в Linux

13

В нашем офисе есть принтер, который печатает PDF-файлы с USB-накопителя. Он печатает большинство файлов в порядке, но есть проблемы с некоторыми, особенно сгенерированными с помощью Latex. Некоторые PDF-файлы просто отказываются печатать, некоторые PDF-файлы печатаются шрифтом курьерского типа, а некоторые - нормально, за исключением уравнений.

Я ищу способ «перегонять» PDF-файлы в надежный формат для печати. Либо путем упрощения / нормализации PDF до такой степени, что любое средство визуализации отобразит его правильно, либо путем простого создания каждой страницы растрового изображения с разрешением 600 точек на дюйм в PDF. (Я мог бы разбить PDF на отдельные растровые изображения и объединить их вручную, но я хочу что-нибудь для сценариев.)

Размер выходного файла не имеет значения, поскольку он обязательно печатается, имеет формат бумаги A4 (или оригинал) и разрешение 300 ~ 600 точек на дюйм.

Sampo
источник
Может быть, pdf2ps может помочь, если принтер поддерживает PostScript.
Фрлан
Предполагается, что это принтер PostScript, но эта поддержка даже хуже, чем у PDF (и он не будет печатать PS с USB-накопителя).
Сампо

Ответы:

22

После неудачной попытки некоторых опций отобразить шрифты в виде контуров (включая этот вопрос и pstoedit), я нашел способ легко преобразовать PDF в растеризованную форму с помощью ImageMagick:

convert -density 600 +antialias input.pdf output.pdf

Это создает PDF-файл, отображаемый с разрешением 600 точек на дюйм с отключенным сглаживанием (в этом разрешении нет необходимости).

Выходные файлы огромны (~ 30 МБ для 8-страничного документа) и чрезвычайно медленны для печати, но должны работать до тех пор, пока у принтера будет достаточно памяти для визуализации содержимого.

Sampo
источник
1
Да! Я использовал это, чтобы сгладить слои в моем PDF с большим успехом. + antialias не был необходим, потому что у нас были только изображения (это не имело никакого значения), и я снизил разрешение до 150, поскольку это казалось достаточно хорошим для архивирования, не занимая так много места. Благодаря!
mlissner
2
Обратите внимание, что convertэто не сохраняет содержимое форм, которые вы могли заполнить. (Я хотел растеризовать PDF, чтобы убедиться, что содержимое формы везде выглядит одинаково, в частности, что оно будет отображаться всеми программами просмотра PDF в первую очередь.) Чтобы сохранить содержимое формы, используйте evince(или что-то еще приложение, которое вы использовали для заполнения формы), чтобы напечатать документ «в файл» - это еще один PDF, где содержимое формы фактически стало частью обычного текста. Тогда вы все равно можете растеризовать этот новый PDF, в зависимости от ваших потребностей.
Балу
Обратите внимание, что это включает сглаживание ( +antialias), а не выключает его ( -antialias).
xiii1408
Нет, +antialiasотключает сглаживание: imagemagick.org/script/command-line-options.php?#antialias
Sampo
1
Мне нужно настроить imagemagick ( stackoverflow.com/questions/42928765/… ), чтобы сделать эту работу.
SteveSong
1

По моему опыту, использование imagemagick нестабильно при высоких разрешениях и / или больших файлах. Многие принтеры могут работать с разрешением 1200 т / д и выше, поэтому растеризованный файл должен иметь аналогичное разрешение. Лучшее решение - использовать pdf2djvu, который работает быстрее, надежнее и даже создает файлы с размером, который часто конкурирует с оригинальным PDF при 1200 или 2400 dpi. Эти файлы могут быть просмотрены и распечатаны с использованием okular или evince.

Пример:

pdf2djvu -d 2400 file.pdf > rastered.djvu
MJO
источник
1

Я думаю, что мой текущий предпочтительный способ сделать это:

  1. Используйте pdftoppm для преобразования файла PDF в серию изображений.

    $ pdftoppm source.pdf output -png

  2. Используйте img2pdf для создания файла PDF из этих изображений.

    $ img2pdf * .png -o output.pdf

Хорошей новостью является то, что вы можете создать скрипт bash, чтобы автоматизировать весь процесс для вас.

Вот скрипт bash, который перегонит все файлы pdf в каталоге и сохранит оригиналы в новом каталоге «оригиналы».

#!/bin/bash

mkdir "originals";
for filename in ./*.pdf; do
    pdftoppm "$filename" output -png
    mv "$filename" ./originals
    img2pdf *.png "-o" "$filename"
    rm *.png
done

Кредиты: img2pdf answer & pdftoppm answer & bash script help: 1 & 2

(Примечание) Вы можете установить img2pdf используя:

$ sudo apt install img2pdf

Майкл
источник
-1

Другой альтернативой является преобразование в изображения через что-то вроде

pdfimages

Со страницы man "Pdfimages сохраняет изображения из файла Portable Document Format (PDF) в формате Portable Pixmap (PPM), Portable Bitmap (PBM) или JPEG. Pdfimages считывает PDF-файл PDF-файла, сканирует одну или несколько страниц и записывает один файл PPM, PBM или JPEG для каждого изображения, image-root-nnn.xxx, где nnn - номер изображения, а xxx - тип изображения (.ppm, .pbm, .jpg). "

Затем используйте pdftk для конвертации обратно в PDF https://www.pdflabs.com/docs/pdftk-cli-examples/

Наконец, распечатайте этот файл. Очевидно, ключевой вопрос заключается в том, как написать это.

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

dtbnguyen
источник
3
pdfimages извлекает встроенные растровые изображения из файлов PDF, но не растеризует текст или векторную графику.
Сампо