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