web-dev-qa-db-ja.com

品質を損なうことなくpdfからjpgに; gscan2pdf

私が使用してpdfファイルをたくさんのjpgファイルに変換するとき

convert -quality 100 file.pdf page_%04d.jpg

かなりの品質の低下があります。

ただし、次のようにすると、(目立った)品質の低下はありません。

Gscan2pdfを起動し、ファイル->インポート(そしてfile.pdfを選択)を選択します。次に、gscan2pdfの一時ディレクトリに移動します。多くのpnmファイルがあります(pdfファイルのページごとに1つ)。今私がやります

  for file in *.pnm; do            
  convert $file $file.jpg done

結果のjpgファイルは、(ほぼ)元のpdfと同じ品質です(これが私が望んでいるものです)。

さて、私の質問は、目立った品質の低下なしにPDFファイルを一連のJPGファイルに変換する簡単なコマンドラインの方法がある場合です。 (上記のソリューションは複雑すぎて時間がかかります)。

56
student

「品質の低下」が何を意味するのかは明確ではありません。それは多くの異なることを意味する可能性があります。説明のためにいくつかのサンプルを投稿できますか?おそらく、同じ部分を低品質バージョンと高品質バージョンから切り取ります(さらなる品質低下を避けるためにPNGとして)。

おそらく、より高いdpiで変換するには-densityを使用する必要があります。

convert -density 300 file.pdf page_%04d.jpg

(必要に応じて、-units PixelsPerInchまたは-units PixelsPerCentimeterを付加できます。私のコピーはデフォルトでppiです。)

更新:ご指摘のとおり、gscan2pdf(使用方法)はpdfimagesのラッパーにすぎません(from poppler )。 pdfimagesは、PDFが入力として与えられた場合にconvertが行うことと同じことを行いません。

convertはPDFを受け取り、それをある解像度でレンダリングし、結果のビットマップをソース画像として使用します。

pdfimagesはPDFを介して埋め込まれたビットマップ画像を探し、それぞれをファイルにエクスポートします。 PDF内のテキストまたはベクター描画コマンドはすべて無視されます。

その結果、あなたが持っているものがPDFである場合、それは一連のビットマップの単なるラッパーであり、pdfimagesは生データを取得するので、それらを抽出するはるかに優れた仕事をします元のサイズで。 PDFには未加工のJPEGデータを含めることができるため、-jオプションをpdfimagesに使用することもできます。デフォルトでは、pdfimagesはすべてをPNM形式に変換し、JPEG> PPM>の変換は不可逆なプロセスです。

だから、試してみてください

pdfimages -j file.pdf page

convertから.jpgの手順を実行する必要がある場合とない場合があります(PDFが使用していたビットマップ形式によって異なります)。

一連のJPEG画像から作成したPDFでこのコマンドを試しました。抽出されたJPEGは、ソースイメージとバイトごとに同一でした。それ以上のクオリティはありません。

101
cjm

学生の答えが言ったように、pdfimagesは良いオプションです。私の経験から、正しいdpiを指定しても、gsconvertはどちらも低品質にエクスポートされます。

ただし、PDFにページごとに複数のレイヤーがある場合、pdfimagesは機能せず、レイヤーを個別の画像として抽出します。その場合、inskcapeを使用してページをエクスポートすることをお勧めします。

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

pdftk combined_to_do.pdf burst output pg_%04d.pdf
ls ./pg*.pdf | xargs -L1 -I {}  inkscape {} -z --export-dpi=300 --export-area-drawing --export-png={}.png

最初のコマンドはすべてのページを分割し、2番目のコマンドはページごとにpngに変換します。あなたはそれらをpngのままにするか、単にそれらをjpegに変換することができます

ls ./p*.png | xargs -L1 -I {} convert {}  -quality 100 -density 300 {}.jpg

pdfimagesgs、およびImageMagickのconvertと比較すると、inkscapeのエクスポートが最高品質であることがわかります。

4

@cjmからの応答は正しいですが、GUIが好きで、すべてのpdfページをレンダリングしたくない場合は、単に画像を取得するために、gimpを使用します。

GimpでPDFを開くと、すべてのページがレンダリングされたインポートウィンドウが表示されます。必要なページを選択し、解像度を600 pix /インチに設定します(多くの場合、300がシャープになりすぎることがわかりました)。 「ファイル/エクスポート」で希望のフォーマットに保存

とにかく、コマンドラインから目的のページを選択するためのフラグが必要です。

3
albfan

Gscan2pdfのソースコードを見ると、pdfimagesを使用していることがわかりました。そう pdfimages file.pdf pagepage-001.ppm, page-002.ppmなど.

2
student

質問で明確でないのは、PDF内のテキストおよびベクターグラフィックスについて話しているのか、またはPDFに埋め込み画像が含まれているかどうかです。

Gscan2pdfについて読んだところで、あなたのpdfファイルには(のみ)埋め込みグラフィックが含まれていると思います。

convertは、内容が何であるかに関係なく、基本的にPDFを「印刷」します。 @cjmが提案するように、印刷密度を変更したい場合があります。これは、ベクターグラフィックの品質を向上させる唯一の方法です。

代わりに、埋め込み画像を抽出したい場合(gscan2pdfがそうであるように)、密度を推測すると、通常、品質の低下または必要以上の品質(およびディスク領域の浪費)が発生します。答えは、PDFを印刷するのではなく、画像を抽出することです。 この記事を参照 基本的には、品質を損なうことなく画像を抽出するためにpdfimagesの使用を推奨しています。

2
asoundmove