Преобразование PDF в прозрачный PNG с GhostScript - PullRequest
16 голосов
/ 10 июня 2009

Я безуспешно пытаюсь использовать Ghostscript для растеризации файлов PDF с помощью прозрачный фон для файлов PNG с прозрачным фоном. Я искал высоко и низко вопросы от других, пытающихся сделать то же самое и ни одно из опубликованных решений, которые, насколько я могу судить, сводятся к указав -sDEVICE = pngalpha, работали с моими тестовыми файлами. С этой точки зрения Буду очень признателен за любые советы или советы, которые могут сделать более опытные предоставить.

Мой тестовый PDF находится здесь: http://www.kolossus.com/files/test.pdf

Возможно, проблема в этом файле, но я сомневаюсь в этом. Насколько я могу сказать, что он не имеет заданного фона, и когда я открываю файл с прозрачное приложение, такое как Photoshop или Illustrator. отображает с прозрачным фоном. Однако при открытии с Приложение, как Adobe Reader, файл отображается на белом фоне. Я считаю, что это больше связано с приложением рендеринга PDF чем с самим PDF - приложения, такие как Adobe Reader предполагают, что вы хотите видеть как будет выглядеть напечатанный документ, и поэтому всегда будет отображаться белый холст за работой - но я не уверен.

Используемая мной команда gs:

gs -dNOPAUSE -dBATCH -sDEVICE=pngalpha -r72 -sOutputFile=test.png test.pdf

Это создает PNG с прозрачными пикселями за пределами ограничительной рамки. обложки в файле, но все пиксели, которые находятся внутри обложки ограничительные рамки растеризуются на белом фоне. Это проблема для меня, так как моя работа имеет тени и сглаженные края, которые должны быть сохраняется в окончательном выводе и не может быть просто обработан с помощью ImageMagick. Пример моего вывода PNG находится в том же месте, что и вышеупомянутый pdf, с .png в конце (stackoverflow не позволит мне включить более одного URL в моем сообщении).

Интересно, что я не вижу никаких эффектов от использования флага -dBackgroundColor, даже если я установлю что-то не белое, например -dBackgroundColor = 16 # ff0000. возможно мое понимание синтаксиса этого флага неверно.

Также интересно, что я не вижу эффектов от использования -dTextAlphaBits = 4 -dGraphicsAlphaBits = 4 флага, чтобы попытаться включить субпиксельное сглаживание. я мог бы также ценим любые советы о том, как включить сглаживание на субпикселях, особенно по тексту.

Наконец, я использую GPL Ghostscript 8.64 в Mac OS 10.5.7 и рендеринг Рабочий процесс, который я пытаюсь настроить, заключается в создании прозрачных изображений PNG из PDF выводится PrinceXML. Я вызываю Ghostscript напрямую для растеризации вместо использования ImageMagick, потому что ImageMagick делегирует Ghostscript для растеризации PDF, и я должен иметь возможность лучше контролировать растеризацию, напрямую вызывая GS.

Спасибо за вашу помощь.

- Джон Вулф

Ответы [ 3 ]

18 голосов
/ 05 февраля 2011

Я делюсь вашим опытом с флагами -dTextAlphaBits=4 и -dGraphicsAlphaBits=4. Они появляются не для работы со всеми текстами. «Исправление», которое я придумал, состояло в том, чтобы просто визуализировать изображение в 4 раза желаемого размера, а затем уменьшить его. К счастью, у ghostscript нет проблем с рендерингом гигапиксельных файлов PNG.

обновление

Ghostscript (до версии 9) также, похоже, испытывает большие проблемы при рендеринге прозрачных PNG с числом пикселей выше 2.500.000 (т. Е. 10 МБ пиксельного буфера). Прозрачный фон внезапно становится белым.

Детализируя источник ghostscript, я обнаружил, что, когда размер пиксельного буфера превышает 10 МБ, он переключается на другую схему выделения памяти. Более конкретно, изображение отображается с использованием устройства image32 вместо pngalpha. Учитывая способ реализации драйвера pngalpha, его цель исчезает, когда gs решает не использовать его pngalpha_fill_rectangle().

К счастью, есть переключатель под названием -dMaxBitmap=N для настройки этого параметра во время выполнения. Это упоминается в обходе совершенно другой ошибки, относящейся к 1999-01-15, см. http://pages.cs.wisc.edu/~ghost/doc/AFPL/5.50/relnotes/index.htm.

Добавление -dMaxBitmap=2147483647 решило для меня много проблем. В 64-битных системах это число может быть больше.

Конечно, правильным решением было бы переработать драйвер pngalpha так, чтобы он устанавливал цвет фона на 0x7f000000 независимо от фактического пути к коду, но в большинстве систем имеется достаточно оперативной памяти на борту, чтобы работать вышеуказанный прием.

2 голосов
/ 05 июня 2010

Ghostscript может обрабатывать прозрачность, только если во время сборки была выбрана опция «прозрачность». Предполагая, что ваш Ghostscript является верной версией, вы можете добавить параметр в командной строке:

... -c "0 .setopacityalpha" -f c:/path/to/file/to/be/converted.pdf

(Вы можете использовать варианты для непрозрачности в диапазоне [0..1]).

Кроме того, пытались ли вы преобразовать созданный Ghostscript .png (в случае, если фон действительно белый, а не прозрачный) в прозрачный фон с помощью ImageMagick's convert Команды GraphicMagick gm convert? Вот пример:

convert -background transparent test.png test_transp.png

Кстати , в случае, если Acrobat или AcroReader отображают все фоны страницы белым: это настройка по умолчанию даже для действительно прозрачных фонов. Вы можете изменить его в настройках приложения: IIRC параметр находился внутри параметров «Отображение страницы» и назывался s.th. как «Показать прозрачные растры». (Если бы я посмотрел это подробно, это, возможно, не очень помогло бы - Adobe продолжает менять все параметры в каждом новом выпуске. Просто покопайтесь там сами, вы обнаружите это сейчас, когда знаете, что это там.)

2 голосов
/ 29 июня 2009

Боюсь, я не могу сказать вам, что может сделать ghostscript, но у меня есть предложение. Попробуйте отрисовать PDF-файл как на черном, так и на белом фоне. Любой пиксель, который получается одинаковым на двух изображениях, явно должен быть непрозрачным (то есть альфа == 1,0). Различные пиксели имеют ненулевой альфа, который можно вычислить, вычтя пиксель черного фона из пикселя белого фона. Дайте или возьмите некоторую точность, значение любого красного, зеленого или синего компонента будет альфа-значением.

...