将PDF转换为PNG

93

我正在尝试将PDF转换为PNG图像(至少是其中的封面)。我已经成功地使用pdftk提取了PDF的第一页。我正在使用imagemagick进行转换:

convert cover.pdf cover.png

这个方法能够运行,但不幸的是 cover.png 文件渲染出现了问题(PDF文件中一些alpha对象没有被正确地渲染)。 我知道 ImageMagick 使用 GhostScript 进行转换,如果我直接使用 gs 命令就可以得到所需的结果,但我宁愿使用 convert 库,因为它有其他工具我想要利用。

以下是 GhostScript 中的命令,可以得到所需的图像:

gs -sDEVICE=pngalpha -sOutputFile=cover.png -r144 cover.pdf

我想知道是否有办法通过将参数传递到GhostScript来进行转换,还是只能直接调用GhostScript?


3
直接调用GhostScript为什么是个问题? - kquinn
这真的不是什么大问题。我想同时运行一些其他参数通过转换,如果我能保持所有在一个命令中,那就太好了。这可以使我的代码更加清晰和一致。这也意味着少一个临时文件。 - Adam
你如何调用gs和ImageMagick如何调用它之间有什么区别?值得向ImageMagick上游报告一些问题(注意更新ghostscript也可能有所帮助...) - rogerdpack
我在使用pdftoppm时运气最佳:https://askubuntu.com/a/50180/951756 - SurpriseDog
12个回答

0

我的解决方案更简单、更直接。至少在我的电脑上(具备以下规格)是这样的:

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

是的,这就是OP最初尝试的方法,但当ImageMagick调用ghostscript时,无法使某些错误的东西正常工作...但如果它能够正常工作,那就使用它吧 :) - rogerdpack

0

我研究了提供的答案,然后将它们与我的扫描仪进行了比较,该扫描仪可以扫描为PDF或图像(通常为JPEG)。我发现以下内容:

  • 通常扫描仪以300 DPI工作,有时在600 DPI或150 DPI以下
  • 扫描的图像通常是完整的24位RGB颜色(每个波段8位),通常被压缩为JPEG
  • 然而,PNG通常用于数字绘画,通常是带调色板的8位
  • PDF通常是多页的,而PNG和JPEG通常是单页的

当从PDF转换为PNG时,我们必须问自己是否要使用默认的300 DPI,还是要以更高分辨率的600 DPI或更低分辨率的150 DPI重新采样图像。我们还必须问自己PDF是否包含照片,因此我们需要24位图像,即png16m。或者,如果PDF只包含数字文档,主要是黑白文本,但可能包含有限数量的颜色,则8位图像格式就足够了,即png256。我们还需要问自己是否想要访问多个页面,还是满足于一个页面。

对于其余的答案,我将假设300 DPI和不包含照片的数字文件,即8位格式(或256色格式)。

对于单页提取,我确定需要的参数是PDFPNGPAGENO

#!/bin/bash
# Usage: pdf2png.sh input.pdf output.png pageno
PDF=$1
PNG=$2
PAGENO=$3
FORMAT=png256 # png16m png16 pngmono
DPI=300 # 600 150
cmd=(gs)
cmd+=(-dNOPAUSE)
cmd+=(-q)
cmd+=(-sDEVICE=${FORMAT})
cmd+=(-r${DPI})
cmd+=(-dBATCH)
cmd+=(-dFirstPage=${PAGENO})
cmd+=(-dLastPage=${PAGENO})
cmd+=(-sOutputFile=${PNG})
cmd+=(${PDF})
${cmd[@]}

对于多页提取,我需要确定需要的参数为PDFDIR

#!/bin/bash
# Usage: pdf2pngs.sh input.pdf outputdir
PDF=$1
DIR=$2
FORMAT=png256 # png16m png16 pngmono
DPI=300 # 600 150
mkdir -p ${DIR}
cmd=(gs)
cmd+=(-dNOPAUSE)
cmd+=(-q)
cmd+=(-sDEVICE=${FORMAT})
cmd+=(-r${DPI})
cmd+=(-dBATCH)
cmd+=(-sOutputFile=${DIR}/'p%d.png')
cmd+=(${PDF})
${cmd[@]}

要将页面重新组合成PNG,我们可以使用ImageMagick的convert命令,如下所示:

#!/bin/bash
# pngs2pdf.sh dir output.pdf
DIR=$1
PDF=$2
convert ${DIR}/*.png ${PDF}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接