2016-12-14 58 views
0

ここでは、Ghostscriptを使用してドキュメントをトリミングする方法について、かなりの質問と回答があります。 しかし、答えは私の正確なニーズに合っておらず、私にはまだ混乱しています。 私は1つのオプションがあると予想しました。 "-AutoCropToBBox"またはこのようなもの。Ghostscript:STDINを「バウンディングボックス」に自動的にトリミングしてPDFに書き込む方法は?

明確にするために、境界ボックスとして、すべての(白ではない(?))印刷オブジェクトを完全に含む最小の長方形のボックスを理解します。

さらに、基本的にどのアプリケーションからでもPostscriptプリンタに印刷することで、クロップされたPDFを生成するために、プリンタポ​​ートリダイレクト(RedMon)を使用する必要があります。

/c gswin64c.exe -sDEVICE=pdfwrite -o -sOutputFile="%1".pdf -

「%: Redirected port properties Win7/64bit

出力はプログラムの引数は、 C:\Windows\system32\cmd.exe

にリダイレクトされます。 だから、Win7の/ 64ビットの下で、私は、リダイレクトされたポートのプロパティを設定しました1 "にはfilenameのユーザー入力が含まれます。これで、私はフルページのPDFを取得します。ファイン!

しかし、トリミングオプションを追加するにはどうすればよいですか?

その他の質問: 複数ページのドキュメントがある場合、そのような(自動)トリミングはページごとに個別に行われますか?または、それをすべて同じに保つオプションがありますか?最初のページのように、またはすべてのページの最大のバウンディングボックスのように?

関連する別の問題: ファイル名の入力を求めるプロンプトが、私が印刷しているアプリケーションの背後に常にポップアップしています。常にそれを前面に持っていくためのアイデアはありますか?

別の質問: Perlスクリプト "ps2eps"とプログラムbbox.exe(http://ctan.org/pkg/ps2epsを参照)があります。 Ghostscript(またはps2epsi)が誤ってバウンディングボックスを計算していると言われています。これは(まだ)本当ですか?

ありがとうございました。

+0

あなたは 'gswin64c.exe -sDEVICE = bbox -dBATCH -dNOPAUSE pdfname'を実行することでbboxを得ることができます。 –

+0

Thanks、@Stefan Hegny。私がここで見つけたもの: 'gswin64c.exe -q -dBATCH -dNOPAUSE -sDEVICE = bbox -dLastPage = 1 GsCrop.ps | findstr %% BoundingBox'私の質問は、これらの数値をさらにどのように使用するのですか? – theozh

答えて

1

最初の問題は、通常、PostScriptプログラムが特定のメディアサイズにレンダリングされることを想定して作成され、通常は密接にバインドされていないことです。空白は読みやすさのために重要です。

通常、生成するPostScriptプログラムは特定のメディアサイズを要求します。インタープリタはそれに合わせて最適な処理を行います。それが一致しない場合は、できるだけ近くにしようとする戦略を使用し、そのメディアに合わせてコンテンツ全体を拡大/縮小します。

すべてのマーキングコンテンツをレンダリングするまで、必要なサイズがわからなくてもバウンディングボックスがわからない場合は、プリンタでこれらの処理を実行することはできません。いくつかのファイルは一般に、EPSファイルに%% BoundingBoxコメントがありますが、それはコメントです.PostScriptを解釈したくないアプリケーションのために、PostScriptには効果がありません。

あなたが望むシンプルなスイッチがそこにないのは、それがレンダリングのためにインタープリタの通常の機能を破壊するからです。

最初に行う必要があるのは、コンテンツの境界ボックスを決定することです。 Stefanの説明によると、bboxデバイスを使用して、これを行うことができます。そしてそのメモでは、私が知っている限り、bboxデバイスは正確な出力を生成します。そうでなければ、私たちが修正できるように、それを証明するバグ報告に感謝します。人々がバグを報告しないと、どうやって彼らについて知っているはずですか?それは、誰かがバグ報告を助ける代わりにFUDを広げるのを見るのには残念です.......

ps2epsiは、その冗長で安価で陽気なスクリプトではありません。ただし、元のPostScriptがスタックに残っている場合、破損した(または無効な)EPSファイルとして終了し、使用しようとする前に元のPostScriptを修正してから、試行するPostScriptプログラムを壊しますそれを使用する(たとえば、EPSを文書に含めて印刷する場合)。

Ghostscriptを使用していて、PostScriptプログラムを取得してEPSを取得したい場合は、eps2writeデバイスを使用します。率直に言ってプレビューブームはありません。

bboxデバイス(およびeps2write)レコードすべてのマーキング操作を正しく覚えていれば、白以外のマーキング操作はすべて記録できません。白がページの既存のマークを上書きするとどうなりますか?メディアがではない場合は、は白ですか? Ghostscriptを使用してPNGにレンダリングすると、出力の手の届かない部分は透明になりますが、白いマークは透明ではありません。

したがって、bboxは色に関係なくすべてのマーキング操作の範囲です。進めるべき他の唯一の方法は、コンテンツをレンダリングし、白以外のピクセルを数えることです。しかし、それは特定の解像度でのみ動作し、解像度を変更し、正確な境界ボックスも同様に変化する可能性があります。

バウンディングボックスを取得したら、Ghostscriptにそのサイズのメディアを使用させることができます。 は、コンテンツが左下隅でしっかりと開始される可能性はほとんどないため、原点を翻訳する必要があります。メディアサイズを設定するには、-dDEVICEWIDTHPOINTSと-dDEVICEHEIGHTPOINTSが必要です。PostScriptを送信して、原点を適切に変更するには、-cと-fを使用する必要があります。単純な場合、 '-x -y translate'で十分ですが、プログラムがinitgraphicsを実行する場合は、BeginPageプロシージャを設定して初期CTMを変更する必要があります。

-dDEVICEWIDTHPOINTSなどでメディアサイズを設定した場合、すべてのページは同じサイズになります。あなたが望んでいなければ、BeginPage手続きを書いて個々のページのサイズを変更する必要があります(setpagedeviceをフックして/ PageSizeのエントリを辞書から削除する必要もあります)。

Windowsがなぜアクティブなウィンドウの後ろにダイアログボックスを置くと、それはWindows 7(またはおそらくVista)でそれをやり始めているようですが、私はダイアログを生成しているかどうかわからないので、変更する方法はありません.... 。

個人的には、Ghostscriptのeps2writeデバイスを使ってオリジナルを実行し、EPSを取得してpdfwriteデバイスと-dEPSCropスイッチを使用してPDFファイルを作成する2段階アプローチを試してみることをお勧めします。他の解決方法は悪いです。EPSファイルが複数ページであることができないので、nページのPostScriptプログラムから 'n'個のEPSファイルを作成してから、各EPSファイルをpdfwriteデバイスへの入力としてリストするコマンドラインを提供する必要があります。

スクリプトを試す前に、サンプルファイルを用意し、コマンドラインから試してみてください。

+0

この詳細な説明は、@KenSに感謝します。私はこれを最初に消化してさらに試してみる必要があります... – theozh

+0

私は今このコマンドラインを試しました: '/ c gswin64c.exe -q -sDEVICE = eps2write -sOutputFile ="%1 ".eps -o - && gswin64c.exe -q -sDEVICE = pdfwrite -dEPSCrop -o "%1" .pdf "%1" .eps'これは、EPSとPDFを生成します。しかし、最小限のボックスで両方が切り取られます。左側が大丈夫と思われる、上部と下部はあまりにも多くのスペースが残っている。バグか機能ですか?私のテストファイルの右側には、AcrobatReaderでPDFを開くと表示されない縦線があります。 Acrobatのバグ?しかし、GSViewでEPSとPDFを見ると、私はそのラインを見ることができます。かなり変な? – theozh

+0

申し訳ありませんが、右側もOKです。ページ内の背景が暗いため、Acrobatではほとんど見えませんでした。 – theozh

0

Iは@KenSの説明から理解されるように:

  1. 方法eps2write作品、それは2段階にする必要がないか、またはしないか、実際に可能な最小境界ボックス
  2. をもたらすことができません

    REDIR:

BBOX -sDEVICE =介したプロセスは、だから、私は今、次のプロセスへの「印刷」が正しい可能な最小のバウンディングボックスでPDFになってしまいましたプログラムの C:\Windows\system32\cmd.exe

引数cmd.exeをするectedプリンタポ​​ート:

/c gswin64c.exe -q -o "%1".ps -sDEVICE=ps2write - && gswin64c.exe -q -dBATCH -dNOPAUSE -sDEVICE=bbox -dLastPage=1 "%1".ps 2>&1 >nul | perl.exe C:\myFiles\CropPS2PDF.pl "%1" 

は残念ながら、それは(:CropPS2PDF.plのは、それを呼びましょう):小さなPerlスクリプトを必要と

#!usr/bin/perl -w 
use strict; 
my $FileName = $ARGV[0]; 
$/ = undef; 
my $Crop = <STDIN>; 

$Crop =~ /%%BoundingBox: (\d+) (\d+) (\d+) (\d+)/s; # get the bbox coordinates 
my ($llx, $lly, $urx, $ury) = ($1, $2, $3, $4); 
print "\n$FileName: $llx, $lly, $urx, $ury \n"; # print just to check 

my $Command = qq{gswin64c.exe -q -o $FileName.pdf -sDEVICE=pdfwrite -c "[/CropBox [$llx $lly $urx $ury]" -c " /PAGE pdfmark" -f $FileName.ps}; 

print $Command; # print just to check 
system($Command); # execute command 

それはうまくいくようです:-) 改善を歓迎します。

私の質問はまだです:

  1. これはPerlのなしで何とか行うことができますか?ちょうどWin7、cmd.exeとGhostscript?
  2. 私が必要としないPS-Fileをディスクに書き込んでいない可能性がありますか?もちろん、Perlスクリプトを使用して後で削除することもできます。
関連する問題