Image 将PDF转换为PNG

Image 将PDF转换为PNG,image,pdf,png,imagemagick,ghostscript,Image,Pdf,Png,Imagemagick,Ghostscript,我正在尝试将PDF转换为PNG图像(至少是其中一个的封面)。我正在使用pdftk成功提取PDF的第一页。我正在使用imagemagick进行转换: convert cover.pdf cover.png 这是可行的,但遗憾的是cover.png的渲染不正确(PDF中的一些alpha对象没有正确渲染)。我知道ImageMagick使用GhostScript进行转换,如果我直接使用gs进行转换,我可以获得所需的结果,但我更愿意使用转换库,因为它还有其他我想要利用的工具 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

我想知道有什么方法可以通过convert to GhostScript传递参数,还是我只能直接调用GhostScript?

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

  • 幸运的是,gs可以写入标准输出(
    …-o%stdout…
  • 幸运的是,convert可以读取stdin(
    convert-background transparent-output.png
  • 解决的问题:

    • 用于alpha通道处理特殊图像的GS
    • 转换用于创建透明背景
    • 用于避免在磁盘上写入临时文件的管道
    完整解决方案:

    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
    

    我会添加我的解决方案,即使他的线程是旧的。也许这将帮助别人无论如何

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

    xelatex test.tex
    
    现在,两个从左到右的解析参数,也就是最左边的参数,都将首先执行。最后,我使用以下顺序进行优化处理:

    gm convert -trim -transparent white -background transparent -density 1200x1200 -resize 25% test.pdf test.png
    
    它在透明背景上提供了漂亮的图形,并根据页面上的实际内容进行了修剪。
    -density
    -resize
    参数提供了更好的粒度,提高了整体分辨率


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

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

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

    下面是我在
    文件.pdf中运行的内容:

    me@home: my.folder$ convert -density 300 -quality 100 file.pdf file.png
    

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

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

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

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

    如果您有多个页面,请添加到name%03d
    gs-o a%03d.jpg a.pdf

    每个选项的含义:

    • sDEVICE={jpeg,pngalpha,png16m…}-文件类型
    • -o-输出文件(%stdout到stdout)
    • -dTextAlphaBits=4-字体抗锯齿
    • -r300-300 dpi

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

        sudo apt-get install poppler-utils
        pdftoppm --help
        pdftocairo --help
        
        例如:

        pdftocairo -png mypage.pdf mypage.png
        

        由于本页还列出了可供选择的工具,我将提到,该工具已准备好为Linux/Windows/Mac编译命令行工具。支持透明性。可免费用于商业用途,而Ghostscript的定价实在太高了

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


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

        您可以使用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
        

        尝试提取单个页面

        $page=4

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

        为什么直接调用GhostScript是一个问题?这真的没什么大不了的。我想同时通过convert运行一些其他参数,如果我能将所有参数都保存在一个命令中就好了。保持我的代码更干净、更一致。这也意味着少了一个临时文件。另请参见和。调用gs和d ImageMagick如何称呼它?可能值得向ImageMagick上游报告一些事情(请关注,更新ghostscript也有帮助…)这只适用于我在gs选项中添加
        -dBATCH-dNOPAUSE-dQUIET
        。@ford:这意味着你有一个旧版本的Ghostscript。最新版本可以执行
        -o输出.file
        ,同时自动且无声地设置
        -dBATCH-dNOPAUSE-dQUIET
        。@ford:但是,我有一个
        convert -density 288 -colorspace sRGB -resize 25% cover.pdf[0] cover.png
        
        gs -sDEVICE=pngalpha -dFirstPage="$page" -dLastPage="$page" -o thumb.png -r144 input.pdf