PDFからPNGへの変換
-
19-08-2019 - |
質問
PDFをPNG画像(少なくとも1つの表紙)に変換しようとしています。 PDFの最初のページをpdftkで正常に抽出しています。私はimagemagickを使用して変換を行っています:
convert cover.pdf cover.png
これは機能しますが、残念ながら、cover.pngは正しくレンダリングされません(PDFのアルファオブジェクトの一部は適切にレンダリングされません)。 ImageMagickはGhostScriptを使用して変換を行い、gsで直接実行すると、目的の結果が得られることを知っていますが、活用したい他のツールがあるため、convertライブラリを使用します。
GhostScriptのこのコマンドは、目的のイメージを実現します。
gs -sDEVICE=pngalpha -sOutputFile=cover.png -r144 cover.pdf
GhostScriptへの変換を介して引数を渡す方法はありますか、それともGhostScriptを直接呼び出す必要がありますか?
解決
最初のコマンドがその出力をstdoutに書き込むことができ、2番目のコマンドがstdinから入力を読み取ることができる場合、パイプを介して接続された2つのコマンド(gs
、convert
)で1つのコマンドラインを使用できます。
- 幸い、gsはstdout(
... -o %stdout ...
)に書き込むことができます。 - 幸い、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.png
、page-001.png
、...という名前のPNGファイルが作成されます(file-000.png
-countingはゼロベースです-001
はPDFのページ1に対応し、<=>はページ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を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."
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
poppler-utils
パッケージに含まれるコマンドラインユーティリティも使用できます。
sudo apt-get install poppler-utils
pdftoppm --help
pdftocairo --help
例:
pdftocairo -png mypage.pdf mypage.png
受け入れられた仕事の答えを得ることができませんでした。次に、実際にはGhostscriptがPNGをネイティブにサポートするだけでなく、 multipleでさえあるため、実際にはソリューションがはるかに簡単であることがわかりました。異なる<!> quot; encodings <!> quot; :
-
png256
-
png16
-
pnggray
-
pngmono
- ...
私のために働くシェルコマンドは次のとおりです:
gs -dNOPAUSE -q -sDEVICE=pnggray -r500 -dBATCH -dFirstPage=2 -dLastPage=2 -sOutputFile=test.png test.pdf
<=>エンコーディングと500 DPIを使用して、test.pdfのページ2をtest.pngに保存します。
彼のスレッドが古いと思っても、ソリューションを追加します。とにかく、これは誰かを助けるでしょう。
最初に、PDFを生成する必要があります。そのために XeLaTeX を使用します:
xelatex test.tex
現在、 ImageMagick および GraphicMagic は両方ともパラメーターを左から右に解析するため、左端のパラメーターが最初に実行されます。最適な処理のためにこのシーケンスを使用することになりました:
gm convert -trim -transparent white -background transparent -density 1200x1200 -resize 25% test.pdf test.png
透明な背景に素敵なグラフィックを提供し、実際にページにあるものにトリミングします。 -density
および-resize
パラメーターは、より良い粒度を提供し、全体的な解像度を高めます。
密度を下げることができるかどうかを確認することをお勧めします。変換時間を短縮します。
ImageMagickが不正確な色を与えているPDFの場合、GraphicsMagickの方が優れていることがわかりました。
$ gm convert -quality 100 -thumbnail x300 -flatten journal.pdf\[0\] cover.jpg
私のソリューションは、はるかにシンプルで、より直接的です。少なくとも私の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
with
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
このページには、 xpdf に言及する代替ツールもリストされています。 Linux / Windows / Mac用にコンパイルされたコマンドラインツールが用意されています。透明性をサポートします。 本当にとんでもない価格設定のGhostscriptとは対照的に、商用利用は無料です。
巨大なPDFファイルのテストでは、Ghostscriptより7.5%高速でした。
(PDFからテキストおよびHTMLへのコンバーターもあります)
単一のページを抽出してみてください。
$ page = 4
gs -sDEVICE=pngalpha -dFirstPage="$page" -dLastPage="$page" -o thumb.png -r144 input.pdf
他のツールで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