首页 文章

将PDF转换为PNG

提问于
浏览
69

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

  • 2

    这是一个关于SVG文件这样的问题的german discussion,它通过使用来解决

    convert -background transparent
    

    也许这也适合你 .

  • 8

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

    • 幸运的是,gs可以写入stdout( ... -o %stdout ... ) .

    • 幸运的是,转换可以从stdin( convert -background transparent - output.png )读取 .

    问题解决了:

    • GS用于处理特殊图像的alpha通道,

    • 转换用于创建透明背景,

    • 管道用于避免在磁盘上写出临时文件 .

    Complete solution:

    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 -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
    
  • 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

    要将pdf转换为图像文件,请使用以下命令:

    For PNG gs -sDEVICE=png16m -dTextAlphaBits=4 -r300 -o a.png a.pdf

    For 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 - 字体抗锯齿 .

    • -r300 - 300 dpi

  • 12

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

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

    例:

    pdftocairo -png mypage.pdf mypage.png
    
  • 2

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

  • 3

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

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

    xelatex test.tex
    

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

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

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

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

  • 1

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

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

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

    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
    

相关问题