将 PDF 转换为 PNG

Posted

技术标签:

【中文标题】将 PDF 转换为 PNG【英文标题】:Converting a PDF to PNG 【发布时间】:2010-10-13 19:04:06 【问题描述】:

我正在尝试 图像(至少是一张的封面)。我正在使用 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?

【问题讨论】:

为什么直接调用 GhostScript 有问题? 这真的没什么大不了的。我想同时通过 convert 运行一些其他参数,如果我可以将它们全部保存在一个命令中,那就太好了。让我的代码更干净、更一致。这也意味着少了一个临时文件。 另见PDFBox: Problem with converting pdf page into image和Use Apache PDFBox convert PDF to image。 gs 的调用方式和 ImageMagick 的调用方式有什么区别?可能值得向 ImageMagick 报告上游的内容(关注者请注意,更新 ghostscript 也会有所帮助......) 【参考方案1】:

如果第一个命令可以将其输出写入标准输出,并且第二个命令可以从标准输入读取其输入,则您可以使用一个命令行与通过管道连接的两个命令(gsconvert)。

    幸运的是,gs 可以写入标准输出 (... -o %stdout ...)。 幸运的是,convert 可以从标准输入 (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.pngpage-001.png、... 的 PNG 文件(请注意,%d 计数是从零开始的 -- 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

【讨论】:

这仅适用于我在 gs 选项中添加 -dBATCH -dNOPAUSE -dQUIET 的情况。 @ford:这意味着你有一个旧版本的 Ghostscript。最近的版本可以做-o output.file,这会自动和静默地同时设置-dBATCH -dNOPAUSE -dQUIET @ford:但是,我在上述答案的其他地方有一个严重的错字。我想知道为什么它得到了 22 票,尽管如此:-) 为我找到工作,但我想自动将多页 pdf 转换为 image_1.png、image_2.png ... 我应该先从 pdf 文件中提取每一页,这在一个命令中是否容易? 好的,我已经分离了图像。但我想在转换过程中将“-transparence white”作为“转换”参数。我可以用管道做到这一点,但没有?【参考方案2】:

在所有可用的替代方案中,我发现 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."

【讨论】:

请注意,--export-png 现在已弃用。如果要从文件名中推断导出类型,只需使用 --export-filename="$pngfile",或者使用 --export-filename="$pngfile" --export-type="png" 明确【参考方案3】:

要将 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... - 文件类型 -o - 输出文件(%stdout 到 stdout) -dTextAlphaBits=4 - 字体抗锯齿。 -r300 - 300 dpi

【讨论】:

有用的答案,但不是这个问题...【参考方案4】:

也可以使用poppler-utils 包中包含的命令行实用程序:

sudo apt-get install poppler-utils
pdftoppm --help
pdftocairo --help

例子:

pdftocairo -png mypage.pdf mypage.png

【讨论】:

非常好。如果 PDF 是多页的,则会有多个 PNG 文件。【参考方案5】:

无法获得公认的答案。然后发现实际上解决方案要简单得多,因为 Ghostscript 不仅原生支持 PNG,甚至还支持 multiple different "encodings":

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。

【讨论】:

这很好用。作为一个小补充,我想补充一点,在输出中附加一个“%d”会为每页创建一个新文件。这使得命令看起来像这样: gs -dNOPAUSE -q -sDEVICE=pnggray -r500 -dBATCH -dFirstPage=2 -dLastPage=5 -sOutputFile=output%d.png input.pdf【参考方案6】:

我会添加我的解决方案,即使他的帖子很旧。也许这无论如何都会对某人有所帮助。

首先,我需要生成 PDF。我为此使用XeLaTeX:

xelatex test.tex

现在,ImageMagick 和GraphicMagic 都从左到右解析参数,所以最左边的参数将首先执行。我最终使用此序列进行优化处理:

gm convert -trim -transparent white -background transparent -density 1200x1200 -resize 25% test.pdf test.png

它在透明背景上提供漂亮的图形,修剪到页面上的实际内容。 -density-resize 参数提供了更好的粒度,并提高了整体分辨率。

我建议检查是否可以为您降低密度。它会减少转换时间。

【讨论】:

【参考方案7】:

对于 ImageMagick 提供不准确颜色的 PDF,我发现 GraphicsMagick 做得更好:

$ gm convert -quality 100 -thumbnail x300 -flatten journal.pdf\[0\] cover.jpg

【讨论】:

没有足够的信息来确定,但这可能是因为颜色空间没有正确定义。查看 -colorspace IM 选项。【参考方案8】:

由于此页面还列出了替代工具,我将提及 xpdf,它具有已为 Linux/Windows/Mac 编译的命令行工具。支持透明度。可免费用于商业用途 - 与具有真正离谱定价的 Ghostscript 相对。

在一个巨大的 PDF 文件的测试中,它比 Ghostscript 快 7.5%。

(它也有 PDF 到文本和 html 转换器)

【讨论】:

我现在已经使用了一段时间,它工作得很好。一般来说,虽然分辨率更高,但它比 Ghostscript 慢一些。但是图像看起来更好(虽然有点暗)和抗锯齿,我可以在 Ghostscript 中工作,在 xpdf 中效果很好!【参考方案9】:

尝试提取单个页面。

$page = 4

gs -sDEVICE=pngalpha -dFirstPage="$page" -dLastPage="$page" -o thumb.png -r144 input.pdf

【讨论】:

【参考方案10】:

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

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 时,在下面工作时无法得到其他错误......但如果它有效,那就去吧:)【参考方案11】:

您可以使用 ImageMagick,而无需将 PDF 的第一页与其他工具分开。做吧

convert -density 288 cover.pdf[0] -resize 25% cover.png

在这里,我将标称密度增加 400% (72*4=288),然后调整大小 1/4 (25%)。这为生成的 png 提供了更好的质量。

但是,如果 PDF 是 CMYK,PNG 不支持。它需要转换为 sRGB,特别是如果它具有透明度,因为 Ghostscript 无法处理带有 alpha 的 CMYK。

convert -density 288 -colorspace sRGB -resize 25% cover.pdf[0] cover.png

【讨论】:

以上是关于将 PDF 转换为 PNG的主要内容,如果未能解决你的问题,请参考以下文章

UWP C# 将 png 转换为 pdf

如何使用java将PNG文件转换为PDF?

使用 ImageMagick 将 PNG 文件转换为 PDF 时出现粗糙的边缘

Mac:无法将 .pdf 转换为 .png - GS 错误

在服务器模式下使用 Ghostscript 将 PDF 转换为 PNG

sh 将PDF转换为png