13

それぞれ1.5MBの大きさの約50〜60個のpdfファイル(画像)があります。今、私は自分の論文にそのような大きなPDFファイルを入れたくありません。ダウンロード、読み取り、印刷が後部で苦痛になるからです。そこで、ghostscript を使用して次のことを試みました。

gs \
  -dNOPAUSE -dBATCH \
  -sDEVICE=pdfwrite \
  -dCompatibilityLevel=1.4 \
  -dPDFSETTINGS="/screen" \
  -sOutputFile=output.pdf \
    L_2lambda_max_1wl_E0_1_zg.pdf

ただし、現在、私の 1.4MB pdf は 1.5MB の大きさです。

私は何を間違えましたか?PDFファイルの解像度を確認する方法はありますか?300dpiの画像が必要なだけなので、使用すると画像が非常に粗くなるため、誰かが解像度を変更するために使用することを提案しconvertますか、または を使用して画像の解像度を変更する (下げる) ことができますか?gsconvert

変換の使用方法:

 convert \
     -units PixelsPerInch \
      ~/Desktop/L_2lambda_max_1wl_E0_1_zg.pdf \
     -density 600 \
      ~/Desktop/output.pdf

サンプルファイル

http://dl.dropbox.com/u/13223318/L_2lambda_max_1wl_E0_1_zg.pdf

4

2 に答える 2

16

Ghostscript を実行する-dPDFSETTINGS=/screenと、これは一種のショートカットになります。実際、次のコマンドでクエリを実行できる、使用されている一連の設定を (暗黙のうちに) 取得します。

gs \
  -dNODISPLAY \
  -c ".distillersettings {exch ==only ( ) print ===} forall quit" \
| grep '/screen'

私の Ghostscript (v9.06prerelease) では、次の出力が得られます (読みやすくするために少し編集されています)。

/screen 
  << /DoThumbnails false 
     /MonoImageResolution 300 
     /ColorImageDownsampleType /Average 
     /PreserveEPSInfo false 
     /ColorConversionStrategy /sRGB 
     /GrayImageDownsampleType /Average 
     /EmbedAllFonts true 
     /CannotEmbedFontPolicy /Warning 
     /PreserveOPIComments false 
     /GrayImageResolution 72 
     /GrayACSImageDict << 
                        /ColorTransform 1 
                        /QFactor 0.76 
                        /Blend 1 
                        /HSamples [2 1 1 2] 
                        /VSamples [2 1 1 2] 
                      >> 
     /ColorImageResolution 72 
     /PreserveOverprintSettings false 
     /CreateJobTicket false 
     /AutoRotatePages /PageByPage 
     /MonoImageDownsampleType /Average 
     /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 << 
                          /ColorTransform 1 
                          /QFactor 0.76 
                          /Blend 1 
                          /HSamples [2 1 1 2] 
                          /VSamples [2 1 1 2] >> 
     /CompatibilityLevel 1.3 
     /UCRandBGInfo /Remove 
>>

あなたの PDF は画像が多く、この種の変換が望ましくないこと (「間違った」パラメータで画像を再サンプリングすること) を行い、ファイル サイズが大きくなるかどうか疑問に思っています...

これが当てはまる場合(画像が多いPDF)、そう言ってください。いくつかの提案でこの回答を更新します....


アップデート

DNA から提供されたサンプル ファイルを確認しました。面白い...

いいえ、画像は含まれていませ

代わりに、 (moveto) 、 ( /FlateDecodelineto )、(setdash)、(setlinewidth)、(stroke)、(closepath と stroke)、(eoclip)、( setrgbcolor) など。
m
l
d
w
S
s
W*
rgRG

(そのPDFコードは非常に非効率的に書かれたAFAICSです(しかし、その仕事はします)。これは、「長い」ストロークを実行する代わりに多くの短いストロークを連結し、ほぼすべてのストロークが再び色を定義するためです(以前と同じであっても)、他のすべてのオーバーヘッド (ストロークの開始、ストロークの終了など) があります。

Ghostscriptはここでは効果-dPDFSETTINGS=/screenがありません(たとえば、ダウンサンプリングする画像はありません)。ファイル サイズの増加 (正確には +48 kByte) は、おそらく、Ghostscript がファイルを解釈するときに、内部ストロークなどのコマンドの一部を別の順序に再編成したためです。

したがって、PDFファイルのサイズについてできることはあまりありません...

  • ...これらの PDF ページのそれぞれをPNG などのREAL画像に変換しない限り:
    gs \
      -o out72.png \
      -sDEVICE=pngalpha \
       L_2lambda_max_1wl_E0_1_zg.pdf

(pngalpha出力を使用して透明な背景を取得しました。) 「out.png」の画像サイズは259x213pxで、ファイルサイズは現在 70 kByte です。しかし、私はあなたが品質を気に入らないと確信しています:-)

Ghostscript は 72 dpi のデフォルト解像度を使用するため、出力品質は「悪い」です。

300dpi にしたいと言ったので、コマンドは次のようになります。

gs \
  -o out300.png \
  -sDEVICE=pngalpha \
  -r300 \
   L_2lambda_max_1wl_E0_1_zg.pdf

ファイルサイズは現在 750 kByte で、画像のサイズは1080x889ピクセルです。


更新 2

キュリオシティは最近流行っているので... :-) ...私はMac上のAdobe Acrobat X Proの助けを借りてファイルサイズを下げようとしました.

結果知りたい?

「名前を付けて保存... (ファイルサイズを縮小した PDF)」を実行すると、以前は常に非常に良い結果が得られました。-- 1.8++ MB ファイルを作成しました (+29%)。これは間違いなく Ghostscript のパフォーマンス (ファイル サイズの増加 +3%) を現実的な視点に置いていると思います!

于 2012-08-07T17:56:05.203 に答える
3

DNA はグレースケール PNG を使用することにしました。彼がそれらを作成する方法は、次の 2 つのステップです。

  1. ステップ 1: Ghostscript のデバイスと設定を使用して、カラー PDF ページ (この など) をグレースケール PDF ページに変換しますpdfwrite
    -dColorConversionStrategy=/Gray
    -dProcessColorModel=/DeviceGray
  2. ステップ 2: Ghostscript のpngalphaデバイスを 300 dpi の解像度で使用-r300して (GS コマンドラインで)、グレースケール PDF ページを PNG に変換します。

これにより、最初のファイル サイズが 1.4 MB から 0.7 MB に減少します。

ただし、このワークフローには次の欠点があります。

  • PDF から直接同じ解像度でカラー出力を書き込む場合と比較して、多くのディスク容量を節約することなく、すべてのカラー情報を失います!

DNA のワークフローには 2 つの代替手段があります。

  1. (カラー) PDF -> (カラー) PNG のワンステップ変換pngalpha。元の PDF を入力として Ghostscript のデバイスを使用 (300 dpi 解像度の同じ設定)。これには次の利点があります。

    • PNG 出力にカラー情報を保持するため、必要なディスク容量はわずかです。
  2. (カラー) PDF のワンステップ変換 -> グレースケール PNG、pnggray元の PDF を入力として Ghostscript のデバイスを使用 (300 dpi 解像度の同じ設定)、この利点/欠点の組み合わせ:

    • PNG 出力の色情報が失われます。
    • DNA のワークフローで保持されていた透明な背景が失われます。
    • ファイルサイズが DNA のワークフローからの出力の約 20% に減少するため、ディスク容量を大幅に節約できます。

決心して、出力サイズと品質を並べて確認できるように、違いを示すシェル スクリプトを次に示します。

#!/ビン/バッシュ
#
# コピーライト (c) 2012 <kurt.pfeifle@gmail.com>
# ライセンス: クリエイティブ コモンズ (CC BY-SA 3.0)

関数 echo_do() {
        エコー
        echo "コマンド: ${*}"
        エコー " -  -  -  - "
        エコー
        「${@}」
}

[ -d アウト ] || mkdir 出力

エコー
echo "すべての PDF ページが 1 ページの PDF であると想定しています!"
echo " (それ以外の場合は、'%03d' などを含める必要があります"
ページ化された出力を取得するために出力ファイル名に「をエコーし​​ます)」
エコー

エコー '
 # カラー PDF をグレースケール PDF に変換します。
 # PDF の背景が透明な場合 (ほとんどの場合)、
 # これは出力では透明のままです。)
 # 注意: 解像度を使用しないため、
 # pdfwrite はデフォルト値の「-r720」を使用します。
 # (ただし、この設定はラスター オブジェクトにのみ影響します...)
'
for i in *.pdf
行う
echo_do gs \
 -o "out/${i}---pdfwrite-devicegray-gs.pdf" \
 -sDEVICE=pdf書き込み\
 -dColorConversionStrategy=/グレー\
 -dProcessColorModel=/DeviceGray \
 -dCompatibilityLevel=1.4 \
  「${i}」
終わり

エコー '
 # アルファ チャネルを使用して (以前に生成された) グレースケール PDF を PNG に変換します。
 #(アルファチャンネルは背景を透明にすることができます)
'
for i in out/*pdfwrite-devicegray*.pdf
行う
echo_do gs \
 -o "out/$(basename "${i}")---pngalpha-from-pdfwrite-devicegray-gs.png" \
 -sDEVICE=pngalpha \
 -r300 \
  「${i}」
終わり

エコー '
 #アルファチャンネルを使用して(カラー)PDFをグレースケールPNGに変換します
 #(アルファチャンネルは背景を透明にすることができます)
'
for i in *.pdf
行う
# 以下は、'pngalpha' ではなく、'pdfwrite' 出力デバイスにのみ必要です!
# -dProcessColorModel=/DeviceGray
echo_do gs \
 -o "out/${i}---pngalphagray_gs.png" \
 -sDEVICE=pngalpha \
 -dColorConversionStrategy=/グレー\
 -r300 \
  「${i}」
終わり

エコー '
 #アルファチャンネルを使用して(カラー)PDFを(カラー)PNGに変換します
 #(アルファチャンネルは背景を透明にすることができます)
'
for i in *.pdf
行う
echo_do gs \
 -o "out/${i}---pngalphacolor_gs.png" \
 -sDEVICE=pngalpha \
 -r300 \
  「${i}」
終わり

エコー '
 #PDFを(カラー)グレースケールPNGに変換
 #(ここにはアルファチャンネルがないため、[ほとんど]白い背景)
'
for i in *.pdf
行う
echo_do gs \
 -o "out/${i}---pnggray_gs.png" \
 -sDEVICE=pngグレー\
 -r300 \
  「${i}」
終わり

echo "すべての出力は ./out/ ... にあります"
エコー

このスクリプトを実行し、さまざまな出力を並べて比較します。

はい、「direct-grayscale-PNG-from-color-PDF-using-pnggray-device」は、他のものよりも少し悪く見えるかもしれません (そして、透明な背景はありません)。そのファイル サイズの 20%。一方、ディスク容量を少し犠牲にして、もう少し品質を高くしたい場合は、 ...-r400の代わりに使用できます。-r300

于 2012-08-08T20:04:05.347 に答える