品質を損なうことなくpdfからjpgへ。gscan2pdf


51

を使用してpdfファイルを一連のjpgファイルに変換するとき

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

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

ただし、次のことを行った場合、(顕著な)品質の低下はありません。

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

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

結果のjpgファイルは、(おおよそ)元のpdfと同じ品質です(これは私が望むものです)。

今、私の質問は、顕著な品質低下なしにpdfファイルを多数のjpgファイルに変換する簡単なコマンドラインの方法があるかどうかです。(上記のソリューションは複雑すぎて時間がかかります)。


質問で明確でないのは、pdfでテキストとベクターグラフィックスについて話しているのか、それとも埋め込み画像を抽出するつもりなのかです。
asoundmove

回答:


92

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

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

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

(先頭に追加する-units PixelsPerInch-units PixelsPerCentimeter、必要に応じて。コピーはデフォルトでppiになります。)

更新: あなたが指摘したように、gscan2pdf(あなたがそれを使用している方法)はpdfimagespopplerからの)単なるラッパーです。 入力としてPDFを指定した場合pdfimagesと同じことを行いませんconvert

convert PDFを取得し、何らかの解像度でレンダリングし、結果のビットマップをソースイメージとして使用します。

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

その結果、一連のビットマップの単なるラッパーであるPDFを使用pdfimagesしている場合、生データを元のサイズで取得できるため、それらを抽出する作業がはるかに良くなります。PDFには生のJPEGデータが含まれている可能性があるため、おそらくの-jオプションも使用する必要がありますpdfimages。デフォルトでは、pdfimagesすべてをPNM形式に変換し、JPEG> PPM> JPEGの変換は損失の多いプロセスです。

だから、試してください

pdfimages -j file.pdf page

convertto .jpgステップを実行する必要がある場合とそうでない場合があります(PDFが使用していたビットマップ形式によって異なります)。

JPEG画像のシーケンスから自分で作成したPDFでこのコマンドを試しました。抽出されたJPEGは、ソースイメージとバイト単位で同一でした。それ以上の品質は得られません。


+1私は、私にインスパイアされたあなたの文章の1つを誤読し、実際にpdfimagesを試しました-おそらく私が数ヶ月で使用した中で最も有用なプログラムでした。みんなに試してみることをお勧めします!
ixtmixilix

@ixtmixilix、私は興味があります。何を間違って読みましたか?
cjm

めっちゃすごい!私の一日を解決しました。ありがとうございました!
Geppettvs D'Constanzo

convertまた、大きなPDFには実用的ではありません。たとえば、700の6メガピクセルページの本を処理するには、45 GBのメモリが必要でした。それはまた、約1000倍かかりましたpdfimages
カミーユ・グドゥスヌ

他の方法でのラウンドについては、PDF、ここで使用img2pdf、に変換するPDFへの画像、または、より良い、ラップ画像:gitlab.mister-muffin.de/josch/img2pdf(ラップJPGやPDFにjpg2000)。
エリック

4

学生の答えが言ったようpdfimagesに、良い選択肢です。私の経験の両方から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の輸出品質で最高を。


3

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

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

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


2

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


pdfimagesは本当に仕事をしている
エドゥアルドフロリネスク

2

あなたの質問ではっきりしないのは、あなたがあなたのpdfでテキストとベクターグラフィックスについて話すか、またはあなたのpdfが埋め込まれた画像を含むかどうかです。

gscan2pdfの内容を読んだところ、pdfファイルには(のみ)埋め込みグラフィックスが含まれていると思います。

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.