私はPDFをスケーリングしようとしています。これは、たとえばA4サイズからA4までの小さなサイズです。
これは、ポートレートドキュメントで正常に機能します。ドキュメントが正しく拡大され、上部にパディングが追加されます。
ただし、ランドスケープドキュメントではパディングは追加されません。そのため、ドキュメントはA4の正しい高さになりますが、ドキュメント側にパディングが追加されないため(希望どおり)、幅が十分ではありません。
これは、A4ポートレートドキュメントで機能させるために使用するものです。
gs \
-sOutputFile=output.pdf \
-sDEVICE=pdfwrite \
-sPAPERSIZE=a4 \
-dCompatibilityLevel=1.4 \
-dNOPAUSE \
-dBATCH \
-dPDFFitPage \
input.pdf
-dFIXEDMEDIA
スイッチを追加する必要があります。
gs \
-o output.pdf \
-sDEVICE=pdfwrite \
-sPAPERSIZE=a4 \
-dFIXEDMEDIA \
-dPDFFitPage \
-dCompatibilityLevel=1.4 \
input.pdf
特定の用紙/ページ/メディアサイズを強制し、ドキュメントで指定された用紙/ページ/メディアサイズを無視する必要がある場合、-dFIXEDMEDIA
は常に必要です。 PDFには常に用紙/ページ/メディアのサイズが定義されています(PostScriptには、ある場合とない場合があります)。
(私の-o ...
は短く、-dBATCH -dNOPAUSE
を追加する必要がありませんが、Ghostscriptの最新バージョンでのみ機能します。)
まず、ここに投稿したすべての人に感謝します。
pdfScale と呼ばれるこの小さなスクリプトがあり、ここに投稿された回答の一部を吸収しました。そこで、2セントを差し戻すことにしました。私はカートとティムの答えを少し混ぜて使っています。しかし、ティムのものに似ています。私はこれを数日間試しましたが、ここに投稿された方法に関する私の部分的な結論は次のとおりです。
_-sPAPERSIZE
で名前で用紙サイズを設定
PSポイントで用紙サイズを設定-dDEVICEWIDTHPOINTS
、-dDEVICEHEIGHTPOINTS
-dDEVICEWIDTH
、-dDEVICEHEIGHT
を使用していましたが、どちらも同じことをしているようです(両方ともポイントを取得します)。私のbashスクリプトは既にソースページサイズを取得できるため、カスタムページサイズを設定できるというアイデアが気に入ったため、ポイント単位でページサイズを設定することに集中することにしました。また、スクリプトに GS Paper Sizes を(名前とサイズとともに)含めました。そのため、その情報を取得するのも簡単でした。
前に指摘したように、両方のケースで-dFIXEDMEDIA
を使用することは必須のようです。
だから、これは私のアプローチがどのように進んだかです(スクリプト形式で)
自動回転の問題を修正しようとしていたとき、 この他のカート応答が見つかりました 。これは、-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スレッド上 。
コマンドはスケーリングを一切行わず、PDFファイルを取り、PDFファイルに変換します。
-dPDFFitPageを追加して、PDFファイル内のページを現在のページサイズ(この場合は-sPAPERSIZEで指定)に合わせてスケーリングします)を追加することをお勧めします。
これは通常、用紙サイズが定義されているプリンタで動作することを目的としているため、ページサイズが固定されていないが試してみる価値のあるpdfwriteデバイスではうまく動作しない可能性があります。
出力のサイズは、サイズをポイント単位で指定し、-dPDFFitPageを使用しないことで(最適)強制できるようです。小数のポイントサイズを取得していましたが、それは悪いことでした。以下は、オンデマンド印刷サービスを使用したA5印刷用です。 「実際の」A5は420x595ポイントです。 -sPAPERSIZE = a5を使用すると小数ポイントのページサイズが得られることがわかりましたが、それは元のページが不安定だったためかもしれません。
gs \
-o output.pdf \
-sDEVICE=pdfwrite \
-dDEVICEWIDTHPOINTS=419 -dDEVICEHEIGHTPOINTS=595 \
-dFIXEDMEDIA \
-dCompatibilityLevel=1.4 \
input.pdf
これをテストするために、PDFshufflerを使用して個々のページをエクスポートでき、pdfinfoを使用してそれらのページの正確なサイズを取得できることがわかりました。これにより、デバイスパラメータの使用が明示的に役立つことが確認されました。