- PR -

コマンドラインからPDF→PDFの生成を行うには?

1
投稿者投稿内容
田舎の開発者
会議室デビュー日: 2007/02/20
投稿数: 18
投稿日時: 2007-09-07 00:37
%表題%の件、一見、非常に無駄なことをしている&会議室違いなようですが、しばらくお付き合いください(^^; 元ネタは以下の二つに遡ります。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=37753&forum=12&8
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=38058&forum=12
で、その後の試行錯誤の結果により、後一手で実現できるところまで漕ぎ着けました。
コロンブスの卵というヤツですが、以下の手順を踏めば良かったのです。
※以下、iTextを使用することを前提とします。

(1)切り抜きたい大きさのDocumentオブジェクトを生成
(2)切り抜き元のPDFをPdfReaderで読み込む
(3) (2)をPdfWriter#getImportedPageでPdfImportedPageに変換
(4)PdfWriter#getDirectContent()#addTemplateで重ね合わせる。ただしX/Y位置をマイナスにして、切り抜きたい場所の左下が0.0になるようにする

……PDFの場合、X.Y=0.0は左下だというところに少々注意&ロジックが必要ですが、こんな単純な操作で90%目的が達成できてしまいました。やってみるものです(^^;
※御希望の方がいらっしゃればblogでソースを公開しましょう。
 ごく簡単なモノですが(苦笑)

最後の10%が何かというと、実はこの操作をしても、ファイルの大きさはまったく変化しないのです。実はこれはAcrobat Standardでトリミングの操作を行った場合も同様で、どうやらPDFは内部のオブジェクト情報を(用紙からはみ出している部分も)そのまま保持しているようです。

で、%表題%に戻ります。このはみ出した表示されないオブジェクト情報をそぎ落とす方法として「Acrobat Readerで一旦表示させて、プリンタ『Acrobat PDF』に印刷する」という操作を実行したい、というワケなのです。

この操作を手動で行えば、ほぼ目的を達成できることは確認してあります。上記の操作で作成したPDFと比較し顕著にファイルサイズが小さくなりました。1から同じようなPDFを作成した場合と完全に同じとは行きませんが、そのままの状態よりは遥かにマシになっています。

コマンドラインから「AcroRd32.exe /t ファイル名 "Adobe PDF"」とすれば出力PDFファイル名を指定するダイアログが表示されることまでは確認できましたが、出力ファイル名を指定する方法がわかりません。

以上、何か御存知の方がいらっしゃればアドバイスを頂ければ幸いです。よろしくお願いいたします。

※追伸
 どうやら、Adobe Reader 8.1からはコマンドラインオプション「/csj」が廃止されてしまったようですね。
 これ、どーやったら代替できるんでしょう?。
 ウィンドウにクローズメッセージを送ってもプロセスが残るようですし……。困ったモンです(涙)
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-09-07 01:20
AcrobatReaderは読むことに特化されていて、
加工用のツールとして2次利用されないように対策しているのか知りませんが、
コマンドで自由に扱うには全く向いていません。

以前コマンドによる連続印刷に挑戦して苦労しました。
AcrobatReaderだけでは基本的に無理です。

AcrobatのSDK辺りを入手して自前のツールを作るか、
コマンドによる処理に特化したツールを入手する必要があると思います。
田舎の開発者
会議室デビュー日: 2007/02/20
投稿数: 18
投稿日時: 2007-09-07 10:15
質問の趣旨からは少々外れますが、Acrobat Readerを利用しての連続印刷は「まったく不可能」というわけではありません。確かにいろいろとやっかいですが……。

http://scripting.cocolog-nifty.com/blog/2007/07/pdf_7cfb.html
これはWSHでPDFの連続印刷を行う例です。Javaでも基本的に同じロジックで印刷させることが出来ます。
ただしJavaからは完全にプロセスを殺すことが出来なかった※(プロセスが終了するのを待つことは出来るのに……)ので、最後に一つ、Acrobat Readerのウィンドウが残ってしまいます。これは妥協するしかなさそうですね。

※プロセスの強制終了が(見かけ上)正常終了しウィンドウも消えるのに
 プロセスが残っていている、というコワい状態になります。
 前記の通り、ウィンドウにクローズメッセージを送ってもダメでした。
 Javaから試そうとお考えになられている方は御注意を。
 これを防ぐために「/cjs」を使っていたのですがね……。なんで廃止したんだ、Adobeめ
田舎の開発者
会議室デビュー日: 2007/02/20
投稿数: 18
投稿日時: 2007-09-08 13:37
表題の件、裏技もいいところなのですがなんとか目処が立ちました。
不特定多数に向けて公開するアプリでは到底不可能ですが、ある程度実行環境を制御できるなら使い物にはなると思います。

その方法ですが、一言で言えば「指定のディレクトリにPDFを出力する専用のプリンタを作ってしまう」です
以下はAcrobat StandardおよびAdobe Readerがインストールされていることを前提にしています。

1.プリンタの追加ウィザードを起動。
 1-(1) ローカルプリンタを選択。もちろん自動検出は使わない。
 1-(2) 「新しいポートの作成」でAdobe PDF Portを選択。任意の場所に作成した作業用ディレクトリを選択
 1-(3) 「ドライバの選択」で何故かAcrobat PDF Converterが表示されないので、とりあえず「Generic」→「Generic/Text Only」を選んでおく
 1-(4) プリンタ名を任意のものに変更する

2.追加したプリンタのプロパティを開く
 2-(1) 「詳細設定」タブでドライバを「Acrobat PDF Converter」に変更し、まずは「適用」をクリック
 2-(2) 「詳細設定」の「標準の設定」をクリック、以下の設定を行う
  2-(2)-1 「結果のAdobe PDFを表示」をOff
  2-(2)-2 「Adobe PDFの保存先を確認」をOff
  2-(2)-3 「フォントを送信しない」をOff(何故かコレをOffにしないとエラーが出ます)
  2-(2)-4 「既存のPDFの上書きを確認」をOff(デフォルトではOffのはず)
 2-(3) この操作の後にプリンタ名が変わってしまっている場合があるので、その時はプリンタ名を元に戻す

3.以下のコマンドでPDFを作成。ディレクトリはポートで指定したディレクトリに、ファイル名は同じで出力される
 acrord32.exe /t /n 元PDFファイル名 1-(4)で指定したプリンタ名

……いや、まったくもって%一行目%ですが、これで何とか目的は達成できると思います。あとは
・ファイル名を変更したい場合は元PDFファイル名を変更またはコピー
・任意のディレクトリに出力したいならプログラムで移動またはコピー
で、プログラム側で何とかしましょう
1

スキルアップ/キャリアアップ(JOB@IT)