説明
PDF に別のファイルを使って透かしを追加します。
透かしの追加はAcrobat OLE の JSObject 経由で addWatermarkFromFile メソッドを使って、外部ファイルからPDFへ行います。
addWatermarkFromFile
メソッド
Doc オブジェクト / addWatermarkFromFile メソッド
説明
PDFファイルの指定のページに外部ファイルを透かしとして追加します。
形式
JSObject.addWatermarkFromFile cDIPath , [nSourcePage] , [nStart] , [nEnd] , [bOnTop] , [bOnScreen] , [bOnPrint] , [nHorizAlign] , [nVertAlign] , [nHorizValue] , [nVertValue] , [bPercentage] , [nScale] , [bFixedPrint] , [nRotation]
引数
- 第1引数 (cDIPath) :
透かしに使うファイルのフルパス。
PDFファイル、JPEG および BMP ファイルが指定できる。 - 第2引数 (nSourcePage) : (オプション)
透かしに使う第1引数のソースファイルの該当ページを指定。
0から数える。つまり1頁目は0。デフォルトは0。 - 第3引数 (nStart) : (オプション)
透かしを追加するPDFのページ範囲で最初のページの番号を指定。
0から数える。つまり1頁目は0。
nStart と nEnd を指定しない時は、文書の全てのページが対象になります。
nStart のみを指定した場合は、nStart で指定した単一のページが対象になります。
nEnd のみを指定した場合は、0 から nEnd までが対象範囲になります。 - 第4引数 (nEnd) : (オプション)
透かしを追加するPDFのページ範囲で最後のページの番号を指定。
指定方法はnStartを参照。 - 第5引数 (bOnTop) : (オプション)
PDFページ上のコンテンツ(文字、画像等)の上下を指定。
デフォルトはTrue。
bFixedPrint が true の場合には無視される。- True : コンテンツの上に透かしが表示される。
- False : コンテンツの下に透かしが表示される。
- 第6引数 (bOnScreen) : (オプション)
PDFを画面表示する際に、透かしを表示するかどうかを示すブーリアン値。
デフォルトは True。- True : 表示する
- False : 表示しない
- 第7引数 (bOnPrint) : (オプション)
PDFを印刷する際に、透かしを表示するかどうかを示すブーリアン値。
デフォルトは True。- True : 表示する
- False : 表示しない
- 第8引数 (nHorizAlign) : (オプション)
透かしの水平方向の整列方法を表す数値。
有効な値については、app.constants.align を参照。
デフォルトはapp.constants.align.center (中央)。
※値とフローティングウィンドウ位置- jso.app.constants.align.left : 左
- jso.app.constants.align.center : 中央
- jso.app.constants.align.right : 右
- 第9引数 (nVertAlign) : (オプション)
透かしの垂直方向の整列方法を表す数値。
有効な値については、app.constants.align を参照。
デフォルトはapp.constants.align.center (中央)。
※値とフローティングウィンドウ位置- jso.app.constants.align.center : 中央
- jso.app.constants.align.top : 上
- jso.app.constants.align.bottom : 下
- 第10引数 (nHorizValue) : (オプション)
ページ上で透かしの水平位置をシフトさせるために使用する数値。
bPercentage が True の場合、この数値はページの幅のパーセンテージを示す。
bPercentage が False の場合、この数値はオフセットするポイント数を示す。
デフォルトは 0。
「配置」-「左右からの距離」-「基点」項目と同様。 - 第11引数 (nVertValue) : (オプション)
ページ上で透かしの垂直位置をシフトさせるために使用する数値。
bPercentage が true の場合、この数値はページの高さのパーセンテージを示す。
bPercentage が false の場合、この数値はオフセットするポイント数を示す。
デフォルトは 0 です。
「配置」-「上下からの距離」-「基点」項目と同様。 - 第12引数 (bPercentage) : (オプション)
nHorizValue や nVertValue がページサイズのパーセンテージを示すのか、ポイント数を示すのかを表すブーリアン値。
デフォルトは falseでポイント数を示す。- True : パーセンテージを示す
- False : ポイント数を示す
- 第13引数 (nScale) : (オプション)
透かしに使用するスケール。
1.0 が 100 %を意味する。
値が -1 の場合は、透かし形状を維持したまま、大きさをページにフィットさせます。
デフォルトは 1.0 です。
「ページに合わせた相対倍率」項目と同様。 - 第14引数 (bFixedPrint) : (オプション)
「異なるページサイズで印刷する場合、透かし位置とサイズを一定にする」ことを示すブーリアン値。
印刷するページのサイズに関係なく、透かしが固定のサイズおよび位置に印刷される。
True の場合は、bOnTop は無視される。
デフォルトはFalse です。- True : 透かしが固定のサイズおよび位置に印刷する
- False : 透かしが固定のサイズおよび位置に印刷しない
- 第15引数 (nRotation) : (オプション)
透かしを反時計回りに回転させる角度。0~360の値を指定。
デフォルトは 0。
「回転」項目と同様。 - 第16引数 (nOpacity): (オプション)
透かしの不透明度を示す。
0 が透明で、1.0 が不透明。 デフォルトは 1.0。
「不透明度」項目と同様。
サンプル:ExcelのVBA
Download:sample-JSObject_addWatermarkFromFile.xls
Test.pdf ファイルに透かし用のファイルとして sukasi,pdf を全ページに追加します。
追加したら最適化して test-out.pdf として別名保存します。
- F8キーでステップ実行しながら動作確認出来ます。
- 参照設定を事前にする。
001 Sub JSO_addWatermarkFromText()
002
003 Dim objAcroApp As New Acrobat.AcroApp
004 Dim objAcroPDDoc As New Acrobat.AcroPDDoc
005 Dim jso As Object
006 Dim lRet As Long
007
008 '透かしが追加されるPDFファイル
009 Const CON_PDF_IN = "D:¥work¥test.pdf"
010 '透かしが追加されたPDFファイル
011 Const CON_PDF_OUT = "D:¥work¥test-out.pdf"
012 '透かし用として追加するファイル
013 Const CON_SUKASI = "D:¥work¥sukasi.pdf"
014
015 'JSObjectオブジェクト作成時のNothingの回避策
016 'Acrobatアプリを強制的にメモリにロードする
017 lRet = objAcroApp.CloseAllDocs
018
019 'PDFファイルを開く
020 lRet = objAcroPDDoc.Open(CON_PDF_IN)
021 If lRet = False Then
022 MsgBox "AcroExch PDDoc Open エラー"
023 GoTo JSO_addWatermarkFromText_Skip:
024 End If
025
026 Set jso = objAcroPDDoc.GetJSObject
027
028 'PDF文書の指定のページに指定のPDFを透かしとして追加
029 jso.addWatermarkFromFile CON_SUKASI
030
031 JSO_addWatermarkFromText_Skip:
032 'PDFを最適化して別名で保存する
033 lRet = objAcroPDDoc.Save( _
034 PDSaveFull + PDSaveLinearized + _
035 PDSaveCollectGarbage, CON_PDF_OUT)
036
037 'アプリケーションの終了
038 lRet = objAcroApp.Hide
039 lRet = objAcroApp.Exit
040
041 'オブジェクトの強制開放
042 Set jso = Nothing
043 Set objAcroPDDoc = Nothing
044 Set objAcroApp = Nothing
045
046 End Sub
Highlight:プログラミング言語のソースコードを構文で色分け (GUI編)
実行結果
全ページに同じ様に透かしが追加されました。
補足
- Acrobat Reader では動作しません。
Acrobat Pro 本体がデフォルトでインストールされているパソコン環境だけです。 - 上記サンプル、addWatermarkFromFile の第2引数以降はデフォルトです。
- テキストのみの透かしなら addWatermarkFromText メソッドでも対応出来る。
- ダイナミックスタンプ、ビジネススタンプ、メッセージスタンプ等のカスタムスタンプの代わりに透かし機能で代用出来るかもしれません。
承認済、社外秘、却下、極秘、非公開、公開用等の文字を透かし機能を使って追加出来ます。
注意
- Acrobatアプリ本体の透かしの追加のダイアログ画面のデフォルトとは多少異なる結果で追加が行われます。
- 透かしを一括で削除するOLEやAcobat JavaScript等は現時点(2014/02/19)では見つかっていません。
見つけられなかったのかもしれません。
名前付き引数
addWatermarkFromText メソッドでは名前付き引数の使用が可能ですが、当 addWatermarkFromFile メソッドでは使用できません。詳細な理由は不明です。
動作確認環境
- Windows 7 64bit Home + SP1 +
Acrobat 8.3.1 Pro + Office 2007 + フルMicrosoftUpdate
Adobe Web 解説
- JavaScript™ for Acrobat® API Reference
Adobe® Acrobat® SDK バージョン 8.0
addWatermarkFromFile メソッドの日本語解説 - JavaScript for Acrobat API Reference
(Acrobat v10) 英語解説
addWatermarkFromFile メソッドの英語解説
(リンク先消滅) - Acrobatアプリからの透かしの削除方法 日本語解説
(リンク先消滅)
< サンプル一覧 >
サイト管理人のメモ
これ以降はサイト管理人のメモです。
見る必要性は無いです。
「addWatermarkFromFile はPDF文書に透かしを追加すると同時に、
オプショナルコンテンツグループ(OCG)に配置します。」
と Acrobat JavaScriptのマニュアルに記述が有る。ならば、OCGなるものを削除、又は無効にすれば透かしを削除、又は非表示に出来るのではないか?
そこで 511727_js_api_reference.pdf の
「JavaScript™ for Acrobat® API Reference Adobe® Acrobat® SDK バージョン 8.0」の550ページに書かれているサンプルを元に以下のJavaScriptを作成した。
//p.550 透かしOCGをオフで非表示に設定
var ocgArray = this.getOCGs();
for (var i=0; i < ocgArray.length; i++) {
if (ocgArray[i].name == "Watermark") {
ocgArray[i].state = false;
}
}
上記を文書レベルのJavaScriptに追加する。
しかし、追加時には正常に処理して透かしを非表示にするが、PDF文書を保存して、再度表示すると実行されない。正確には実行されるが、falseが反映されない。
上記JavaScriptの実行前に
app.alert("xx");
を入れるとAcrobat Pro 8 では反映されるが Adobe Reader XI では反映されない。
OCG特有の性質が存在する可能性が有る。が、現時点では不明。
記録
- 初版:2019年5月9日
- 2版:2019年7月12日 「名前付き引数」の記事を追加
< サンプル一覧 >
いつもお世話になっております。
jso.addWatermarkFromFile の箇所において、ほかの引数を設定したく思い、
以下のとおり書いたのですが、「名前付き引数が見つかりません」と警告が出てしまいます。さしあたり第一引数の透かしに使うファイルのみを設定してもうまくいきません。
jso.addWatermarkFromFile cDIPath:="E:\あいうえお.pdf"
なお、サンプルのとおり、以下のようにすればうまくいきますが、できればほかの引数も設定したいため、上の記法で書きたいと思っています。
jso.addWatermarkFromFile "E:\あいうえお.pdf"
外のサイトを調べても、「cDIPath」で問題ないような気がするのですが・・・ご教示賜れますと幸いです。
OSはWindows7
AdobeはAcrobat DC
Excelは2010です。
sasase さん はじめまして。
>jso.addWatermarkFromFile cDIPath:="E:\あいうえお.pdf"
>なお、サンプルのとおり、以下のようにすればうまくいきますが、
>できればほかの引数も設定したいため、上の記法で書きたいと思っています。
>jso.addWatermarkFromFile "E:\あいうえお.pdf"
引数を名前付き「cDIPath:="E:\あいうえお.pdf"」での指定はできません。
jsoオブジェクトはAcrobatアプリケーション本体に有るAcrobat JavaScriptへ直接連携して操作できます。
しかし、VBA開発環境に有るオブジェクトブラウザから jso.addWatermarkFromFile の引数に関する内容は見れません。
見れない詳細な原因は不明ですが、このオブジェクトの構造上の問題と私は思っています。
よって名前付きはできないと思っています。(経験上
jso.addWatermarkFromFile "E:\あいうえお.pdf",0,0,5
の様に前から順番に引数を指定してください。
ありがとうございます
addWatermarkFromTextメソッドで名前付きが可能であったため、addWatermarkFromFileメソッドでも同様に可能であると思い込んでおりました。
ご教示いただいたとおり、順番に引数を指定することで解決できました。
貴サイトにはいつもお世話になっております。この度はお手数いただきありがとうございました。
sasase さんへ。
addWatermarkFromTextメソッドで名前付き引数が利用できる理由も分かっていません。
正確には「現状で私に理解できるスキルが無い」が原因と思っています。
調査したらイイのですが、詳細な原因が分かってもそれ以上は何も出来ない部分と思っています。
大事なのは「機能通りに動作する」かどうかなので、これ以上の調査は行わないつもりです。
<追加>
通常はオブジェクトブラウザで引数の詳細が判ります。
しかしjsoオブジェクト(Acrobat JavaScript)はオブジェクトブラウザに表示出来ません。
addWatermarkFromTextメソッドで名前付き引数が利用できるのは、私のスキル以上の理由が有ると思われます。
時間が出来たときの宿題にさせてください。
ありがとうございます。
私はとりあえずあちらこちらのサンプルを組み合わせて(とはいえ貴サイトが8割がたですが、、)いるだけで、AdobeやExcelについてよくわかっているわけではありませんので、ご放念いただけると幸いです。
今後も貴サイトを参考にさせていただければと思います。
はじめまして。コメント失礼します。
以前から透かしを使った書類を作成することが多く
調べていたらここにたどり着きました。
以下の内容のことを行っています。よろしかったらご教授ください。
1ファイル10ページ(ページの増減あります)のPDFファイルがあります。
ファイル内で透かしを行います。
(例)
1ページ目に6ページ目の透かし
1ページ目に7ページ目の透かし
1ページ目に8ページ目の透かし
1ページ目に9ページ目の透かし
1ページ目に10ページ目の透かし
上書き
6~10ページを削除
上書き
Windows10 ,11
Acrobat , Acrobat Pro
OFFICE 365
ヒントだけでもありがたいです。
よろしくお願いします。
すみません。コメント内容に間違いがありました。
はじめまして。コメント失礼します。
以前から透かしを使った書類を作成することが多く
調べていたらここにたどり着きました。
以下の内容のことを行っています。よろしかったらご教授ください。
1ファイル10ページ(ページの増減あります)のPDFファイルがあります。
ファイル内で透かしを行います。
(例)
1ページ目に6ページ目の透かし
2ページ目に7ページ目の透かし
3ページ目に8ページ目の透かし
4ページ目に9ページ目の透かし
5ページ目に10ページ目の透かし
上書き
6~10ページを削除
上書き
Windows10 ,11
Acrobat , Acrobat Pro
OFFICE 365
ヒントだけでもありがたいです。
よろしくお願いします。
na さんへ。
例から、6ページから10ページの各ページを透かしとして、1ページ目に追加する。その後に6~10ページを削除する。その様な場合は単にココのサンプルのsukasi.pdfをTest-IN.pdfにするだけの話と思います。不要なページはDeletepagesするだけです。
しかし、6ページから10ページの各ページ上に存在する透かし部分のみを扱う、と言う場合は話は別です。多分、プログラミングで「透かし」部分の何らかの判断が必要になります。仮に出来たとしても「その部分だけを透かしに使う」のは無理だと思います。もし、その「透かし」部分が固定的なものならば、別PDFファイルとして保存しておき、当サンプルを流用すれば可能な様な気がします。
ご検討ください。