ImageMagick:不使用文件的 PDF 到 PNG nodejs?
ImageMagick: PDF to PNG nodejs without using files?
我需要创建一个端点以在 nodejs 中将 pdf 呈现为图像,在尝试不同的方法后 imagemagick/ghostscript 似乎是最佳选择。
但是他们期望文件作为输入和输出。
有没有办法只在 memory/variables 中工作而不是弄乱文件系统(performance/resources 是一个问题)?
理想的场景是将 pdf 作为 base64 字符串提供给 imagemagick,并以 base64 字符串获取图像。
但是由于 imagemagick 是一个命令行工具,我完全不知道如何实现它,以及它是否可能?也许有一种方法可以连接到流式处理过程中,这样我就可以覆盖数据的去向(比如以某种方式覆盖 imagemagick 进程的 stdin/stdout 或任何将数据累积在变量中而不是将其发送到文件的方法)
或者,如果这是一个死胡同,有什么替代方法可以在不使用文件的情况下在节点中将 pdf 渲染为 png?
尝试了 pdf.js 哪种方法,但它在节点中似乎非常不可靠。
非常感谢任何建议
在ImageMagick命令行中,您可以使用INLINE:机制转换base64文件。例如:
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 - ...
产出:
见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
但是JPG不支持透明度,所以保存为JPG时丢失了。因此背景现在是黑色的,而不是原来的透明。
补充 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
sharp can do this. It uses poppler 用于 PDF 渲染,而不是外包到 Ghostscript,因此您可以在不接触文件系统的情况下进行所有处理。它也会逐步呈现 PDF,因此内存使用率保持较低。
你会遇到的困难是 poppler 是 GPL,所以 sharp ships 的二进制文件不包含它。您需要 install a system version of libvips(sharp 使用的底层图像处理库)包含 PDF 支持。您还需要注意,将 GPL 库链接到您的节点程序也会使您的代码成为 GPL。这意味着如果您打算出售您的程序,则必须放弃源代码。出售对您的程序的访问权当然可以。
Imagemagick 是一个很棒的工具,但它会使用一组大型临时文件通过 ghostscript 处理 PDF。
我需要创建一个端点以在 nodejs 中将 pdf 呈现为图像,在尝试不同的方法后 imagemagick/ghostscript 似乎是最佳选择。
但是他们期望文件作为输入和输出。
有没有办法只在 memory/variables 中工作而不是弄乱文件系统(performance/resources 是一个问题)?
理想的场景是将 pdf 作为 base64 字符串提供给 imagemagick,并以 base64 字符串获取图像。
但是由于 imagemagick 是一个命令行工具,我完全不知道如何实现它,以及它是否可能?也许有一种方法可以连接到流式处理过程中,这样我就可以覆盖数据的去向(比如以某种方式覆盖 imagemagick 进程的 stdin/stdout 或任何将数据累积在变量中而不是将其发送到文件的方法)
或者,如果这是一个死胡同,有什么替代方法可以在不使用文件的情况下在节点中将 pdf 渲染为 png? 尝试了 pdf.js 哪种方法,但它在节点中似乎非常不可靠。
非常感谢任何建议
在ImageMagick命令行中,您可以使用INLINE:机制转换base64文件。例如:
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 - ...
产出:
见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
但是JPG不支持透明度,所以保存为JPG时丢失了。因此背景现在是黑色的,而不是原来的透明。
补充 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
sharp can do this. It uses poppler 用于 PDF 渲染,而不是外包到 Ghostscript,因此您可以在不接触文件系统的情况下进行所有处理。它也会逐步呈现 PDF,因此内存使用率保持较低。
你会遇到的困难是 poppler 是 GPL,所以 sharp ships 的二进制文件不包含它。您需要 install a system version of libvips(sharp 使用的底层图像处理库)包含 PDF 支持。您还需要注意,将 GPL 库链接到您的节点程序也会使您的代码成为 GPL。这意味着如果您打算出售您的程序,则必须放弃源代码。出售对您的程序的访问权当然可以。
Imagemagick 是一个很棒的工具,但它会使用一组大型临时文件通过 ghostscript 处理 PDF。