将PDF转换为PNG


83

我正在尝试将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进行调用?


2
为什么直接调用GhostScript是一个问题?
kquinn

确实没什么大不了的。我想同时通过convert运行其他一些参数,如果可以将它们全部保留在一个命令中,那将是很好的。使我的代码更整洁,更一致。这也意味着少了一个临时文件。
亚当


您怎么称呼gs和ImageMagick怎么称呼它?可能值得在ImageMagick的上游报告一些内容(向关注者说明,更新ghostscript也会有所帮助...)
rogerdpack

Answers:


70

如果第一个命令可以将其输出写入stdout,第二个命令可以从stdin读取输入,则可以在一个命令行中使用通过管道连接的两个命令(gsconvert)。

  1. 幸运的是,gs可以写入stdout(... -o %stdout ...)。
  2. 幸运的是,convert可以从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

7
仅当我添加-dBATCH -dNOPAUSE -dQUIET到gs选项时,这才对我有用。
2013年

@ford:这意味着您具有旧版本的Ghostscript。可以使用最新版本,-o output.file并且同时自动且无提示地进行设置-dBATCH -dNOPAUSE -dQUIET
Kurt Pfeifle 2014年

@ford:但是,我在上述答案的其他地方有严重的错别字。我不知道为什么尽管如此,它还是获得了22次投票:-)
Kurt Pfeifle

工作为我找到了,但我想自动将多页pdf转换为image_1.png,image_2.png ...在一个命令中这样简单吗?我应该先从pdf文件中提取每页吗?
Tarass 2015年

好的,我分开了图像。但是我希望在转换过程中将“透明白色”作为“转换”参数。我可以用烟斗来做,但是没有?
Tarass 2015年

29

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

21

要将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

9

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

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

例:

pdftocairo -png mypage.pdf mypage.png

1
这很好。如果PDF为多页,将有多个PNG文件。
Tomasz Gandor

5

无法获得公认的答案。然后发现实际上该解决方案无论如何都简单得多,因为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 。


2

这是关于SVG文件这样的问题的德语讨论,可以通过使用来解决

convert -background transparent

也许这也对您有效。


可悲的是,那不能解决我的问题。它实际上是PDF中的图像,它具有位于所有内容之上的alpha通道。
亚当

2

我将添加我的解决方案,甚至认为他的线程很旧。也许无论如何这将帮助某人。

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

xelatex test.tex

现在,ImageMagickGraphicMagic都从左到右解析参数,因此最左边的参数将首先执行。我最终使用以下顺序进行了优化处理:

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

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

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


2

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

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

没有足够的信息来确定,但这可能是因为未正确定义色彩空间。检出-colorspace IM选项。
rivimey

2

由于此页面还列出了替代工具,因此我将提到xpdf,它具有为Linux / Windows / Mac编译的命令行工具。支持透明度。可免费用于商业用途-相对于Ghostscript而言,其价格实在令人难以置信

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

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


我现在已经使用了一段时间,并且效果很好。通常,它在高分辨率下比Ghostscript慢一些。但是图像看起来要好得多(尽管有点暗),而我可以在Ghostscript中使用的抗锯齿功能在xpdf中效果很好!
TheStoryCoder


1

我的解决方案更加简单直接。至少它可以在我的PC上以这种方式工作(具有以下规格):

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时无法在其下进行其他操作……但是,如果
可行

0

您可以使用ImageMagick而不用其他工具分隔PDF的首页。做就是了

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


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

但是,如果PDF是CMYK,则PNG不支持。由于Ghostscript无法使用alpha处理CMYK,因此需要将其转换为sRGB,尤其是具有透明性的情况。

convert -density 288 -colorspace sRGB -resize 25% cover.pdf[0] cover.png
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.