概要
PDFのページ上に設定されいるリンクを削除します。VBAからAcrobat OLE経由でAcrobat JavaScriptを実行して処理をします。
サンプル
PDFの指定ページ上のリンクをすべて削除します。以下は実行するAcrobat JavaScriptです。@1と@2はVBAから変更します。
var ret = "";
var istart= @1;
var iend = @2;
if(istart == -1){istart=0};
if(iend == -1){iend=this.numPages};
var numLinks=0;
for ( var p = istart; p < iend; p++)
{
var b = this.getPageBox("Crop", p);
var l = this.getLinks(p, b);
ret = ret + p + "," + l.length + "/";
numLinks += l.length;
this.removeLinks(p, b);
}
event.value=ret;
//console.println(ret);
- @1:開始するページ番号
- 開始ページは0
- -1 は既定値の0を意味
- @2: 終了ページ番号
- 終了ページ数の -1 まで
- -1 は既定値の最後(this.numPages)までを意味
参照設定が2つ必要です。
Download:
/p1103_AFormAut-DeleteLinks.zip ( 27.5 KB )
001 Option Explicit
002
003 '**************************************************
004 '
005 ' サンプル:リンクを削除
006 '
007 ' https://pdf-file.nnn2.com/?p=1103
008 '
009 ' @1 : Firs/ Page 0=Start
010 ' -1:Default(0)
011 ' @2 : Last Page
012 ' -1:Default(this.numPages)
013 '
014 ' Update: 2026/03/23
015 ' サンプルの引用先:
016 ' http://kb2.adobe.com/jp/cps/511/511727/attachments/
017 ' 511727_js_api_reference.pdf#page=326
018 '
019 '**************************************************
020
021 Sub sample_DeleteLinks()
022
023 Dim start As Double: start = Timer
024 Debug.Print "Sample_DeleteLinks " & Time
025
026 Dim sFilePathIn As String
027 Dim sFilePathOut As String
028 Dim bRet As Boolean
029 Dim i1 As Long
030 Dim sAJS As String
031 Dim sReturn As String
032
033 Dim objAcroApp As New Acrobat.AcroApp
034 Dim objAcroAVDoc As New Acrobat.AcroAVDoc
035 Dim objAcroPDDoc As New Acrobat.AcroPDDoc
036 Dim objAcroPDPage As Acrobat.AcroPDPage
037 Dim objAFormApp As New AFORMAUTLib.AFormApp
038 Dim objAFormFields As AFORMAUTLib.Fields
039
040 objAcroApp.CloseAllDocs
041 objAcroApp.Hide
042
043 'PDFファイルを開く
044 sFilePathIn = ThisWorkbook.Path & "\test-003.pdf"
045 bRet = objAcroAVDoc.Open(sFilePathIn, "")
046
047 Set objAcroPDDoc = objAcroAVDoc.GetPDDoc
048 ' Set objAFormApp = CreateObject("AFormAut.App")
049 Set objAFormFields = objAFormApp.Fields
050
051 Const sAcrobatJavaScript As String = _
052 "var ret = '';" & _
053 "var istart= @1;" & _
054 "var iend = @2;" & _
055 "if(istart == -1){istart=0};" & _
056 "if(iend == -1){iend=this.numPages};" & _
057 "var numLinks=0;" & _
058 "for ( var p = istart; p < iend; p++)" & _
059 "{" & _
060 " var b = this.getPageBox('Crop', p);" & _
061 " var l = this.getLinks(p, b);" & _
062 " ret = ret + p + ',' + l.length + '/';" & _
063 " n/umLinks += l.length;" & _
064 " this.removeLinks(p, b);" & _
065 "}" & _
066 "event.value=ret;" & _
067 "//console.println(ret);"
068
069 'Acrobat JavaScriptの編集
070 sAJS = sAcrobatJavaScript
071 sAJS = Replace(sAJS, "@1", -1)
072 sAJS = Replace(sAJS, "@2", -1)
073 ' Debug.Print sAJS
074 '▼Acrobat JavaScript の実行
075 sReturn = objAFormFields.ExecuteThisJavascript(sAJS)
076 Debug.Print "sReturn = " & sReturn
077
078 Dim sWk1() As String
079 Dim sWk2() As String
080 '実行結果を編集
081 sWk1 = Split(sReturn, "/")
082 Debug.Print "Delete Link Count:"
083 For i1 = 0 To UBound(sWk1) - 1
084 sWk2 = Split(sWk1(i1), ",")
085 Debug.Print "Page=" & sWk2(0) & " Cnt=" & sWk2(1)
086 Next i1
087
088 'PDFファイルを別名で保存
089 sFilePathOut = Replace(sFilePathIn, ".pdf", "-New.pdf")
090 If objAcroPDDoc.Save(1, sFilePathOut) = False Then
091 MsgBox "PDFファイルへ保存出来ませんでした", _
092 vbOKOnly + vbCritical, "実行エラー"
093 End If
094
095 '変更しないで閉じる
096 bRet = objAcroAVDoc.Close(False)
097
098 'Acrobatアプリケーションの終了
099 objAcroApp.Hide
100 objAcroApp.Exit
101
102 'オブジェクトの開放
103 Set objAcroPDPage = Nothing
104 Set objAcroPDDoc = Nothing
105 Set objAcroAVDoc = Nothing
106 Set objAFormApp = Nothing
107 Set objAFormFields = Nothing
108 Set objAcroApp = Nothing
109
110 Debug.Print "処理時間 = " & Timer - start
111 End Sub
実行結果
Debug.Printで実行された結果を表示しました。

sReturn に結果が文字列で返されます。
- スラッシュ「 / 」 :ページ単位の区切り
- カンマ「 , 」 :ページ番号とリンク数の区切り
Acrobat JavaScript
各命令(メソッド、プロパティ)の説明は省略します。サンプルをそのままご使用ください。
詳細を知りたい方は、メーカーの公開マニュアル「JavaScript™ for Acrobat® API Reference Adobe® Acrobat® SDK バージョン 8.0」を御覧ください。
備考
- Acrobat JavaScriptの日本語版の解説書は上記以降は英語版しか存在しません。機能的なUpdateも殆ど無いので最新バージョンのAcrobatに相当するマニュアルも存在しません。それが現状です。
参照
