説明
PDFにページ番号を追加します。
PDFの各ページに読み取り専用のテキストボックスを追加します。
それをフッダー又はヘッダーの様に見せてページ番号を表示します。
応用例:
- PDFにフッダー又はヘッダーを追加する。
- PDFの各ページの特定位置にテキストを表示する。
- PDFの指定ページのみテキストを表示する。
- 独自のページ番号形式で上書き表示する。
動作の結果
あくまでも当サイトでの結果です。
必ず自分のパソコンで動作確認をしてください。
Acrobat | 動作 | 備考 |
---|---|---|
4 | △ | Acrobat 4.0 ※Windows 98SE + Excel 2000 *1 ※古いPDFのバージョンはOK! |
5 | △ | Acrobat 5.0.5 + Excel 2003 *1 ※古いPDFのバージョンはOK |
6 | △ | Acrobat 6.0.6 Pro + Excel 2003 *1 ※古いPDFのバージョンはOK |
7 | OK | Acrobat 7.1.4 Pro + Excel 2003 *2 ※レジストリ操作で全面的に可能になる |
8 | NO | Acrobat 8.3.1 Pro + Excel 2003 ※当Acrobatバージョンでは全面的に不可 |
9 | NO | Acrobat 9.5.2 Extended + Excel 2003 ※当Acrobatバージョンでは全面的に不可 |
10 | OK | Acrobat X (10.1.4) Extended + Excel 2003 |
11 | OK | Acrobat XI (11.0) Extended+ Excel 2003 |
- OK : 正常処理する。
- NO : 動作しない。 又は実行時にエラーになる。
- *1 : 「PDF のバージョン」によっては正常処理出来ない場合がある。
詳細は下の 注意 を参照ください。 - *2 : 処理前のレジストリに以下を追加する必要があります。
[HKEY_CURRENT_USER¥Software¥Adobe¥Adobe Acrobat¥7.0¥AVAlert]
[HKEY_CURRENT_USER¥Software¥Adobe¥Adobe Acrobat¥7.0¥AVAlert¥cCheckbox]
"idocNewerVersionWarning"=dword:00000001
サンプル:Excel VBA
- F8キーでステップ実行しながら動作確認して下さい。
- 事前に 参照設定(AFormAutの追加版) が必要です。
変数の宣言 Integer は Long でご使用ください。
001 Option Explicit
002
003 Sub AFormApp_Test_01()
004 On Error GoTo Err_AFormApp_Test_01
005
006 Dim i As Integer
007 Dim iPageNum As Integer
008 Dim bRet1 As Boolean
009 Dim bRet2 As Boolean
010 Dim bEnd As Boolean
011 Dim sFilePath_new As String
012 Dim objAFormApp As AFORMAUTLib.AFormApp
013 Dim objAFormFields As AFORMAUTLib.Fields
014 Dim objAFormField As AFORMAUTLib.Field
015
016 '初期値
017 Const sFilePath = "D:\work\sample.pdf"
018 bEnd = True
019
020 'Acrobatオブジェクトの定義&作成
021 'Acrobat 4,5,6の時
022 ' Dim objAcroApp As Acrobat.CAcroApp
023 ' Dim objAcroAVDoc As Acrobat.CAcroAVDoc
024 ' Dim objAcroPDDoc As Acrobat.CAcroPDDoc
025 ' Set objAcroAVDoc = CreateObject("AcroExch.App")
026 ' Set objAcroAVDoc = CreateObject("AcroExch.AVDoc")
027 ' Set objAcroPDDoc = CreateObject("AcroExch.PDDoc")
028
029 'Acrobat 7,8,9,10 の時
030 Dim objAcroApp As New Acrobat.AcroApp
031 Dim objAcroAVDoc As New Acrobat.AcroAVDoc
032 Dim objAcroPDDoc As New Acrobat.AcroPDDoc
033
034 '※CreateObject("AFormAut.App")のエラー
035 '※[429 ActiveXコンポーネントはオブジェクトを作成できません。]
036 '※回避用 / メモリにAcrobatを強制ロードさせる
037 objAcroApp.CloseAllDocs
038
039 '処理対象のPDFファイルを開く
040 bRet1 = objAcroAVDoc.Open(sFilePath, "")
041
042 If bRet1 = False Then
043 MsgBox "AVDocオブジェクトはOpen出来ません", _
044 vbOKOnly + vbCritical, "処理エラー"
045 bEnd = False
046 GoTo Skip_AFormApp_Test_01:
047 End If
048
049 Set objAcroPDDoc = objAcroAVDoc.GetPDDoc
050 iPageNum = objAcroPDDoc.GetNumPages
051
052 Set objAFormApp = CreateObject("AFormAut.App")
053 Set objAFormFields = objAFormApp.Fields
054
055 For i = 0 To iPageNum - 1
056 'PDFの指定ページにテキストフィールドを追加
057 Set objAFormField = _
058 objAFormFields.Add("Field_" & i, _
059 "text", i, 250, 50, 350, 75)
060
061 'テキストフィールドのプロパティ設定(ページ番号)
062 With objAFormField
063 .SetBorderColor "RGB", 1, 1, 1, 0
064 .Alignment = "center"
065 .TextSize = "12"
066 .TextFont = "HeiseiMin-W3-UniJIS-UCS2-H"
067 .DefaultValue = "デフォルトとして設定される値"
068 .Value = "Page - " & (i + 1)
069 .IsReadOnly = True
070 End With
071
072 '設定後に開放
073 Set objAFormField = Nothing
074 Next
075
076 'PDFファイルを別名で保存
077 sFilePath_new = Replace(sFilePath, ".pdf", "_new.pdf")
078 bRet2 = objAcroPDDoc.Save(1, sFilePath_new)
079 If bRet2 = False Then
080 MsgBox "PDFファイルへ保存出来ませんでした", _
081 vbOKOnly + vbCritical, "エラー"
082 bEnd = False
083 End If
084
085 'PDFファイルを閉じる
086 bRet2 = objAcroAVDoc.Close(False)
087 If bRet2 = False Then
088 MsgBox "AVDocオブジェクトはClose出来ませんでした", _
089 vbOKOnly + vbCritical, "処理エラー"
090 bEnd = False
091 End If
092
093 Skip_AFormApp_Test_01:
094 On Error Resume Next
095 '変更しないで閉じます。
096 bRet1 = objAcroAVDoc.Close(1)
097
098 'Acrobatアプリケーションの終了
099 objAcroApp.Hide
100 objAcroApp.Exit
101
102 'オブジェクトの開放
103 Set objAFormFields = Nothing
104 Set objAFormApp = Nothing
105 Set objAcroPDDoc = Nothing
106 Set objAcroAVDoc = Nothing
107 Set objAcroApp = Nothing
108
109 If bEnd = True Then
110 MsgBox "処理は正常に終了しました。", _
111 vbOKOnly + vbInformation, "正常終了"
112 End If
113 Exit Sub
114
115 Err_AFormApp_Test_01:
116
117 MsgBox Err.Number & vbCrLf & Err.Description, _
118 vbOKOnly + vbCritical, "実行時のエラー"
119 bEnd = False
120 GoTo Skip_AFormApp_Test_01:
121
122 End Sub
123
Highlight:プログラミング言語のソースコードを構文で色分け (GUI編)
実行結果


備考 , 参照先
- 当サンプルはAdobe TechNote 文書番号(ID):510690 を参照にして作りました。
Adobe TechNote 情報ではAcrobatバージョンや動作プラットフォーム(OSバージョン) や使用言語が異なる場合があります。 - Adobe TechNote 文書番号(ID):510690 で Visual Basic 6.0 (VB6)のサンプルコードがダウンロード出来ます。
- AFormApp の OLE Automation Objects に関する情報(英語のみ)は
http://partners.adobe.com/public/developer/en/acrobat/sdk/FormsAPIReference.pdf
109 Page を参照してください。 - 実行時のエラーは以下になります。
-2147220991 現在 Acrobat で文書が開いていません。
Set objAFormFields = objAFormApp.Fields
を実行する時に上記のエラーになります。
動作確認環境
- Acrobat 4.0 + Office 2000
+ Windows98SE( + WindowsUpdate) - Acrobat 5.0.5 + Office 2003( + SP3)
+ WindowsXP Pro( + SP3 + WindowsUpdate) - Acrobat 6.0.6 Pro + Office 2003( + SP3)
+ WindowsXP Pro( + SP3 + WindowsUpdate) - Acrobat 7.1.4 Pro + Office 2003( + SP3)
+ WindowsXP Pro( + SP2 + WindowsUpdate) - Acrobat 8.3.1 Pro + Office 2003( + SP3)
+ WindowsXP Pro( + SP3 + WindowsUpdate) - Acrobat 9.5.2 Extended + Office 2003( + SP3)
+ WindowsXP Pro( + SP3 + WindowsUpdate) - Acrobat X (10.1.4) Extended + Office 2003( + SP3)
+ WindowsXP Pro( + SP3 + WindowsUpdate) - Acrobat XI (11.0) Extended + Office 2003( + SP3)
+ WindowsXP Pro( + SP3 + WindowsUpdate)
コメント投稿について
- AFormAppオブジェクトに関する技術的な質問に返答できる知識を当サイト管理者は持っていません。
その前提でコメント投稿を開放します。
< サンプル一覧 >
管理人さん
こんばんは。
管理人さんのページ番号追加のサンプルVBAを参考にして、PDFにページ番号を追加しているのですが、変数iをlongに変更しても「32768」以上になるとオーバーフローしてしまいます。
「32768」ページ以上のPDFにページ番号を追加する方法があるかご教示頂けると幸いです。
環境
OS:windows10
Acrobat11
たけ さん
はじめまして。
オーバフローしているのは i 変数だけでは無いです。
iPageNum 変数も同様です。
iPageNum 変数もLongにしてください。
Integer は全て Long に変更してください。
動作検証済みです。
解決できることを期待しています。
管理人さん
こんばんは。
早急にご回答頂きましてありがとうございます。
尚、変数を全てLongにして色々と試行錯誤しているのですがオーバーフローしてしまいます。
また、オーバーフロー時の変数の型名を「TypeName」で確認しているのですが「Long」と表示されるので「32768」以上でオーバーフローする理由がわかりません。
ついては度々で申し訳ありませんが、何か解決できるようなきっかけでも構いませんのでご教示頂けると幸いです。
たけさんへ。
こちらでの検証方法に問題があったみたいです。
スイマセン。
オーバーフローが起きる場所は上記サンプルの 55、57 、62 のどの場所でしょうか?
それが 57(正確には59) だと厄介です。
Addメソッドはコチラを見て頂けると判りますが、ページ番号を指定する引数は「short pageNum」となっています。
C言語での short の最大値は32767です。
つまり、それ以上の値は渡せない事になります。
たぶん、コレのような気がします。
「よって、出来ません」では前に進まないので、対策(逃げ道)を考えてみます。
少々、お時間をください。
(期待はしないでください。
▼▼2019/06/9 10:20 追加▼▼
他のやり方です。
1) 「透かしをテキストで追加する」
上記を使ってページ番号を追加するのは他でも見かけます。
しかし、ページ番号を指定する引数のタイプは一般公開されていません。PDF技術文書にもネットの情報にも有りませんでした。
2) 「CPDF:-add-text」
機能:ページの指定した範囲にテキスト又は短形枠を貼り付けます。
テキストにはページ番号を指定するマクロも用意されています。日本語が使用できない問題点は有ります。2ページ目からページ番号1を振りたい時はベイツ番号を使ってください。ソースが公開されていますが、引数のタイプを見る勇気が無いです。
上記の2つでオーバーフローにならないかは未検証です。
※テスト用の32768頁のPDFを作る自信が無いです。
▼▼2019/06/9 11:17 追加▼▼
「CPDF:-add-text」を使って、57348頁のPDFにページ番号の追加が出来ました。
>cpdf -add-text "%Page / %EndPage" PDF-57348-page.pdf -o out-57348.pdf
表示位置は別のオプションを追加することで設定が可能です。
※タブン、今日あたりにポンコツPCが壊れます・・管理人さん
こんばんは。
返信が遅くなりまして大変申し訳ありません。
また、色々と検証して頂きましてありがとうございました。
Acrobatでは32768以上は、ページ番号を指定する引数上、オーバーフローする旨承知しました。
ご教示頂きましたCPDFにて32768以上のページ番号を採番できることを私も実行して確認しましたので、オプション等調べながらページ番号をふっていきたいと思います。
PCの負荷等含めて、お手数をお掛けしまして申し訳ありませんでした。
たけ さんへ。
v(^_^)