Преобразование PDF в прозрачный PNG с GhostScript
Я пытаюсь, безуспешно, использовать 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 и рендеринг
workflow Я пытаюсь настроить, чтобы генерировать прозрачные изображения PNG из
PDF файлы, выпущенные PrinceXML. Я вызываю Ghostscript непосредственно для растеризации вместо использования ImageMagick, потому что ImageMagick делегирует Ghostscript для растеризации PDF, и я должен иметь возможность лучше контролировать растрирование, вызвав GS напрямую.
Спасибо за вашу помощь.
-Jon Wolfe
Ответы
Ответ 1
Поделитесь опытом с флагами -dTextAlphaBits=4
и -dGraphicsAlphaBits=4
. Кажется, что они не работают над всеми текстами. "Исправление", которое я придумал, состояло в том, чтобы просто сделать изображение в 4 раза нужным размером, а затем масштабировать изображение вниз. К счастью, ghostscript не имеет проблем с рендерингом файлов PNG в формате gigapixel.
Обновление
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
Боюсь, я не могу сказать вам, что может сделать ghostscript, но у меня есть предложение. Попробуйте сделать свой PDF как с черным, так и с белым фоном. Любой пиксель, который выходит одинаково на двух изображениях, явно был непрозрачным (например, alpha == 1.0). Пиксели, которые отличаются друг от друга, имеют ненулевую альфу, которая может быть вычислена путем вычитания черного фонового пикселя из белого фонового пикселя. Дайте или возьмите некоторую точность, значение любого красного, зеленого или синего компонента будет альфа-значением.
Ответ 3
Ghostscript может обрабатывать прозрачность только в том случае, если во время сборки была выбрана опция "прозрачность". Предполагая, что ваш Ghostscript является правильной версией, вы можете добавить параметр в командной строке:
... -c "0 .setopacityalpha" -f c:/path/to/file/to/be/converted.pdf
(Вы можете использовать варианты непрозрачности в диапазоне [0..1]).
Кроме того, попытались ли вы преобразовать созданный Ghostscript.png(если фон действительно белый, а не прозрачный) на прозрачный фон с помощью команд ImageMagick convert
или GraphicMagick gm convert
? Вот пример:
convert -background transparent test.png test_transp.png
BTW, если Acrobat или AcroReader отображают все фоновые страницы страниц как белые: это значение по умолчанию даже для действительно прозрачных фонов. Вы можете изменить его в настройках настройки приложения: IIRC параметр находился внутри опций "Отображение страницы" и назван s.th. например, "Показывать прозрачные растры". (Если бы я посмотрел его подробно, это, возможно, не помогло бы слишком сильно - Adobe все время перемещает все варианты в каждом новом выпуске. Просто сориентируйтесь там сами, вы найдете это сейчас, когда вы это знаете.)
Ответ 4
У меня такая же проблема, я пытался использовать imagemagick, но, к сожалению, это не работает для меня http://www.imagemagick.org/discourse-server/viewtopic.php?f=1&t=13462 вы можете проверить возможно, это сработает для вас.