テキストにリンクを追加

TOP > サンプル / 関数 > *      [...]


相馬野馬追@TCK

 

概要

PDFの指定テキストに以下のリンクを追加します。

  1. PDF内のページ移動
  2. 他のPDFファイルを開く
  3. Webページを開く

処理方法は大きく2つです。

  1. 指定テキストのページ番号と座標を取得
  2. その情報でリンクを追加する為のAcrobat JavaScriptを実行

共にVBAからAcrobat OLE経由でAcrobat JavaScriptを実行して処理をします。

 

座標の扱いに問題が有ることが分かりました。当ページに書かれている内容は「正常に機能しない」場合が有ります。イタリック文字や回転文字には機能しません。現在は対応方法を検証しながら新バージョンの製作中。(2020/5/17)

 

関数の利用

関数:文字列のページ番号と座標を返す」で紹介している関数: GetTextsGetRects を使用して、文字列検索をさせ、そのページ番号と座標を取得します。その結果を使ってリンクを追加します。

 

サンプル

テキストを検索し、それに以下のリンクを設定します。

  • "マニュアルを参照": ABC.pdfを開く
  • "PDF": pdf-file.nnn2.comを開く
  • "目次の先頭": ページ番号=2へ移動

以下は実行するAcrobat JavaScriptのサンプルです。

var link = this.addLink(0, [200,200,400,300]); link.setAction( "this.pageNum = 9"); link.borderColor = color.red; link.borderWidth = 1;

 

参照設定が2つ必要です。

ダウンロード:sample-AddLinkTexts.xls

 

 

001 Option Explicit 002 003 '************************************************** 004 ' 005 ' サンプル:テキストにリンクを追加 006 ' 007 ' 作成:2020/04/01 008 ' 更新:2020/04/09 009 ' 010 ' https://pdf-file.nnn2.com/?p=1100 011 ' 012 ' メモ: 013 ' 「プロパティ」の「ィ」部分のTopとBottomの 014 ' 座標が小数点2以下から違う場合があった。 015 ' コレぐらいの誤差はナシとし、同じ行と扱う。 016 ' 017 '************************************************** 018 019 Sub Sample_AddLinkTexts() 020 021 Dim start As Double: start = Timer 022 Debug.Print "Sample_AddLinkTexts " & Time 023 024 Dim bRet As Boolean 025 Dim sFilePathIn As String 026 Dim sFilePathOut As String 027 Dim iOutCnt As Long 028 Dim i1 As Long 029 Dim sInSerchText() As String 030 Dim sAction() As String 031 ReDim sInSerchText(5) As String 032 ReDim sAction(5) As String 033 ReDim gTextRects(100) As typeTextRect 034 035 '初期化 036 i1 = 0 037 ' 検索テキスト 038 sInSerchText(i1) = "マニュアルを参照" 039 ' リンクで動作するAcrobat JavaScript 040 sAction(i1) = "app.openDoc('/D/ABC/xyz.pdf');" 041 'sAction(i1) = "app.openDoc('/I//サンプル/test-001.pdf');" 042 i1 = i1 + 1 043 sInSerchText(i1) = "PDF" 044 sAction(i1) = "this.getURL('https://pdf-file.nnn2.com/');" 045 i1 = i1 + 1 046 sInSerchText(i1) = "目次の先頭" 047 sAction(i1) = "this.pageNum=3;" 048 i1 = i1 + 1 049 sInSerchText(i1) = "プロパティ" 050 sAction(i1) = "this.pageNum=3;" 051 i1 = i1 + 1 052 sInSerchText(i1) = "メソッド" 053 sAction(i1) = "this.pageNum=3;" 054 055 '▼テキストを検索し、ページ番号と座標を得る 056 sFilePathIn = ThisWorkbook.Path & "\test-003.pdf" 057 'See URL. https://pdf-file.nnn2.com/?p=1099 058 bRet = GetTextsGetRects(sFilePathIn, -1, -1, _ 059 sInSerchText, gTextRects, iOutCnt) 060 061 '▼リンクを追加する 062 063 Dim objAcroApp As New Acrobat.AcroApp 064 Dim objAcroAVDoc As New Acrobat.AcroAVDoc 065 Dim objAcroPDDoc As New Acrobat.AcroPDDoc 066 Dim objAcroPDPage As Acrobat.AcroPDPage 067 Dim objAcroAVPageView As Acrobat.AcroAVPageView 068 Dim objAFormApp As AFORMAUTLib.AFormApp 069 Dim objAFormFields As AFORMAUTLib.Fields 070 071 objAcroApp.CloseAllDocs 072 objAcroApp.Hide '稀に表示されるので隠す 073 074 'PDFファイルを開く 075 bRet = objAcroAVDoc.Open(sFilePathIn, "") 076 077 Set objAcroPDDoc = objAcroAVDoc.GetPDDoc 078 Set objAFormApp = CreateObject("AFormAut.App") 079 Set objAFormFields = objAFormApp.Fields 080 Set objAcroPDDoc = objAcroAVDoc.GetPDDoc 081 082 Dim sAJS As String 083 Dim sReturn As String '未使用 084 085 Const sAcrobatJavaScript As String = _ 086 "var link = this.addLink(@P, [@1,@2,@3,@4]) ;" & _ 087 "link.setAction(""@A"") ;" & _ 088 "link.borderColor = @C ;" & _ 089 "link.borderWidth = @W ;" 090 091 For i1 = 0 To iOutCnt 092 With gTextRects(i1) 093 If .iSearchNo = -1 Then Exit For 094 Debug.Print "Text(" & i1 & ")=" & _ 095 sInSerchText(.iSearchNo) & _ 096 " Index=" & .iSearchNo & _ 097 " Page=" & .iPageNo & _ 098 " Top=" & .iTop & _ 099 " Bottom=" & .iBottom & _ 100 " Left=" & .iLeft & _ 101 " Right=" & .iRight 102 103 'Acrobat JavaScriptの編集 104 sAJS = sAcrobatJavaScript 105 sAJS = Replace(sAJS, "@P", .iPageNo) 106 sAJS = Replace(sAJS, "@1", .iLeft) 107 sAJS = Replace(sAJS, "@2", .iTop) 108 sAJS = Replace(sAJS, "@3", .iRight) 109 sAJS = Replace(sAJS, "@4", .iBottom) 110 sAJS = Replace(sAJS, "@A", sAction(.iSearchNo)) 111 sAJS = Replace(sAJS, "@C", "color.blue") 112 sAJS = Replace(sAJS, "@W", 1) 113 End With 114 'Acrobat JavaScript の実行 115 sReturn = objAFormFields.ExecuteThisJavascript(sAJS) 116 Next i1 117 118 'PDFファイルを別名で保存 119 sFilePathOut = Replace(sFilePathIn, ".pdf", "-AddLinks.pdf") 120 If objAcroPDDoc.Save(1, sFilePathOut) = False Then 121 MsgBox "PDFファイルへ保存出来ませんでした", _ 122 vbOKOnly + vbCritical, "実行エラー" 123 End If 124 125 '変更しないで閉じます。 126 bRet = objAcroAVDoc.Close(False) 127 128 'Acrobatアプリケーションの終了 129 objAcroApp.Hide 130 objAcroApp.Exit 131 132 'オブジェクトの開放 133 Set objAcroAVPageView = Nothing 134 Set objAcroPDPage = Nothing 135 Set objAcroPDDoc = Nothing 136 Set objAcroAVDoc = Nothing 137 Set objAFormApp = Nothing 138 Set objAFormFields = Nothing 139 Set objAcroApp = Nothing 140 141 Debug.Print "出力件数 = " & iOutCnt 142 Debug.Print "処理時間 = " & Timer - start 143 End Sub


 Highlight:プログラミング言語のソースコードを構文で色分け (GUI編)
 

関数: GetTextsGetRects のソースはコチラから持ってきてください。

 

実行結果

実行前です。

実行後です。

以下のリンク動作は正常に確認できました。

  • "マニュアルを参照": ABC.pdfを開く
  • "PDF": pdf-file.nnn2.comを開く
  • "目次の先頭": ページ番号=2へ移動

 

Acrobat JavaScriptの説明

リンクを追加するAcrobat JavaScriptの各命令(メソッドとプロパティ)の説明です。

特に深く理解する必要は無いです。サンプルのやり方を真似るだけで結構です。

ココでの説明はメーカーのマニュアル「JavaScript™ for Acrobat® API Reference Adobe® Acrobat® SDK バージョン 8.0」とは異なり、Acrobat JavaScript専用の表現を無くしています。説明も関係する部分のみとしました。

*AD:ネット公開されている上記の日本語マニュアルを表示します。

 

1. addLink( nPage , [ Left , Top , Right , Bottom ] )

指定したページに、指定した座標で新しいリンクを追加します。位置情報のみを指定します。( *AD )

  • nPage:リンクを追加するページ番号。1ページ目は 0 です。
  • Left:座標Leftの値
  • Top:座標Topの値
  • Right:座標Rightの値
  • Bottom:座標Bottomの値

 

2. setAction

動作を示すAcrobat JavaScript コードを指定します。今回のリンクに関連する動作としては以下の3つが有ります。( *AD )

  1. PDF内のページ移動
    • 例:3ページ目に移動する。
      setAction( "this.pageNum = 2;" );
    • ページ番号の先頭は0です。
    • 次ページへの移動は
      setAction( "this.pageNum++;" );
       
  2. 他のPDFファイルを開く
    • 例:D:¥ABC¥xyz.pdf を開く。
      setAction( "app.openDoc( '/D/ABC/xyz.pdf ' );" );
    • パスはWindowsのパスでは無く、上記のような形式にします。
    • フォルダ名に日本語が入ってもOKです。
    • パスはシングルクォーテーション「'」で囲みます。
       
  3. Webページを開く
    • 例: pdf-file.nnn2.com を開く。
      setAction(" this.getURL( 'https://pdf-file.nnn2.com/' ); ");
    • URLはシングルクォーテーション「'」で囲みます。
       

 

3. borderColor

リンクの境界線の色を指定します。( *AD )

例:borderColor = color.red;

  • 白:color.white
  • 赤:color.red
  • 緑:color.green
  • 青:color.blue
  • シアン:color.cyan
  • マゼンタ:color.magenta
  • イエロー:color.yellow
  • ダークグレー:color.dkGray
  • グレー:color.gray
  • ライトグレー:color.ltGray

他の色を使いたい時はRGBやCMYKで指定してください。詳細はマニュアルを御覧ください。

 

4. borderWidth

リンクの境界線の幅を指定します。 ( *AD )

例:borderWidth = 1 ;

  • 0:なし
  • 1:細
  • 2:標準
  • 3:太

 

5. highlightMode

リンクの領域内でマウスボタンを押したときに使用する視覚効果を設定します。混乱させないためにもデフォルトの方がユーザーにはイイです。( *AD )

  • None:効果なし
  • Invert ( デフォルト):
  • Outline:アウトライン
  • Push:プッシュ

 

6. rect

リンクの矩形を表す 4 つの数値配列です。左上隅のx 座標、左上隅のy 座標、右下隅のx 座標、右下隅のy 座標を配列「[ Left , Top , Right , Bottom ]」を表します。( *AD )

例:今回は直に配列で指定するので省略。

 

備考

  • 処理時間は掛かります。業務での使用時はSSDなどの高速な環境をご用意ください。

 

参照

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


出来るだけ早く返答する様には心がけています。
が、遅くなる時もありますのでご了承ください。


SAMURAI Plugin

コメントをする時は出来れば以下もお願いします。

  • OS名 バージョン
  • Acrobat バージョン
  • ツール(Excel等) バージョン
コメントにサンプルコードを入れるとエラーになる場合が有ります。その時はコードの前後に <code> ・・・</code> タグを入れてください。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください