web-dev-qa-db-ja.com

PDFからPNGへの変換

PDFをPNG画像(少なくとも1つの表紙)に変換しようとしています。PDFの最初のページを正常に抽出していますpdftkを使用して、変換を行うためにimagemagickを使用しています。

convert cover.pdf cover.png

これは機能しますが、残念ながら、cover.pngは正しくレンダリングされません(PDFのアルファオブジェクトの一部は適切にレンダリングされません)。ImageMagickはGhostScriptを使用して変換を行い、 gsを使用して直接実行すると、目的の結果を得ることができますが、活用したい他のツールがあるので、変換ライブラリを使用したいです。

GhostScriptのこのコマンドは、目的のイメージを実現します。

gs -sDEVICE=pngalpha -sOutputFile=cover.png -r144 cover.pdf

変換を介してGhostScriptに引数を渡す方法はありますか、GhostScriptを直接呼び出すことに固執していますか?

73
Adam

最初のコマンドがその出力をstdoutに書き込むことができ、2番目のコマンドがstdinから入力を読み取ることができる場合、パイプを介して接続された2つのコマンド(gsconvert)で1つのコマンドラインを使用できます。

  1. 幸い、gsはstdout(... -o %stdout ...)に書き込むことができます。
  2. 幸い、convertはstdin(convert -background transparent - output.png)から読み取ることができます。

問題が解決しました:

  • 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.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
63
Kurt Pfeifle

使用可能なすべての選択肢の中から、PDFをPNGに変換するときにInkscapeが最も正確な結果を生成することがわかりました。特にソースファイルに透明なレイヤーがある場合、Imagemagickやその他のツールが失敗した場所でInkscapeは成功しました。

これは私が使用するコマンドです:

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."
26
Glutanimate

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

複数のページを名前に追加する場合%03dgs -o a%03d.jpg a.pdf

各オプションの意味:

  • sDEVICE = {jpeg、pngalpha、png16m ...}-ファイルタイプ
  • -o-出力ファイル(%stdoutからstdout)
  • -dTextAlphaBits = 4-フォントのアンチエイリアス。
  • -r300-300 dpi
13
yanpas

poppler-utilsパッケージに含まれるコマンドラインユーティリティも使用できます。

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

例:

pdftocairo -png mypage.pdf mypage.png
9
turdus-merula

受け入れられた答えを得ることができませんでした。次に、実際にはGhostscriptがPNGをネイティブでサポートするだけでなく、 複数の異なる「エンコーディング」 であるため、実際にはソリューションがはるかに簡単であることがわかりました。

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

私のために働くシェルコマンドは次のとおりです。

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
Raffael

彼のスレッドが古いと思っても、ソリューションを追加します。とにかくこれは誰かを助けるでしょう。

まず、PDFを生成する必要があります。そのために XeLaTeX を使用します。

xelatex test.tex

ここで、 ImageMagick および GraphicMagic は両方ともパラメーターを左から右に解析するため、左端のパラメーターが最初に実行されます。最適な処理のためにこのシーケンスを使用することになりました:

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

透明な背景に素敵なグラフィックを与え、実際にページ上にあるものにトリミングします。 -densityおよび-resizeパラメータ、より良い粒度を与え、全体的な解像度を上げます。

密度を下げることができるかどうかを確認することをお勧めします。変換時間を短縮します。

2
polemon

これは ドイツ語の議論 を使用して解決されるSVGファイルのこのような問題についてです

convert -background transparent

おそらくこれもあなたのために働くでしょう。

2
schnaader

PDF ImageMagickが不正確な色を与えていたため、GraphicsMagickがより良い仕事をしたことがわかりました。

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

このページには、私が言及する代替ツールもリストされているので、xpdfLinux/Windows/Mac用にコンパイルされたコマンドラインツールが用意されています。透明性をサポートします。 本当にとんでもない価格設定があるGhostscriptとは対照的に、商用利用は無料です。

巨大なPDFファイルでのテストでは、Ghostscriptより7.5%高速でした。

(PDFテキストおよびHTMLコンバーターへ)

1
TheStoryCoder

私のソリューションは、はるかにシンプルで、より直接的です。少なくとも私のPCでは次のように動作します(次の仕様を使用):

[email protected]: 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

[email protected]: 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

[email protected]: my.folder$ convert -density 300 -quality 100 file.pdf file.png
1
polarise

単一のページを抽出してみてください。

$ page = 4

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

PDFの最初のページを他のツールで分離することなく、ImageMagickを使用できます。

convert -density 288 cover.pdf[0] -resize 25% cover.png


ここで、名目密度を400%(72 * 4 = 288)増やし、その後1/4(25%)にサイズ変更します。これにより、生成されるPNGの品質が大幅に向上します。

ただし、PDFがCMYKの場合、PNGはそれをサポートしません。Ghostscriptはアルファ付きのCMYKを処理できないため、特に透明性がある場合は、sRGBに変換する必要があります。

convert -density 288 -colorspace sRGB -resize 25% cover.pdf[0] cover.png
0
fmw42