最近はPDFを使って印刷物の校正をおこなうことも珍しくなくなっていると思われます。
校正用の専用システムを使ってクライアントとやり取りすることも最近では増えてきているようですが、まだまだお手軽さという点においてPDFが勝りますね。
PDFの校正と言えば注釈機能が有用ではありますが、手書き感覚で使う分には良いのですが、どうもきっちりしたものを書く場合には不便なところがあります。
特に校正を出す側の作業だと思いますが、折り線の位置や2穴の位置など絵柄に出ない部分の表示など、データにレイヤー分けして作成したものをPDFにするのも手ではあると思いますが、校正後新たに印刷用のPDFを作成し直したり、あやまって折り線のついた印刷物ができてしまったりと、面倒を増やすことにもなりかねません。
その点注釈ですと、ほとんどのRIPで印刷されないようになっていると思いますし、そのままのデータを印刷用としても使えるのは便利だと思います。
そこで、注釈機能のラインや円や四角をスクリプトで制御して作れるようにしようと考えた次第です。
実は、すでに数年前からMacintosh版は実用化したものがあったのですが、今回機能を充実させ、なおかつWindowsでも同様のものができないかと色々試していました。
しかし、非常に難航しています。
何がって、Windowsでの制御はとても難しいです。
Acrobatを制御する方法として、もっとも自由度の高いのはJavascriptだと思います。
外部からAcrobatを制御するにしても、AppleScriptならdo scriptコマンドでJavascriptを制御できます。
1 2 3 4 5 6 7 8 9 10 11 |
tell application "Adobe Acrobat" activate set myDocument to active doc tell myDocument set myPage to page number of PDF Window 1 tell page myPage set myJS to "aObj = this.addAnnot({type: \"Line\",page: " & (myPage - 1) & ", points: [[50,50],[300,300]],strokeColor:color.cyan, style: \"D\", dash: [3,2], width: 1, author: \"tu-kazu\"});" do script myJS end tell end tell end tell |
ところがWindowsとなると、当然AppleScriptは使えません。
VBScriptでもある程度は制御できるのですが、Javascriptを扱うことができません。
色々調べて見たのですが、GetJSObjectてのが唯一のキーワードだったのですが、どうにもこうにも上手くいきません。
諦めたっと思ったんですが、折角何日もかけて調べたのに何も生産的なことに活かされていないのは残念で仕方ありません。
少しでも調べたことをここに掲載し、同じようなことを調べられている方の一助となればと思います。
まずはExcelからVBAで、現在開いているPDFのタイトルとページ数を調べるマクロを掲載します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Sub pdfPage() Dim objAcroApp As New Acrobat.AcroApp Dim objAcroAVDoc As New Acrobat.AcroAVDoc Dim objAcroPDDoc As Acrobat.AcroPDDoc Dim PDFTitle As String Dim PDFPageCount As Integer Set objAcroAVDoc = objAcroApp.GetActiveDoc 'PDFファイル名のタイトルを表示する。 PDFTitle = objAcroAVDoc.GetTitle() Set objAcroPDDoc = objAcroAVDoc.GetPDDoc() PDFPageCount = objAcroPDDoc.GetNumPages MsgBox "PDFファイル:" & PDFTitle & "の全ぺーじ数=" & PDFPageCount End Sub |
こんな感じで、開いているドキュメントに対しVBAでもJavascriptでもどちらでもいいんだけど注釈を生成できれば良いのですが、生憎とVBAではテキストのハイライトなどテキスト周りしか機能がありません。
そこでJavascriptの出番なのですが、AcrobatのOLE(AdobeではIACと呼んでるそうです)機能では、GetJSObjectぐらいしか見当たりません。
色々と試した結果、直接Javascriptをスクリプト中に埋め込んで利用することはできませんでした。
何となく試行錯誤してできたものが以下になります。
とりあえずここではAnnotLineと言うマクロを作ります。
マクロ名を入力して編集ボタンを押します。
編集画面のツールメニューから参照設定を選択します。
参照設定を選択するリストからAcrobatにチェックを入れ、OKボタンを押す。
ユーザーフォームの挿入から図のようなフォームを作成します。
CmmandButton1をダブルクリックしてコードを入力します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Private Sub CommandButton1_Click() Dim objAcroApp As New Acrobat.AcroApp Dim objAcroAVDoc As New Acrobat.AcroAVDoc Dim objAcroPDDoc As Acrobat.AcroPDDoc Dim objJso As Object Set objAcroAVDoc = objAcroApp.GetActiveDoc Set objAcroPDDoc = objAcroAVDoc.GetPDDoc() Set objJso = objAcroPDDoc.GetJSObject objDoc = objJso.app.activeDocs Res = objJso.AddLine(TextBox1.Text, TextBox2.Text, TextBox3.Text, TextBox4.Text) End Sub |
AddLine(TextBox1.Text, TextBox2.Text, TextBox3.Text, TextBox4.Text)の部分がJavascriptのファンクションになります。
つまりPDF自体に最初からJavascriptを埋め込んでおき、それをOLEで呼び出すこととなります。
1 2 3 4 5 6 7 8 9 10 11 12 |
function AddLine(x1,y1,x2,y2){ this.addAnnot( {type: 'Line', page: 0, points: [[x1,y1],[x2,y2]], strokeColor:color.cyan, style: "D", dash: [3,2], width: 2, author: 'tu-kazu'} ); } |
PDFの文書レベルJavascript編集で上記スクリプトを登録します。
Excelのマクロを実行し、各TextBoxに数値を入力し、ボタンを押せば指定した位置に注釈のラインが作成されます。
もっとフォームを改造してポイントだけではなく、ラインの色、太さ、スタイルを変更することもできます。
でも、PDFに事前にJavascriptを埋め込まなければならないなど、どうも使い勝手が悪すぎます。
せめてJavascriptだけでも外部に保存するなどの手はないでしょうか。
最後になりましたが、AcrobatのOLEに関しては、http://pdf-file.nnn2.com/を大変参考にさせていただきました。