我正在尝试将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?
如果第一个命令可以将其输出写入stdout,并且第二个命令可以从stdin读取其输入,则可以使用一个命令行和两个通过管道连接的命令(gs
,convert
).
幸运的是,gs可以写入stdout(... -o %stdout ...
).
幸运的是,转换可以从stdin(convert -background transparent - output.png
)读取.
问题解决了:
GS用于处理特殊图像的alpha通道,
转换用于创建透明背景,
用于避免在磁盘上写出临时文件的管道.
完整解决方案
gs -sDEVICE=pngalpha \ -o %stdout \ -r144 cover.pdf \ | \ convert \ -background transparent \ - \ cover.png
如果您希望每个PDF页面都有一个单独的PNG,则可以使用以下%d
语法:
gs -sDEVICE=pngalpha -o file-%03d.png -r144 cover.pdf
这将创建名为page-000.png
,, page-001.png
...的PNG文件(请注意,%d
-counting从零开始 - file-000.png
对应于PDF的第1 001
页,第2页...
或者,如果您想保持透明背景,对于100页PDF,请执行此操作
for i in {1..100}; do \ \ gs -sDEVICE=pngalpha \ -dFirstPage="${i}" \ -dLastPage="${i}" \ -o %stdout \ -r144 input.pdf \ | \ convert \ -background transparent \ - \ page-${i}.png ; \ \ done
在所有可用的替代方案中,我发现Inkscape在将PDF转换为PNG时可以产生最准确的结果.特别是当源文件具有透明层时,Inkscape在Imagemagick和其他工具失败的地方取得了成功.
这是我使用的命令:
inkscape "$pdf" -z --export-dpi=600 --export-area-drawing --export-png="$pngfile"
在这里它是在脚本中实现的:
#!/bin/bash while [ $# -gt 0 ]; do pdf=$1 echo "Converting "$pdf" ..." pngfile=`echo "$pdf" | sed 's/\.\w*$/.png/'` inkscape "$pdf" -z --export-dpi=600 --export-area-drawing --export-png="$pngfile" echo "Converted to "$pngfile"" shift done echo "All jobs done. Exiting."
要将pdf转换为图像文件,请使用以下命令:
对于PNG gs -sDEVICE=png16m -dTextAlphaBits=4 -r300 -o a.png a.pdf
对于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
包中包含的命令行实用程序:
sudo apt-get install poppler-utils pdftoppm --help pdftocairo --help
例:
pdftocairo -png mypage.pdf mypage.png
无法获得公认的答案。然后发现实际上该解决方案无论如何都要简单得多,因为Ghostscript不仅本地支持PNG,而且甚至支持多种不同的“编码”:
png256
png16
pnggray
pngmono
...
对我有用的shell命令是:
gs -dNOPAUSE -q -sDEVICE=pnggray -r500 -dBATCH -dFirstPage=2 -dLastPage=2 -sOutputFile=test.png test.pdf
它将使用pnggray
编码和500 DPI 将test.pdf的第2页保存到test.png 。