将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道连接的命令( gsconvert )的命令行。

  1. 幸运的是,gs可以写入标准输出( ... -o %stdout ... )。
  2. 幸运的是,转换可以从标准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.pngpage-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