web-dev-qa-db-ja.com

Ghostscriptを使用しますが、画像を再処理しないように指示しますか?

PDFはすでに圧縮されていて、多少アーティファクトのある画像です。Ghostscriptを使用して、そのPDFにタイトルページを付加しています。

ただし、既存の画像を再処理せずにそのまま使用するようにGSに指示する方法を見つけることはできません。これで、GSがどのように機能するかと関係があるように感じています。つまり、a =を再コンパイル/リンクできないのです。 PDF画像を再処理せずに..それは本当ですか?

GSでDPI設定を上げることはできますが、まだ悪化している間に5MBから60MBになります。

私が必要とすることを実行するGSのより良い代替はありますか(できればOS Xでコンパイルできます)?

30

コンテンツを再処理せずに2つのPDFファイルを連結するだけの場合は、pdftkが適しています(Mac OS Xでは、MacPortsまたはFinkを使用して、 Linuxには、すべての主要なディストリビューション用のネイティブパッケージがあり、Windowsには こちらをご覧ください )これを試してください:

 pdftk title.pdf content.pdf cat output book.pdf

これにより、title.pdfcontent.pdfの前に追加され、結果がbookに書き込まれます。 pdf

pdftkは「ダム」ですが、2つ(またはそれ以上)のファイルを連結する非常に高速な方法ですPDFファイル。これまでのところ、「ダム」はpdftkと同じです解釈PDFデータストリームではなく、内部オブジェクト番号が必要に応じて再シャッフルされ、 PDF xref構造(基本的にはPDFToCfor objects)の一種です) 。

Ghostscript:

Ghostscriptを使用する場合、同じ2つのファイルを連結する基本的なコマンドは次のようになります。

 gs \
  -o book.pdf \
  -sDEVICE=pdfwrite \
   title.pdf \
   content.pdf

ただし、ご存知のように、この単純なコマンドラインは画像品質を台無しにする可能性があります。その理由は、GhostscriptがPDFを処理するときにGhostscriptが「ダンプ」しないためです。Ghostscriptは、読み込み時に完全に解釈し、結果を書き込むときに完全に新しいファイルを作成します。結果を作成するために、全体的な処理の多くの詳細については、デフォルト設定が自動的に使用されます。これらのデフォルトは、その呼び出しがGhostscriptに他の方法で指示しなかったすべての場合に適用されます。

したがって、新しいbook.pdfを作成するGhostscriptのメソッドは、pdftkのメソッドよりもはるかに「インテリジェント」です(ただし、処理速度もかなり遅くなります)。 (これは、多くの場合、Ghostscriptが制限内で-「修復」できるb0rken PDFファイル、または出力にフォントを埋め込むことができる理由でもあります入力PDFに埋め込まれていない、または重複した画像を削除したり、単なる参照に置き換えたりするPDF-全体的に、膨張した入力PDFから作成されたより小さく、より最適化されたファイル...)

解決策は、Ghostscriptがデフォルトを使用しないようにすることです。つまり、コマンドラインにカスタムパラメータを追加します。

それはどういう意味ですか "Ghostscript 'interprets' its PDF input"

すべてのファイルとそのコンテンツ(オブジェクト、ストリーム、フォント、画像など)が読み込まれ、チェックされ、独自の内部表現に保持されてから、結果のPDFを出力しますPDFオブジェクトが再び表示されます。ただし、「吐き出す」場合、Ghostscriptは何百ものパラメータに内部のデフォルト設定をすべて適用します[*]あります。

残念ながら、これにより、これらのデフォルト設定に従って画像が「再処理」されます。これは、独自の(必要な)コマンドラインパラメータを追加することによってのみ回避または上書きできます。

画像の問題は、(ライセンスの問題により)GhostscriptがJPEG2000画像をJPEGエンコーディングに再エンコードする必要があるために発生する可能性があります。これを避けたい場合は、コマンドラインに以下を追加してください:

-dAutoFilterColorImages=false \
-dAutoFilterGrayImages=false \
-dColorImageFilter=/FlateEncode \
-dGrayImageFilter=/FlateEncode \

含めることを検討する他の画像関連のコマンドラインオプションは次のとおりです。

-dColorConversionStrategy=/LeaveColorUnchanged \
-dDownsampleMonoImages=false \
-dDownsampleGrayImages=false \
-dDownsampleColorImages=false \

したがって、あなたを幸せにすることができる完全なGhostscriptコマンドラインは次のようになります。

 gs \
  -o book.pdf \
  -sDEVICE=pdfwrite \
  -dColorConversionStrategy=/LeaveColorUnchanged \
  -dDownsampleMonoImages=false \
  -dDownsampleGrayImages=false \
  -dDownsampleColorImages=false \
  -dAutoFilterColorImages=false \
  -dAutoFilterGrayImages=false \
  -dColorImageFilter=/FlateEncode \
  -dGrayImageFilter=/FlateEncode \
   title.pdf \
   content.pdf

次のコマンドラインを使用して、出力PDFの画像を圧縮しないようにGhostscriptに指示することもできます

 gs \
  -o book.pdf \
  -sDEVICE=pdfwrite \
  -dColorConversionStrategy=/LeaveColorUnchanged \
  -dEncodeColorImages=false \
  -dEncodeGrayImages=false \
  -dEncodeMonoImages=false \
   title.pdf \
   content.pdf


[*]:
Ghostscriptのpdfwriteデバイスが使用しているデフォルト設定の完全なリストについて知りたい場合、次のコマンドを実行します。 fullリストを返します。

 gs \
   -sDEVICE=pdfwrite \
   -o /dev/null \
   -c "currentpagedevice { exch ==only ( ) print == } forall"

これらすべてのパラメーターが正確に何を意味するかについての説明は、 "Distillerパラメーター"に関するAdobeのドキュメント を参照する必要があります。 Ghostscriptはこれらすべてを模倣するために非常に懸命に努力します...

44
Kurt Pfeifle