将PDF转换为PNG

时间:2009-03-17 08:18:52

标签: image pdf png imagemagick ghostscript

我正在尝试将PDF转换为PNG图像(至少是一个的封面)。我用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?

12 个答案:

答案 0 :(得分:62)

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

  1. 幸运的是,gs可以写入stdout(... -o %stdout ...)。
  2. 幸运的是,转换可以从标准输入(convert -background transparent - output.png)读取。
  3. 问题解决了:

    • 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对应于第1页PDF,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
    

答案 1 :(得分:22)

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

答案 2 :(得分:12)

要将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 ...} - filetype
  • -o - 输出文件(%stdout到stdout)
  • -dTextAlphaBits = 4 - font antialiasing。
  • -r300 - 300 dpi

答案 3 :(得分:8)

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

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

示例:

pdftocairo -png mypage.pdf mypage.png

答案 4 :(得分:3)

无法获得已接受的工作答案。然后发现实际上解决方案实际上要简单得多,因为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。

答案 5 :(得分:2)

这是关于SVG文件的问题的german discussion,其中使用

解决了这个问题
convert -background transparent

也许这也适合你。

答案 6 :(得分:2)

我会添加我的解决方案,甚至认为他的线程已经过时了。也许这对任何人都有帮助。

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

xelatex test.tex

现在,ImageMagickGraphicMagic都从左到右解析参数,因此最左边的参数将首先执行。我最终使用这个序列进行最佳处理:

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

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

我建议检查密度是否可以降低。它会缩短转换时间。

答案 7 :(得分:2)

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

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

答案 8 :(得分:1)

我的解决方案更简单,更直接。至少它在我的电脑上运行(具有以下规格):

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

答案 9 :(得分:0)

此页面还列出了其他工具,我将提到 xpdf ,该工具具有为Linux / Windows / Mac编译的命令行工具。支持透明度。免费用于商业用途-相对于Ghostscript而言,价格非常荒唐

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

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

答案 10 :(得分:0)

您可以使用ImageMagick而不用其他工具分隔PDF的首页。随便

convert cover.pdf[0] cover.png


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

convert -colorspace sRGB cover.pdf[0] cover.png

答案 11 :(得分:0)

尝试提取单个页面。

$ page = 4

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