将PDF转换为PNG
我试图将PDF转换为PNG图像(至less是一个封面)。 我正在用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?
如果第一个命令可以将其输出写入标准输出,并且第二个命令可以从标准input读取其input,那么可以使用一个带有两个通过pipe道连接的命令( gs
, convert
)的命令行。
- 幸运的是,gs可以写入标准输出(
... -o %stdout ...
)。 - 幸运的是,转换可以从标准input读取(
convert -background transparent - output.png
)。
问题解决了:
- GS用于alpha通道处理特殊图像,
- 转换用于创build透明背景,
- 用于避免在磁盘上写出临时文件的pipe道。
完整解决scheme
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
这将创build名为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
在所有可用的备选scheme中,我发现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
如果您有多个页面,请添加名称gs -oa%03d.jpg a.pdf
每个选项意味着什么:
- sDEVICE = {jpeg,pngalpha,png16m …} – 文件types
- -o – 输出文件(%stdout到stdout)
- -dTextAlphaBits = 4 – 字体抗锯齿。
- -r300 – 300 dpi
这里是一个关于这样的SVG文件的问题的德国讨论 ,它通过使用解决
convert -background transparent
也许这也适用于你。
我会添加我的解决scheme,甚至认为他的线程是旧的。 也许这会帮助别人。
首先,我需要生成PDF。 我使用XeLaTeX :
xelatex test.tex
现在, ImageMagick和GraphicMagic都从左向右parsing参数,所以最左边的参数将首先被执行。 我最终使用这个序列进行了优化处理:
gm convert -trim -transparent white -background transparent -density 1200x1200 -resize 25% test.pdf test.png
它在透明的背景上提供了很好的graphics,并修剪成实际上在页面上的内容。 -resize
和-resize
参数,提供更好的粒度,并提高总体分辨率。
我build议检查一下密度是否可以降低。 这将减less转换时间。
对于ImageMagick给出的不准确颜色的PDF,我发现GraphicsMagick做得更好:
$ gm convert -quality 100 -thumbnail x300 -flatten journal.pdf\[0\] cover.jpg
我的解决scheme更简单,更直接。 至less它在我的电脑上工作(具有以下规格):
me@home: my.folder$ uname -a Linux home 3.2.0-54-generic-pae #82-Ubuntu SMP Tue Sep 10 20:29:22 UTC 2013 i686 i686 i386 GNU/Linux
同
me@home: my.folder$ convert --version Version: ImageMagick 6.6.9-7 2012-08-17 Q16 http://www.imagemagick.org Copyright: Copyright (C) 1999-2011 ImageMagick Studio LLC Features: OpenMP
所以,这是我在我的file.pdf
上运行的:
me@home: my.folder$ convert -density 300 -quality 100 file.pdf file.png
无法获得接受的工作答案。 然后发现,实际上解决scheme是非常简单的,因为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将pnggray
第2页保存到test.png。
也可以使用poppler-utils
包中包含的命令行工具:
sudo apt-get install poppler-utils pdftoppm --help pdftocairo --help
例:
pdftocairo -png mypage.pdf mypage.png