web-dev-qa-db-ja.com

PDFをマージするGhostscriptは結果を圧縮します

Ghostscriptを使用して、複数のPDFを1つにマージするこのすてきなコマンドを見つけました。

gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile=out.pdf in1.pdf in2.pdf

結果のサイズは、2つのPDFの合計サイズよりも小さくなります。

単一のファイルを入力としてコマンドを実行すると、出力ファイルのサイズが小さくなります。

Ghostscriptには、圧縮せずにマージ時に表示されるページをそのままコピーするオプションがありますか?

そうでない場合、Ghostscript圧縮が非常に優れているため、品質がまったく低下しない可能性はありますか?

60
Dimitris Baltas

以下に、デバイスにpdfwriteを使用するときに渡すことができる 追加オプション を示します。そのページによれば、何も渡さなければ-dPDFSETTINGS/screenに近い値に設定されますが、より具体的にはなりません。 -dPDFSETTINGS=/prepressに設定してみてください。300dpiを超えるものだけを圧縮します。

gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sOutputFile=out.pdf in1.pdf in2.pdf

別の選択肢は pdftk

pdftk in1.pdf in2.pdf cat output out.pdf
65
Chris Haas

観察したサイズの最適化の一部は、Ghostscriptの未使用オブジェクトのクリーンアップ、最近取得したフォント最適化の改善(GSの最新バージョンを使用していますか?!?)、およびおそらく起こりました。

GhostscriptをPDF-> PDF変換に使用すると、基本的に次のように動作します。

  1. すべてのオブジェクトとともに入力ファイルを読み込み、それらをグラフィカルページ表現用の内部形式に変換します。
  2. 内部形式のページコンテンツに対してコマンドラインで要求の操作を行います。
  3. 完全に新しいPDFを書き出します。

つまり、ほとんどのPDF-> PDF操作では、PDFオブジェクトの順序と番号付けが異なり、オブジェクトの内部コードさえ変更されている可能性があります(たとえ目が ' t入力PDFと出力PDFの違いを発見します)。

デフォルトでは、Ghostscriptは元のファイルで圧縮されていないオブジェクトストリームも圧縮します(ただし、これは可逆圧縮です)。

これで非常に単純なコマンドライン操作の希望を含まない、Ghostscript assumes-dPDFSETTINGS=/defaultを使用し、このパラメーターを暗黙的に設定し、それに応じて動作します。

これでwhat/default PDFSETTINGSですか?!調べるには2つのオプションがあります。

  1. マニュアルを読む。このセクションの中央にある大きな table は概要を示しています。この-dPDFSETTINGS=/default自体は、それが表す数十個の他のより具体的な設定の単なる省略形であることがわかります。提供されているドキュメントへのリンクは、開発コードの現在のHEADであり、実際に使用されるバージョンはもちろん異なる場合があります

  2. この設定の詳細な意味については、(独自の)Ghostscriptに問い合わせてください。質問に対する私の答え '出力デバイスのデフォルトのオプション/設定についてGhostscriptに照会しています... ' および質問 ' PostScript辞書とは何ですか? (Ghostscriptを介して)どのようにアクセスできますか? ' これについてもう少し詳しく説明します。つまり、Ghostscriptに/default PDFSETTINGSの詳細を照会するには、次のコマンドを実行します。

     gs \
       -q \
       -dNODISPLAY \
       -c ".distillersettings /default get {exch ==only ( ) print ===} forall quit"
    

    次のような結果が得られるはずです。

      /Optimize false
      /DoThumbnails false
      /PreserveEPSInfo true
      /ColorConversionStrategy /LeaveColorUnchanged
      /DownsampleMonoImages false
      /EmbedAllFonts true
      /CannotEmbedFontPolicy /Warning
      /PreserveOPIComments true
      /GrayACSImageDict << /HSamples [2 1 1 2] /VSamples [2 1 1 2] /QFactor 0.9 /Blend 1 >>
      /DownsampleColorImages false
      /PreserveOverprintSettings true
      /CreateJobTicket false
      /AutoRotatePages /PageByPage
      /NeverEmbed [/Courier /Courier-Bold /Courier-Oblique /Courier-BoldOblique /Helvetica /Helvetica-Bold /Helvetica-Oblique /Helvetica-BoldOblique /Times-Roman /Times-Bold /Times-Italic /Times-BoldItalic /Symbol /ZapfDingbats]
      /ColorACSImageDict << /HSamples [2 1 1 2] /VSamples [2 1 1 2] /QFactor 0.9 /Blend 1 >>
      /DownsampleGrayImages false
      /UCRandBGInfo /Preserve
    

    これらから際立っている唯一のポイント:/AutoRotagePages/PageByPageから/Noneに変更したい場合があります。コマンドラインでは、-dAutoRotatePages=/Noneとして配置します。

    これらのパラメーターを追加することにより、入力PDFに可能な限り多くのpassthroughモードを使用するよう具体的にGhostscriptに指示するパラメーターの完全なリストを提供するには:

      -dAntiAliasColorImage=false \
      -dAntiAliasGrayImage=false \
      -dAntiAliasMonoImage=false \
      -dAutoFilterColorImages=false \
      -dAutoFilterGrayImages=false \
      -dDownsampleColorImages=false \
      -dDownsampleGrayImages=false \
      -dDownsampleMonoImages=false \
      -dColorConversionStrategy=/LeaveColorUnchanged \
      -dConvertCMYKImagesToRGB=false \
      -dConvertImagesToIndexed=false \
      -dUCRandBGInfo=/Preserve \
      -dPreserveHalftoneInfo=true \
      -dPreserveOPIComments=true \
      -dPreserveOverprintSettings=true \
    

したがって、このコマンドを試すことができます:

gs                                              \
 -o output.pdf                                  \
 -sDEVICE=pdfwrite                              \
 -dAntiAliasColorImage=false                    \
 -dAntiAliasGrayImage=false                     \
 -dAntiAliasMonoImage=false                     \
 -dAutoFilterColorImages=false                  \
 -dAutoFilterGrayImages=false                   \
 -dDownsampleColorImages=false                  \
 -dDownsampleGrayImages=false                   \
 -dDownsampleMonoImages=false                   \
 -dColorConversionStrategy=/LeaveColorUnchanged \
 -dConvertCMYKImagesToRGB=false                 \
 -dConvertImagesToIndexed=false                 \
 -dUCRandBGInfo=/Preserve                       \
 -dPreserveHalftoneInfo=true                    \
 -dPreserveOPIComments=true                     \
 -dPreserveOverprintSettings=true               \
  input1.pdf                                    \
  input2.pdf

最後に、クリス・ハースがすでに示唆したように:特に最適化が不要な場合は、pdftkを使用することもできます Ghostscriptはデフォルトで適用されます。 pdftkは単にそのようなことを行うことができず、操作の相対的な鈍さのためにかなりの速度を得ることができます(ただし、Ghostscriptよりもはるかに大きなファイルサイズの出力も可能です)。

31
Kurt Pfeifle