私はこのデジタルの世界で生き残るのにかろうじて十分に知っています。
1ページのポストスクリプトファイル(グラフ/画像)がたくさんあります。PDFに変換して、自動的に狭いボックスにトリミングしたいと思います。私は今Windowsを使用しています(私もLinuxを使用しているので、Linux用のコードを投稿することを躊躇しないでください)
私は過去にGhostscriptgswin32c.exeとCalibrepdfmanipulate.exeを組み合わせることで成功しました。これはおそらく、ここの多くの人にとってなじみのあるアプローチです。
しかし、このアプローチにはいくつかの理由で問題があります。
64ビットのgswin64c.exeに「アップグレード」した後、1つの問題が発生しました。32ビットバージョンのgswin32c.exeはまだ私のシステムで動作するので、あまり文句を言うことはできません。
おそらく不適切にコーディングされたポストスクリプトファイルを処理しているときに、別の問題が発生しました。少なくとも2つの問題があるようですが、どちらが原因であるか、または両方が原因であるかはわかりません。1つの問題は、バウンディングボックスの行(%% BoundingBox:135 179 484 587など)が常に上から2番目の行に配置されるとは限らないことです。それが問題になる可能性があることを理解しています。もう1つの問題は、上の境界ボックスがGhostscriptの「縦」の向きに対応しているのに、トリミングが「横」の向きに従っていることです。私が特定していないさらに別の問題は、一部のファイルではトリミングが非常にランダムに見えることです。
だからここに私の32ビットアプローチ(高品質のファイルで機能します)が続き、64ビットの適応は機能しません(おそらく、 httpsを理解している場合、calibreによって提供されるパッチスクリプトではなく、私のマシンでいくつかのpypdfスクリプトを呼び出すためです: //bugs.launchpad.net/ubuntu/+source/calibre/+bug/800551およびhttp://www.mobileread.com/forums/archive/index.php/t-103097.html、しかし私は推測しているだけですとにかく回避策がわからない):
@echo off echo batch processing with Latex ps2pdf followed by Ghostscript gswin64c.exe and Calibre2 pdfmanipulate.exe for %%I in (*.ps,*.eps) do ( "C:\Program Files\MiKTeX 2.9\miktex\bin\x64\ps2pdf" %%I ) for %%I in (*.pdf) do ( "C:\Program Files (x86)\Ghostscript\gs9.00\bin\gswin32c.exe" -dSAFER -dNOPAUSE -dBATCH
-sDEVICE#bbox "%%I" 2> bounding "C:\Program Files (x86)\Calibre2\pdfmanipulate.exe" crop -o "%%~nICropped32.pdf" -b bounding "%%I" pause "C:\Program Files\Ghostscript\gs9.04\bin\gswin64c.exe" -dSAFER -dNOPAUSE -dBATCH
-sDEVICE#bbox "%%I" 2> bounding "C:\Program Files (x86)\Calibre2\pdfmanipulate.exe" crop -o "%%~nICropped64.pdf" -b bounding "%%I" pause )
上記の32ビットアプローチは、PSTricksまたはMapleの標準2Dプロットドライバーによって生成されたPostscriptレベル3などの高品質ファイルで機能しますが、古いファイルなどでは機能しません。Mapleの古典的なプロットドライバーによって作成されたPostscriptレベル2(その場合)。
私はいくつかのそのようなファイルの回避策を見つけました。これは、(MiKTeX)LaTeXディストリビューションのepstopdfを使用することで構成されています。それらのMapleクラシックファイルで動作します。残念ながら、PSTricksやMatlabなどの他のソフトウェアを使用して数年前に生成した他のいくつかのポストスクリプトファイルでは機能しません。
したがって、いくつかの変換を行い、機能したものを選択する必要があります。私の生活を楽にする提案があればいいのにと思います。BoundingBoxとPortrait/Landscapeの問題を修正できれば、かなり満足できるはずです。
よろしくお願いします。Linuxの提案は受け入れられます。私の好みは、「return」キーを1回押すだけでさまざまなファイルを処理できる可能性のあるソリューションです。
そしてもちろん、私はロスレスタイプのトリミングを探しています。これは、バウンディングボックスを解釈することだけで構成され、(おそらく)低品質のpdfに変換することではありません。
編集:私は言うのを忘れました。gswin32c / pdfmanipulateを高品質レベル3のポストスクリプトファイルに適用すると、「bounding」という名前のファイルに次のような情報が入力されます。
%% BoundingBox:34128 567 667 %% HiResBoundingBox:34.364390 128.875004 566.054069 666.071980
上記の例では、ファイルはすでにほとんどトリミングされています。%%BoundingBoxと%%HiResBoundingBoxの間の近さに注意してください
しかし、低品質レベル2(またはそう主張している)のポストスクリプトファイルに適用すると、「バウンディング」ファイルは次のようになります。
%% BoundingBox:189 137 574 467 %% HiResBoundingBox:189.485994 137.843996 573.299983 466.668478
しかし、バウンディングボックスは実際には%% BoundingBoxである必要があります:135 179 484 587上記(135 179 484 587)は、postscriptファイル自体(コピー貼り付けによって2行目に移動)によって提供されるバウンディングボックスです。縦向きのときにGhostview/Ghostscriptによって解釈されるバウンディングボックスと一致します。
しかし、Ghostscriptでは完全に無視されます...
189 137574467がどこから来たのかわかりません---それは非常に間違っています...
編集2.ケンの質問に答えて、いくつかの点を明確にしたいと思います。
こんにちはケン、お返事ありがとうございます、
私の質問が不明確だった場合は申し訳ありません---それでもあなたはその要点を理解しているようです---あなたの質問を順番に取り上げさせてください:
なぜ2つのアプリケーションを使用しているのかわかりませんが、Ghostscriptだけで変換全体を実行できるはずです。
Ghostscriptですべてを行う方法が見つからなかったので、別の方法を使用しました。ここ、http://www.mobileread.com/forums/archive/index.php/t-72885.htmlなどでGhostscript / Calibrateの提案を見つけました。他の場所で試してみましたが、最近まで機能していました。
Ghostscriptですべてを行うことができないと言っているのではなく、単に方法が見つからなかったと言っているだけです。
「64ビットgswin64c.exeに「アップグレード」した後、1つの問題が発生しました。」問題が何であるかをまだ言っていませんが、バグとして報告しましたか?バグを報告しないと修正されません......
問題とバグレポートを説明するリンクをここに示しました:https ://bugs.launchpad.net/ubuntu/+source/calibre/+bug/800551、http : //www.mobileread.com/forums/archive/ index.php / t-103097.html、私の問題はまったく同じです。
PostScriptプログラムとコメントの間に混乱があるようです。'%'で始まるPostScriptプログラムの行はコメントであり、プログラムの動作には影響しません。したがって、BoundingBoxコメントは何もしません。
可能であれば、私は違うように頼みます。ポストスクリプトファイルを取り、%% Bounding Boxを削除し、保存してGhostviewで開きます。Ghostviewはエラーメッセージをスローし、バウンディングボックス情報を使用せずにそれを表示します。たとえば、バウンディングボックスでしっかりと囲まれているのではなく、多くの空白で囲まれている図です。そうです、少なくともGhostview内では、このコメントは何かをします。%% Bounding Boxを削除した後、Calibre / pdfmanipulateを使用してpdfをトリミングすると、%%BoundingBoxが機能する場合に誤ってトリミングされます。したがって、この「コメント」は、表示とトリミングのコンテキストで非常に役立ちます。
ファイルの2行目である必要はないことに注意してください。
アドビが推奨しています。アドビからの引用、
「2番目に必要なDSCヘッダーコメントはEPSファイルのサイズに関する情報を提供し、インクルードアプリケーションがEPSファイルを適切に変換およびクリップできるように存在する必要があります。これはバウンディングボックスのコメントです。」
http://partners.adobe.com/public/developer/en/ps/5002.EPSF_Spec.pdf
アドビは「しなければならない」と言います。個人的には、適切にバインドされたepsからpdfを生成できる限り、それが必須であるかどうかを気にする必要はありません。
通常、GhostscriptはDSCコメントを無視しますが、ProcessDSCをtrueに設定すると、使用が非常に制限されます(主にページサイズを設定するためのBoundingBoxコメント)。
pdfmanipulateを使用すると、適切にトリミングされたpdfと不適切にトリミングされたpdfの間にすべての違いが生じます。
次に進みます。LaTeX ps2pdfを使用しているとのことですが、PostScriptファイルが既にある場合は、それをGhostscriptに送信してPDFに変換できます。この場合、ページの実際のバウンディングボックスを見つけるために、Ghostscriptを正確に何に使用しているのかわかりません。
はい。
「ロスレス」トリミングの意味は私にはわかりません。コンテンツをトリミングすると、空白だけであっても、明らかに何かを失うことになります。
つまり、トリミングプロセスで画像全体を「ラスタライズ」(またはそれが何と呼ばれていても、用語を知っているでしょう)したくないということです。切り抜かれたファイルの部分は私には役に立たないので、それほど大きな損失にはなりません。切り抜き内にあるファイルの部分は、元のファイルと同じ品質である必要があります。それが一般的な考え方です。
これについてのコメントはここにあります。これは私が有用な情報を見つけた場所の1つです 。http://www.charlietanksley.net/philtex/reading-pdfs-on-portables/
トリミングしたいサイズがわかっている場合は、1回のパスで変換を実行するのは簡単です。
いいえ、サイズがわかりません。そのため、ソフトウェアで計算してもらうためにこのような長さにします。Ghostscriptとepstopdfが常に最適なクロップに同意するとは限らないため、これは明らかに単純なことではありません。一部のファイルには適切ですが、他のファイルには適切ではありません。他のファイルには適切ですが、一部のファイルには適切ではありません...
サイズがわからない場合は、最初にBoundingBoxを抽出することで、Ghostscriptのみを使用して2パスで実行できます。これにより、バウンディングボックスの左下と右上の4つの数字が表示されます(私が正しく覚えている場合)。次に、「変換」PostScript操作を作成して、ページのコンテンツを左下に移動します(0,0、左下隅から開始します)。また、ページサイズを設定するためのページデバイスリクエストを作成します。サイズは、幅=右-左および高さ=上-下で指定されます。元のファイルをPostScript演算子とともにGhostscriptにフィードし、pdfwriteデバイスを選択すると、PDFファイルが取得されます。
バッチファイルの例があれば、便利です。私はpdfwriteに基づくいくつかの例を見てきましたが、私が試したものはどれもうまくいきませんでした。悪魔は詳細に宿っています。
バウンディングボックスに関する限り、それはバグであるか、ファイルがマークを付けている可能性があり、外側の場所で白いインクを使用している可能性があります。この場合、バウンディングボックスデバイスはそれをページコンテンツの一部と見なします。そうではないことがわかるかもしれませんが、デバイスはできません。ページが最初に暗い背景で塗りつぶされたかどうか、およびコンテンツが白インクを使用して輪郭が描かれているかどうかを検討してください。
ファイルはすべてMatlab、Maple、PSTricksなどのソフトウェアで作成されており、%% Bounding Boxで指定された領域の外側に目に見えない白いマークが表示される可能性はほとんどありません(ただし、明らかに不可能ではありません)。
多くの場合、%% Bounding Boxコメントには必要なすべての情報が含まれているので、Ghostscript、Calibre、pdfwrite、またはその情報を使用する人を希望します。
私はあなたが何をしたいのかをもっと理解し、理想的にはあなたの問題のあるファイルを1つ以上見なければ、包括的な解決策を提供することはできません。
それは非常に簡単ですが、どうすれば閲覧用のポストスクリプトファイルを投稿できますか?420キロバイトです。
ケンに感謝します。実行可能な解決策が見つかることを願っています。
編集3.私は問題の大部分を特定しました。
私のポストスクリプトファイルには、最適な切り抜きにかなり近い次のバウンディングボックスがあります:%% BoundingBox:135 179 484 587
Ghostscript gswin64c / gswin32cを実行してバウンディングボックスを計算すると、
for %%I in (*.ps,*.eps) do ("C:\Program Files\Ghostscript\gs9.04\bin\gswin64c.exe" -dSAFER -dNOPAUSE -dBATCH -dAutoRotatePages=/None -sDEVICE#bbox "%%I" 2> bounding)
私は得る:
%% BoundingBox:145189475574 %% HiResBoundingBox:145.331574 189.485994 474.155986 573.299983
ps2pdfに続いてGhostscriptgswin64cを実行すると、つまり
for %%I in (*.ps,*.eps) do ("C:\Program Files\MiKTeX 2.9\miktex\bin\x64\ps2pdf" %%I)
for %%I in (*.pdf) do ("C:\Program Files\Ghostscript\gs9.04\bin\gswin64c.exe" -dSAFER -dNOPAUSE -dBATCH -dAutoRotatePages=/None -sDEVICE#bbox "%%I" 2> bounding)
次のバウンディングボックスが表示されます。
%% BoundingBox:189 137 574 467 %% HiResBoundingBox:189.395994 137.843996 573.299983 466.668478
したがって、問題は、ps2pdfを使用してpsからpdfに変換すると、バウンディングボックス情報が変更され、誤ったトリミングが発生することです。したがって、ps2pdfをeps2pdfのような他のものに置き換えると、ここでの問題が解決します。もちろん、他の解決策もあります。Kenとluserdroogが提案したように、Ghostcriptのみを含むソリューションは特に価値があります。彼らの非常に価値のある(そして私のクイックフィックスよりも優れた)提案を以下に示します。このようなものが機能しました:
for %%I in (*.eps,*.ps) do ("C:\Program Files\MiKTeX 2.9\miktex\bin\x64\epstopdf" %%I)
for %%I in (*.pdf) do (
"C:\Program Files\Ghostscript\gs9.04\bin\gswin64c.exe" -dSAFER -dNOPAUSE -dBATCH -dAutoRotatePages=/None -sDEVICE#bbox "%%I" 2> bounding
"C:\Program Files (x86)\Calibre2\pdfmanipulate.exe" crop -o "%%~nICropped.pdf" -b bounding "%%I"
)