86

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

4

11 回答 11

73

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

  1. 幸运的是,gs 可以写入标准输出 ( ... -o %stdout ...)。
  2. 幸运的是,convert 可以从 stdin ( convert -background transparent - output.png) 中读取。

问题解决了:

  • 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.png这将创建名为, , ... 的PNG 文件page-001.png(请注意,%d-counting 是从零开始的 -file-000.png对应于 PDF 的第 1001页,第 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
于 2010-07-31T20:14:02.793 回答
33

在所有可用的替代方案中,我发现 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."
于 2013-03-18T18:59:30.967 回答
23

要将 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
于 2015-11-04T17:52:10.553 回答
11

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

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

例子:

pdftocairo -png mypage.pdf mypage.png
于 2017-09-23T13:24:24.030 回答
7

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

于 2015-03-17T19:50:05.950 回答
2

我会添加我的解决方案,即使他的线程很旧。也许这无论如何都会对某人有所帮助。

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

xelatex test.tex

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

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

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

我建议检查是否可以为您降低密度。它将减少转换时间。

于 2012-07-11T12:04:44.367 回答
2

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

$ gm convert -quality 100 -thumbnail x300 -flatten journal.pdf\[0\] cover.jpg
于 2015-09-02T07:00:16.040 回答
2

由于此页面还列出了替代工具,因此我将提到xpdf,它具有为 Linux/Windows/Mac 编译的命令行工具。支持透明度。可免费用于商业用途 - 与 Ghostscript 相比,它的定价确实离谱。

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

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

于 2019-06-28T16:09:19.173 回答
2

尝试提取单个页面。

$页 = 4

gs -sDEVICE=pngalpha -dFirstPage="$page" -dLastPage="$page" -o thumb.png -r144 input.pdf
于 2019-08-05T01:37:18.043 回答
1

我的解决方案更简单、更直接。至少它在我的 PC 上以这种方式工作(具有以下规格):

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
于 2013-11-16T13:41:00.557 回答
0

您可以使用 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
于 2019-06-28T16:16:11.760 回答