将PDF转换为PNG

Ada*_*dam 76 pdf png image imagemagick ghostscript

我正在尝试将PDF转换为PNG图像(至少是一个封面).我用pdftk成功地提取了PDF的第一页.我正在使用imagemagick进行转换:

convert cover.pdf cover.png
Run Code Online (Sandbox Code Playgroud)

这很有效,但不幸的是,cover.png通过错误渲染(PDF中的某些alpha对象无法正确呈现).我知道ImageMagick使用GhostScript进行转换,如果我直接使用gs我可以得到所需的结果,但我宁愿使用转换库,因为它有其他我想要利用的工具.

GhostScript中的此命令可完成所需的图像:

gs -sDEVICE=pngalpha -sOutputFile=cover.png -r144 cover.pdf
Run Code Online (Sandbox Code Playgroud)

我想知道有没有办法通过转换为GhostScript传递参数,还是我坚持直接调用GhostScript?

Kur*_*fle 64

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

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

问题解决了:

  • GS用于处理特殊图像的alpha通道,
  • 转换用于创建透明背景,
  • 用于避免在磁盘上写出临时文件的管道.

完整解决方案

gs -sDEVICE=pngalpha       \
   -o %stdout              \
   -r144 cover.pdf         \
   |                       \
convert                    \
   -background transparent \
   -                       \
    cover.png
Run Code Online (Sandbox Code Playgroud)

更新

如果您希望每个PDF页面都有一个单独的PNG,则可以使用以下%d语法:

gs -sDEVICE=pngalpha -o file-%03d.png -r144 cover.pdf
Run Code Online (Sandbox Code Playgroud)

这将创建名为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
Run Code Online (Sandbox Code Playgroud)

  • 这只适用于我,如果我将`-dBATCH -dNOPAUSE -dQUIET`添加到gs选项中. (7认同)

Glu*_*ate 27

在所有可用的替代方案中,我发现Inkscape在将PDF转换为PNG时可以产生最准确的结果.特别是当源文件具有透明层时,Inkscape在Imagemagick和其他工具失败的地方取得了成功.

这是我使用的命令:

inkscape "$pdf" -z --export-dpi=600 --export-area-drawing --export-png="$pngfile"
Run Code Online (Sandbox Code Playgroud)

在这里它是在脚本中实现的:

#!/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."
Run Code Online (Sandbox Code Playgroud)


yan*_*pas 14

要将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 - 字体抗锯齿.
  • -r300 - 300 dpi


tur*_*ula 9

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

sudo apt-get install poppler-utils
pdftoppm --help
pdftocairo --help
Run Code Online (Sandbox Code Playgroud)

例:

pdftocairo -png mypage.pdf mypage.png
Run Code Online (Sandbox Code Playgroud)


Raf*_*ael 5

无法获得公认的答案。然后发现实际上该解决方案无论如何都要简单得多,因为Ghostscript不仅本地支持PNG,而且甚至支持多种不同的“编码”

  • png256
  • png16
  • pnggray
  • pngmono
  • ...

对我有用的shell命令是:

gs -dNOPAUSE -q -sDEVICE=pnggray -r500 -dBATCH -dFirstPage=2 -dLastPage=2 -sOutputFile=test.png test.pdf
Run Code Online (Sandbox Code Playgroud)

它将使用pnggray编码和500 DPI 将test.pdf的第2页保存到test.png 。