ImageMagick: PDF в PNG nodejs без использования файлов? - PullRequest
1 голос
/ 08 марта 2020

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

Однако они ожидают файлы в качестве ввода и вывода.

Есть ли способ работать только в памяти / переменных вместо того, чтобы связываться с файловой системой (производительность / ресурсы здесь важны)?

Идеальный сценарий - предоставить pdf в виде строки base64 для imagemagick и получить изображение в строке base64.

Но так как imagemagick - инструмент командной строки, я понятия не имею, как это сделать sh и возможно ли это вообще? Может быть, есть способ подключиться к процессу потоковой передачи, чтобы я мог переопределить, куда идут данные (например, как-то переопределить стандартный ввод / вывод процесса imagemagick или любой другой способ накопления данных в переменной вместо отправки их в файл)

Или, если это тупик, каковы альтернативы рендеринга pdf в png в узле без использования файлов? Попробовал pdf. js какой тип это делает, но он оказался очень ненадежным в узле для этого.

Любой совет очень ценится

Ответы [ 2 ]

2 голосов
/ 10 марта 2020

Sharp может сделать это. Он использует poppler для рендеринга PDF, а не для оболочки Ghostscript, так что вы можете делать все в процессе и не касаясь файловой системы. Кроме того, он будет рендерить PDF-файлы постепенно, поэтому использование памяти остается низким.

Трудность, с которой вы столкнетесь, заключается в том, что poppler - это GPL, поэтому двоичные файлы, которые используются острыми кораблями, не включают его. Вам потребуется установить системную версию из libvips (базовая библиотека обработки изображений, которая остро использует), которая включает поддержку PDF. Вы также должны знать, что наличие библиотеки GPL, связанной с вашей программой-узлом, делает ваш код GPL тоже. Это означает, что если вы планируете продавать свою программу, вам придется отдать источник. Конечно, продавать доступ к вашей программе - это нормально.

Imagemagick - отличный инструмент, но он будет обрабатывать PDF-файлы через ghostscript, используя набор больших временных файлов.

2 голосов
/ 08 марта 2020

В командной строке ImageMagick вы можете конвертировать файлы base64 с помощью механизма INLINE :. Например:

convert 'inline:data:image/gif;base64,
      R0lGODlhIAAgAPIEAAAAAB6Q/76+vvXes////wAAAAAAAAAAACH5BAEAAAUALAAA
      AAAgACAAAAOBWLrc/jDKCYG1NBcwegeaxHkeGD4j+Z1OWl4Yu6mAYAu1ebpwL/OE
      YCDA0YWAQuJqRwsSeEyaRTUwTlxUqjUymmZpmeI3u62Mv+XWmUzBrpeit7YtB1/r
      pTAefv942UcXVX9+MjNVfheGCl18i4ddjwwpPjEslFKDUWeRGj2fnw0JADs=
    '  b64_noseguy.gif

или для передачи вывода в другой инструмент:

convert 'inline:data:image/gif;base64,
      R0lGODlhIAAgAPIEAAAAAB6Q/76+vvXes////wAAAAAAAAAAACH5BAEAAAUALAAA
      AAAgACAAAAOBWLrc/jDKCYG1NBcwegeaxHkeGD4j+Z1OWl4Yu6mAYAu1ebpwL/OE
      YCDA0YWAQuJqRwsSeEyaRTUwTlxUqjUymmZpmeI3u62Mv+XWmUzBrpeit7YtB1/r
      pTAefv942UcXVX9+MjNVfheGCl18i4ddjwwpPjEslFKDUWeRGj2fnw0JADs=
    '  GIF:- | some_other_tool - ...


Производит:

enter image description here

См. https://imagemagick.org/Usage/files/#inline

ДОПОЛНЕНИЕ:

Если вы хотите прочитать один формат base64 и записать в переменную, содержащую другую форму base64, Вы можете сделать это с INLINE: в ImageMagick следующим образом:

Считать Base64 GIF и преобразовать в Base64 JPG и сохранить в переменную:

base64jpg=$(convert 'inline:data:image/gif;base64,
R0lGODlhIAAgAPIEAAAAAB6Q/76+vvXes////wAAAAAAAAAAACH5BAEAAAUALAAA
AAAgACAAAAOBWLrc/jDKCYG1NBcwegeaxHkeGD4j+Z1OWl4Yu6mAYAu1ebpwL/OE
YCDA0YWAQuJqRwsSeEyaRTUwTlxUqjUymmZpmeI3u62Mv+XWmUzBrpeit7YtB1/r
pTAefv942UcXVX9+MjNVfheGCl18i4ddjwwpPjEslFKDUWeRGj2fnw0JADs=
' INLINE:JPG:-)


Теперь прочитайте Base64 JPG и преобразовать в PNG:

convert inline:$base64jpg noseguy_b64.png


enter image description here

Но JPG не поддерживает прозрачность, поэтому он теряется при сохранении в JPG. Таким образом, фон теперь черный вместо исходного прозрачного.

ADDITION 2:

Конвертируйте GIF в base64 PDF, а затем конвертируйте его в PNG, у меня отлично работает.

base64pdf=$(convert 'inline:data:image/gif;base64,
R0lGODlhIAAgAPIEAAAAAB6Q/76+vvXes////wAAAAAAAAAAACH5BAEAAAUALAAA
AAAgACAAAAOBWLrc/jDKCYG1NBcwegeaxHkeGD4j+Z1OWl4Yu6mAYAu1ebpwL/OE
YCDA0YWAQuJqRwsSeEyaRTUwTlxUqjUymmZpmeI3u62Mv+XWmUzBrpeit7YtB1/r
pTAefv942UcXVX9+MjNVfheGCl18i4ddjwwpPjEslFKDUWeRGj2fnw0JADs=
' INLINE:PDF:-)

convert inline:$base64pdf noseguy_b64.png


enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...