web-dev-qa-db-ja.com

Ghostscriptを使用したPDFのサイズ変更

私はPDFをスケーリングしようとしています。これは、たとえばA4サイズからA4までの小さなサイズです。

これは、ポートレートドキュメントで正常に機能します。ドキュメントが正しく拡大され、上部にパディングが追加されます。

ただし、ランドスケープドキュメントではパディングは追加されません。そのため、ドキュメントはA4の正しい高さになりますが、ドキュメント側にパディングが追加されないため(希望どおり)、幅が十分ではありません。

これは、A4ポートレートドキュメントで機能させるために使用するものです。

gs \
 -sOutputFile=output.pdf \
 -sDEVICE=pdfwrite \
 -sPAPERSIZE=a4 \
 -dCompatibilityLevel=1.4 \
 -dNOPAUSE \
 -dBATCH \
 -dPDFFitPage \
  input.pdf
37
Matt

-dFIXEDMEDIAスイッチを追加する必要があります。

gs \
 -o output.pdf \
 -sDEVICE=pdfwrite \
 -sPAPERSIZE=a4 \
 -dFIXEDMEDIA \
 -dPDFFitPage \
 -dCompatibilityLevel=1.4 \
  input.pdf

特定の用紙/ページ/メディアサイズを強制し、ドキュメントで指定された用紙/ページ/メディアサイズを無視する必要がある場合、-dFIXEDMEDIAは常に必要です。 PDFには常に用紙/ページ/メディアのサイズが定義されています(PostScriptには、ある場合とない場合があります)。

(私の-o ...は短く、-dBATCH -dNOPAUSEを追加する必要がありませんが、Ghostscriptの最新バージョンでのみ機能します。)

52
Kurt Pfeifle

まず、ここに投稿したすべての人に感謝します。

pdfScale と呼ばれるこの小さなスクリプトがあり、ここに投稿された回答の一部を吸収しました。そこで、2セントを差し戻すことにしました。私はカートとティムの答えを少し混ぜて使っています。しかし、ティムのものに似ています。私はこれを数日間試しましたが、ここに投稿された方法に関する私の部分的な結論は次のとおりです。

_-sPAPERSIZEで名前で用紙サイズを設定

  • 紙の名前を渡すだけの簡単(例a4)
  • 100%正確なポイントサイズを生成できない場合があります
  • 横向き<>縦向き

PSポイントで用紙サイズを設定-dDEVICEWIDTHPOINTS-dDEVICEHEIGHTPOINTS

  • 必要なサイズをポイントで取得できるようにします
  • 幅<>高さを自分で反転できます
  • ポイントのサイズを知る必要があります
  • ポイント単位の新しいページサイズが必要になり、ランドスケープ/ポートレートを検出する場合はソースのページサイズも必要になるため、スクリプトを作成するのはそれほど簡単ではありません。
  • カスタム定義の用紙も設定できます(本当に好きなサイズ)。
  • 長いポイントバージョンの代わりに-dDEVICEWIDTH-dDEVICEHEIGHTを使用していましたが、どちらも同じことをしているようです(両方ともポイントを取得します)。

私のbashスクリプトは既にソースページサイズを取得できるため、カスタムページサイズを設定できるというアイデアが気に入ったため、ポイント単位でページサイズを設定することに集中することにしました。また、スクリプトに GS Paper Sizes を(名前とサイズとともに)含めました。そのため、その情報を取得するのも簡単でした。

前に指摘したように、両方のケースで-dFIXEDMEDIAを使用することは必須のようです。

だから、これは私のアプローチがどのように進んだかです(スクリプト形式で)

  1. ソースPDFページサイズの取得(フリップ検出用)
  2. ターゲットのページサイズをポイントで取得します(例:A4> 595x842)
  3. 必要に応じて、向きが同じであることを確認します。
  4. ポイントまたはフリップポイントでGSを実行する

自動回転の問題を修正しようとしていたとき、 この他のカート応答が見つかりました 。これは、-dAutoRotatePagesの使用に関するものです。彼の答えの一部をここにコピーするだけです:

  • -dAutoRotatePages=/None-各ページの向きを保持します。
  • -dAutoRotatePages=/All-一種の「多数決」に応じて、すべてのページをローテーションします(またはページをローテーションしません)。
  • -dAutoRotatePages=/PageByPage-ページを個別に自動回転します。

スクリプトのデフォルトはPageByPageですが、調整可能です。私のテストではうまくいきました。 -dAutoRotatePagesを使用すると、同じではありませんが、ページサイズを事前に反転する必要性を減らすこともできます。私は両方のオプションを保持しました。

私の小さなアプリは、元々(ページサイズを変更せずに)PDFをスケーリングするために作成されました。次に、一方、他方、または両方を実行する機能を追加しました。それでも、1回のGSコールですべてを行うことはできませんでした。

これは、変数を実際の値に変更して、サイズ変更することを求めています。これは、PageByPage自動回転を使用したA4ポートレートサイズ用です。

gs \
-q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dSAFER \
-dCompatibilityLevel="1.5" -dPDFSETTINGS="/printer" \
-dColorConversionStrategy=/LeaveColorUnchanged \
-dSubsetFonts=true -dEmbedAllFonts=true \
-dDEVICEWIDTHPOINTS=595 -dDEVICEHEIGHTPOINTS=842 \
-dAutoRotatePages='/PageByPage' \
-dFIXEDMEDIA -dPDFFitPage \
-sOutputFile='../myOutputFile.pdf' \
-f '../input.pdf'

-dFIXEDMEDIA AND -dPDFFitPageも使用していることに注意してください。これはページに収まるため、スクリプトの他の部分は、サイズ変更後にPDF内のコンテンツをスケーリングするのに便利です(特にPDFの割合が大幅に変更された場合) 。それが、スクリプトでサイズ変更した後(混合モードで)常にスケーリングを実行する理由の1つです。

Paper Nameの使用時の端数問題については、mm/inchesからポイントへの変換を四捨五入する前に、それが起こっていました。私がそれらを丸め始めた後、それらは常に必要なもののようです。しかし、GSがそれらの値をフロアリングするのは奇妙に思えます。

したがって、私の結論は、さまざまなサイズと向きのさまざまなドキュメントで全面的に機能するソリューションを見つけることです。適切なソリューションを使用しているかどうかはまだわかりません。しかし、ユーザーにフリップ検出とGS自動回転を変更させることにより、少なくともほとんどの場合に解決策があればいいのですが。

また、プロセスのほとんどのコードを再構築しましたが、今では非常に読みやすくなっています。このようなタスクを自分で自動化する場合は、チェックすると便利です。もちろん、PDFのスケーリング/サイズ変更にも便利です。

https://github.com/tavinus/pdfScale

PS:pdfScaleにはその起源があります このStackOverflowスレッド上

8
Gus Neves

コマンドはスケーリングを一切行わず、PDFファイルを取り、PDFファイルに変換します。

-dPDFFitPageを追加して、PDFファイル内のページを現在のページサイズ(この場合は-sPAPERSIZEで指定)に合わせてスケーリングします)を追加することをお勧めします。

これは通常、用紙サイズが定義されているプリンタで動作することを目的としているため、ページサイズが固定されていないが試してみる価値のあるpdfwriteデバイスではうまく動作しない可能性があります。

7
KenS

出力のサイズは、サイズをポイント単位で指定し、-dPDFFitPageを使用しないことで(最適)強制できるようです。小数のポイントサイズを取得していましたが、それは悪いことでした。以下は、オンデマンド印刷サービスを使用したA5印刷用です。 「実際の」A5は420x595ポイントです。 -sPAPERSIZE = a5を使用すると小数ポイントのページサイズが得られることがわかりましたが、それは元のページが不安定だったためかもしれません。

gs \
 -o output.pdf \
 -sDEVICE=pdfwrite \
 -dDEVICEWIDTHPOINTS=419 -dDEVICEHEIGHTPOINTS=595 \
 -dFIXEDMEDIA \
 -dCompatibilityLevel=1.4 \
  input.pdf

これをテストするために、PDFshufflerを使用して個々のページをエクスポートでき、pdfinfoを使用してそれらのページの正確なサイズを取得できることがわかりました。これにより、デバイスパラメータの使用が明示的に役立つことが確認されました。

6
Tim B