2

GS を使用して PDF ファイルからサムネイルを生成したいと考えています。

  • サムネイルは 90x120 ピクセルの長方形に収まる必要があります
  • 画像を回転させないでください
  • 縦横比を維持したまま、長方形に収まるように画像のサイズを変更する必要があります

次のコマンドを使用します。

gswin32 -dPDFFitPage -dPARANOIDSAFER -dBATCH -dNOPAUSE -dNOPROMPT 
-dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=0 
-dDEVICEWIDTH=90 -dDEVICEHEIGHT=120 -dORIENT1=true 
-sDEVICE=jpeg  -dTextAlphaBits=4 -dGraphicsAlphaBits=4 
-sOutputFile=output.%d.jpg input.pdf

結果:

ダウンロードできるこの例のような縦向きのページ を含む PDF を使用すると、サムネイルは次のように正しく表示されます。

ここに画像の説明を入力

横向きのページを含む PDFに使用すると、devicewidth が何らかの形で高さと見なされます。

ここに画像の説明を入力

どうすればこの動作を防ぐことができますか? 私のポルシェも 90x120 にしたいです。Ghostscript 用の Postscript コード (-c コマンド ライン引数を使用) を提供する必要があると思いますが、その経験はありません。誰か助けてくれませんか?

EDIT1 : KenS の提案を試しました。-dFIXEDMEDIA を使用すると、以下のように私のポルシェが切り取られます。

ここに画像の説明を入力

EDIT2 : Kurt Pfeifle の最初の解決策は、ポートレート画像には適していません (右側の白い部分、スペースを適切に使用していません)。下記参照:

ここに画像の説明を入力

EDIT3: Kurt Pfeifle の 3 番目のソリューションは、ほぼ適切です。風景画像の場合は完璧です:

ここに画像の説明を入力

ただし、縦向きのページにはサイズの問題があり、背景も完全に灰色になります。

ここに画像の説明を入力

それでカート、私はpdfをページに分割できると思います(GS -dFirstPageと-dLastPageを使用)。そして、ページが横向きか縦向きかを判断する方法があれば、条件付き処理を行うことができます。何か案が?背景色については、そこまで重要ではないと思いますが、こちらもアイデアがあれば大歓迎です。

4

4 に答える 4

2

さて、上記の「最初にPDFを操作する(縦向きのメディア形式を使用して横向きの画像コンテンツを表示する)」という考えに基づいて、より精巧な答えを試してみます...

元のPDFはすべてのページに共通のサイズを使用していないため(すべて異なる)、最初のページのみで概念実証を行ったことに注意してください。

ステップ 1: 元のページ (横長) から 1 ページを抽出する

私はpdftkこれに使用しています:

porsches.pdf  cat 1  output porsche-page1.pdf

ステップ 2: 大きな縦向きのページの中央に横向きのコンテンツを配置する

これには、Ghostscript と-c ...PostScript コマンドライン スニペットを使用しています。

gs \
 -o porsche-page1-on-portrait-medium.pdf \
 -sDEVICE=pdfwrite \
 -dPDFSETTINGS=/prepress \
 -g1920x2560 \
 -r72 \
 -c "<</PageOffset [0 560]>> setpagedevice" \
 -f porsche-page1.pdf

/PageOffset値は、元のページの高さ 1440 ポイントに 1120 ポイントを追加したという事実から導き出されます。そのため、コンテンツを値の半分だけ上にシフトして、画像が再び中央に配置されるようにします。

ステップ 3: JPEG サムネイル (ポートレート) を作成する

gs \
 -sOutputFile=proofofconcept-thumb_%03d.jpg \
 -dPDFFitPage \
 -dDEVICEWIDTH=90 \
 -dDEVICEHEIGHT=120 \
 -sDEVICE=jpeg \
  porsche-page1-on-portrait-medium.pdf

私があなたの意図を完全に誤解していなければ、これはあなたが望んでいた結果になるはずです。(注: サムネイル画像に黒いフレームを追加して、Stackoverflow の白い HTML 背景でも実際の寸法が見えるようにしました。 )

概念実証のサムネイル

于 2012-07-05T10:22:51.600 に答える
1

この全体をより簡単にスクリプト化する方法を次に示します。(私は今、あなたがWindows用にこれを望んでいるように見えることに完全に気づきました...)

最初のステップ: すべてのページ サイズが等しい最初の中間 PDF を作成する

gswin32c.exe ^
   -o 1920x1440pts.pdf ^
   -dPDFFitPage ^
   -sDEVICE=pdfwrite ^
   -dPDFSETTINGS=/prepress ^
   -g19200x14400 ^
    porsche.pdf

これは、第 2 段階の準備でした。「すべてのページに同じサイズ」を使用すると、同じ固定/PageOffset値を使用できます。

2 番目のステップ: 2 番目の中間 PDF (縦、中央に横のコンテンツ)

gswin32c.exe 
   -o 1920x1440-portrait.pdf ^
   -sDEVICE=pdfwrite ^
   -dPDFSETTINGS=/prepress ^
   -g19200x25600 ^
   -c "<</PageOffset [0 560]>> setpagedevice" ^
   -f 1920x1440pts.pdf 

これは第4ステップの準備でした。PDF に縦向きのページ (横向きの画像コンテンツを保持) があるので、サムネイルを作成すると、縦向きのサムネイルも作成されます...

3 番目のステップ: 縦向きのページにグレーの背景を追加する

gswin32c.exe ^
   -o - ^
   -sDEVICE=pdfwrite ^
   -g1920x2560 ^
   -c ".6 setgray 0 0 192 256 rectfill showpage" ^
| ^
pdftk.exe ^
   1920x1440-portrait.pdf ^
   background - ^
   output 1920x1440-portrait-gray-background.pdf

パイプラインの最初のコマンドは Ghostscript を使用して灰色の背景を持つ PDF ページをstdoutに書き込みます。2 番目のコマンドはstdinpdftkから背景情報を読み取り、次の中間出力を作成するために使用します。

このグレーの色合いが気に入らない場合は、 の代わりに別の値を使用して.6ください。灰色が好きではなく、色が必要な場合は、代わりに使用します.6 setgray

  • 1 0 0 setrgbcolor赤い背景の場合、
  • 0 1 0 setrgbcolor緑の背景の場合、
  • 0 0 1 setrgbcolor青い背景の場合、
  • 1 0 0 0 setcmykcolorシアンの背景の場合、
  • 0 1 0 0 setcmykcolorマゼンタの背景の場合、
  • 0 0 1 0 setcmykcolor黄色の背景用。

ステップ 4: 最終的な JPEG サムネイルを作成する

gswin32c.exe ^
   -o porsche-thumbnails-portrait_%03d.jpg ^
   -dPDFFitPage ^
   -dDEVICEWIDTH=90 ^
   -dDEVICEHEIGHT=120 ^
   -sDEVICE=jpeg ^
    1920x1440-portrait-gray-background.pdf

これらのコマンドをバッチ ファイルにコピーし、必要に応じて他のいくつかのことを追加してください... :-)


更新: もちろん、横向きと縦向きのページを含むファイルがある場合は、いくつかの条件付き処理を適用する必要があります。コマンドラインでページの向きとサイズを検出するにpdfinfoは、次のように呼び出すと役立つ場合があります。

 pdfinfo -f 4 -l 7 some.pdf

これにより、4 ページ (最初) から 7ページ (最後)のページ サイズが印刷されます。

于 2012-07-05T13:21:33.113 に答える
1

-dFIXEDMEDIA を設定して、Ghostscript がメディアが固定されていることを認識できるようにします。

別の機会に、より小さなサンプル ファイルを投稿するかもしれませんが、実際には 71 ページすべてが必要というわけではありませんでしたが、それらが素敵な写真であることに感謝しています....

于 2012-07-04T13:03:45.593 に答える
1

最初にPDFを操作しないと、現在、あなたが望むことは不可能だと思います(縦向きのメディア形式を使用して横向きの画像コンテンツを表示します)。

あなたが取得している120ピクセルで主に問題を抱えているように見えるので、変更されていない入力を処理するための私自身の回避策は、高さ/幅の設定を次のように変更することです:

-dDEVICEWIDTH=90 -dDEVICEHEIGHT=89 

これにより、幅 90 ピクセルで回転していない JPEG が作成され、これらは 90x120 ピクセルの長方形に収まります (必要に応じて)。:-)

(その後、取得した JPEG を ImageMagick コマンドライン ツールの 1 つを使用して操作し、ポルシェを長方形の中心に配置して真に 90x120 ピクセルにすることができます....)

于 2012-07-04T13:31:42.713 に答える