代码之家  ›  专栏  ›  技术社区  ›  Adam

将PDF转换为PNG

  •  68
  • Adam  · 技术社区  · 17 年前

    我正在尝试将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?

    9 回复  |  直到 17 年前
        1
  •  59
  •   Miro amosrivera    9 年前

    可以将一个命令行与两个命令一起使用( gs , convert )如果第一个命令可以将其输出写入stdout,并且第二个命令可以从stdin读取其输入,则通过管道连接。

    1. 幸运的是,GS可以写入stdout( ... -o %stdout ... )
    2. 幸运的是,convert可以从stdin读取( convert -background transparent - output.png )

    问题解决:

    • 用于处理特殊图像的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 ,…(注意 %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
    
        2
  •  22
  •   Glutanimate    13 年前

    在所有可用的替代方案中,我发现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."
    
        3
  •  12
  •   Michael M    9 年前

    要将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
  •  7
  •   turdus-merula    8 年前

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

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

    例子:

    pdftocairo -png mypage.pdf mypage.png
    
        5
  •  3
  •   Raffael    11 年前

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

    它将test.pdf的第2页保存到test.png,使用 帕格雷 编码和500 dpi。

        6
  •  2
  •   schnaader    17 年前

    这里是一个 german discussion 关于这样一个问题,对于SVG文件,使用

    convert -background transparent
    

    也许这对你也适用。

        7
  •  2
  •   polemon    14 年前

    我会添加我的解决方案,即使他认为他的线是旧的。不管怎样,这也许会对某人有所帮助。

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

    xelatex test.tex
    

    现在, ImageMagick GraphicMagic 这两个解析参数都是从左到右的,因此最左边的参数将首先执行。我最终使用这个序列来优化处理:

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

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

    我建议你检查一下密度是否可以降低。这样可以缩短转换时间。

        8
  •  2
  •   aorth    11 年前

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

    $ gm convert -quality 100 -thumbnail x300 -flatten journal.pdf\[0\] cover.jpg
    
        9
  •  1
  •   polarise Romain Abrantes    12 年前

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

    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
    
    推荐文章