概要
PDFのページ上に設定されいるリンク数の数えます。
VBAからAcrobat OLE経由でAcrobat JavaScriptを実行して処理をします。
サンプル
PDFの指定ページ上のリンク数を取得します。
以下は実行するAcrobat JavaScriptです。@1と@2はVBAから変更します。
001 var ret = "";
002 var istart= @1;
003 var iend = @2;
004 if(istart == -1){istart=0};
005 if(iend == -1){iend=this.numPages};
006 var numLinks=0;
007 for ( var p = istart; p < iend; p++)
008 {
009 var b = this.getPageBox("Crop", p);
010 var l = this.getLinks(p, b);
011 ret = ret + p + "," + l.length + "/";
012 numLinks += l.length;
013 }
014 event.value=ret;
015 //console.println(ret);
- @1:開始するページ番号
- 開始ページは0
- -1 は既定値の0を意味
- @2: 終了ページ番号
- 終了ページ数の -1 まで
- -1 は既定値の最後(this.numPages)までを意味
参照設定が2つ必要です。
ダウンロード:sample-GetLinkCount.xls
001 Option Explicit
002
003 '**************************************************
004 '
005 ' サンプル:リンク数を数える
006 '
007 ' https://pdf-file.nnn2.com/?p=****
008 '
009 ' @1 : First Page 0=Start
010 ' -1:Default(0)
011 ' @2 : Last Page
012 ' -1:Default(this.numPages)
013 '
014 ' サンプルの引用先:
015 ' http://kb2.adobe.com/jp/cps/511/511727/attachments/
016 ' 511727_js_api_reference.pdf#page=305
017 '
018 '**************************************************
019
020 Sub Sample_GetLinkCount()
021
022 Dim start As Double: start = Timer
023 Debug.Print "Sample_GetLinkCount " & Time
024
025 Dim sFilePathIn As String
026 Dim bRet As Boolean
027 Dim i1 As Long
028 Dim sAJS As String
029 Dim sReturn As String
030
031 Dim objAcroApp As New Acrobat.AcroApp
032 Dim objAcroAVDoc As New Acrobat.AcroAVDoc
033 Dim objAcroPDDoc As New Acrobat.AcroPDDoc
034 Dim objAcroPDPage As Acrobat.AcroPDPage
035 Dim objAFormApp As AFORMAUTLib.AFormApp
036 Dim objAFormFields As AFORMAUTLib.Fields
037
038 objAcroApp.CloseAllDocs
039 objAcroApp.Hide '稀に表示されるので隠す
040
041 'PDFファイルを開く
042 sFilePathIn = ThisWorkbook.Path & "\test-003.pdf"
043 bRet = objAcroAVDoc.Open(sFilePathIn, "")
044
045 Set objAcroPDDoc = objAcroAVDoc.GetPDDoc
046 Set objAFormApp = CreateObject("AFormAut.App")
047 Set objAFormFields = objAFormApp.Fields
048
049 Const sAcrobatJavaScript As String = _
050 "var ret = '';" & _
051 "var istart= @1;" & _
052 "var iend = @2;" & _
053 "if(istart == -1){istart=0};" & _
054 "if(iend == -1){iend=this.numPages};" & _
055 "var numLinks=0;" & _
056 "for (var p = istart; p < iend; p++)" & _
057 "{" & _
058 " var b = this.getPageBox('Crop', p);" & _
059 " var l = this.getLinks(p, b);" & _
060 " ret = ret + p + ',' + l.length + '/';" & _
061 " numLinks += l.length;" & _
062 "};" & _
063 "event.value=ret;" & _
064 "//console.println(ret);"
065
066 'Acrobat JavaScriptの編集
067 sAJS = sAcrobatJavaScript
068 sAJS = Replace(sAJS, "@1", -1)
069 sAJS = Replace(sAJS, "@2", -1)
070 ' Debug.Print sAJS
071 '▼Acrobat JavaScript の実行
072 sReturn = objAFormFields.ExecuteThisJavascript(sAJS)
073 Debug.Print "sReturn = " & sReturn
074
075 Dim sWk1() As String
076 Dim sWk2() As String
077 '実行結果を編集
078 sWk1 = Split(sReturn, "/")
079 For i1 = 0 To UBound(sWk1) - 1
080 sWk2 = Split(sWk1(i1), ",")
081 Debug.Print "Page=" & sWk2(0) & " Cnt=" & sWk2(1)
082 Next i1
083
084 '変更しないで閉じる
085 bRet = objAcroAVDoc.Close(False)
086
087 'Acrobatアプリケーションの終了
088 objAcroApp.Hide
089 objAcroApp.Exit
090
091 'オブジェクトの開放
092 Set objAcroPDPage = Nothing
093 Set objAcroPDDoc = Nothing
094 Set objAcroAVDoc = Nothing
095 Set objAFormApp = Nothing
096 Set objAFormFields = Nothing
097 Set objAcroApp = Nothing
098
099 Debug.Print "処理時間 = " & Timer - start
100 End Sub
Highlight:プログラミング言語のソースコードを構文で色分け (GUI編)
実行結果
Debug.Printで実行された結果が表示されます。
sReturn に結果が文字列で返されます。
- スラッシュ「 / 」 :ページ単位の区切り
- カンマ「 , 」 :ページ番号とリンク数の区切り
Acrobat JavaScript
各命令(メソッド、プロパティ)の説明は省略します。サンプルをそのままご使用ください。
詳細を知りたい方は、メーカーの公開マニュアル「JavaScript™ for Acrobat® API Reference Adobe® Acrobat® SDK バージョン 8.0」を御覧ください。
備考
- Acrobat JavaScriptの日本語版の解説書は上記以降は英語版しか存在しません。機能的なUpdateも殆ど無いので最新バージョンのAcrobatに相当するマニュアルも存在しません。それが現状です。
参照