我正在尝试将PDF转换为PNG图像(至少是一个封面) . 我用pdftk成功地提取了PDF的第一页 . 我正在使用imagemagick进行转换:
convert cover.pdf cover.png
这很有效,但不幸的是,cover.png通过错误渲染(PDF中的某些alpha对象无法正确呈现) . 我知道ImageMagick使用GhostScript进行转换,如果我直接使用gs我可以得到所需的结果,但我宁愿使用转换库,因为它有其他我想要利用的工具 .
GhostScript中的此命令可完成所需的图像:
gs -sDEVICE=pngalpha -sOutputFile=cover.png -r144 cover.pdf
我想知道有没有办法通过转换为GhostScript传递参数,还是我坚持直接调用GhostScript?
9 回答
这是一个关于SVG文件这样的问题的german discussion,它通过使用来解决
也许这也适合你 .
如果第一个命令可以将其输出写入stdout,并且第二个命令可以从stdin读取其输入,则可以使用一个命令行和两个通过管道连接的命令(
gs
,convert
) .幸运的是,gs可以写入stdout(
... -o %stdout ...
) .幸运的是,转换可以从stdin(
convert -background transparent - output.png
)读取 .问题解决了:
GS用于处理特殊图像的alpha通道,
转换用于创建透明背景,
管道用于避免在磁盘上写出临时文件 .
Complete solution:
更新
如果您希望每个PDF页面都有一个单独的PNG,则可以使用
%d
语法:这将创建名为
page-000.png
,page-001.png
,...的PNG文件(注意%d
-counting是从零开始的 -file-000.png
对应于PDF的第1页,001
对应于第2页...或者,如果您想保持透明背景,对于100页PDF,请执行此操作
在所有可用的替代方案中,我发现Inkscape在将PDF转换为PNG时可以产生最准确的结果 . 特别是当源文件具有透明层时,Inkscape在Imagemagick和其他工具失败的地方取得了成功 .
这是我使用的命令:
在这里它是在脚本中实现的:
要将pdf转换为图像文件,请使用以下命令:
For PNG
gs -sDEVICE=png16m -dTextAlphaBits=4 -r300 -o a.png a.pdf
For JPG
gs -sDEVICE=jpeg -dTextAlphaBits=4 -r300 -o a.jpg a.pdf
如果您有多个页面添加到名称 %03d
gs -o a%03d.jpg a.pdf
每个选项的含义:
sDEVICE = {jpeg,pngalpha,png16m ...} - filetype
-o - 输出文件(%stdout到stdout)
-dTextAlphaBits = 4 - 字体抗锯齿 .
-r300 - 300 dpi
也可以使用
poppler-utils
包中包含的命令行实用程序:例:
无法获得接受的工作答案 . 然后发现实际上解决方案实际上要简单得多,因为Ghostscript不仅本身支持PNG,甚至multiple different "encodings":
png256
png16
pnggray
pngmono
......
适合我的shell命令是:
它将使用
pnggray
编码和500 DPI将test.pdf的第2页保存到test.png .我会添加我的解决方案,甚至认为他的线程已经老了 . 也许这对任何人都有帮助 .
首先,我需要生成PDF . 我使用XeLaTeX:
现在,ImageMagick和GraphicMagic都从左到右解析参数,因此最左边的参数将首先执行 . 我最终使用此序列进行最佳处理:
它在透明背景上提供漂亮的图形,修剪到页面上的实际内容 .
-density
和-resize
参数可提供更好的粒度,并提高整体分辨率 .我建议检查密度是否可以降低 . 它会减少转换时间 .
对于ImageMagick提供不准确颜色的PDF,我发现GraphicsMagick做得更好:
我的解决方案更简单,更直接 . 至少它在我的电脑上运行(具有以下规格):
同
所以,这是我在
file.pdf
上运行的内容: