先日開催されたPower Automate Desktop(PAD)の勉強会「RPA勉強会!Power Automate Talk #14 PAD最新情報と業務に役立つ基本技!」(RPACommunityさん主催)に参加しました。
ロボ研さんが登壇され、PADの最新情報を分かりやすくまとめていただき、大変参考になりました。
Mentimeterによる匿名Q&Aコーナーも盛況で、非常に多くの質問が寄せられました。
今回の勉強会ではテクニカルな質問も多く、特に私が気になったのは下記質問です。
PDFファイルの一部をマスキングして印刷する場合の方法はありますでしょうか?A4サイズで3分の2を隠して空欄にして印刷する。
https://www.menti.com/7dzy7oaewr より
どのようにすれば処理できるのか?と、私も下記のようにツイートしたのですが、よくよく考えたら部分的に見えなくすれば良いだけなのでIllustratorを使う必要は無く、Acrobatだけでも十分に処理できそうです。
PDFファイルの一部をマスキングして印刷…、なるほど!こういった需要もあるのか!!
Illustrator連携で処理、イラレ部分はスクリプトで自動化、PADからはスクリプトをキック、そんな感じで処理できるのかな・・・?🤔 #RPALT— きぬあさ (@kinuasa) August 25, 2021
そこで今回は、Acrobatを操作して指定したPDFにテキストフィールドを被せてマスキング処理するフローを考えてみました。
フロー全体
# Acrobatを操作して指定したPDFにテキストフィールドを被せてマスキングするフロー SET TargetFilePath TO $'''C:\\Test\\PDF\\テスト用PDFファイル.pdf''' # 指定したPDFファイルをコピーして、コピーしたファイルを処理対象とする File.GetPathPart File: TargetFilePath RootPath=> RootPath Directory=> Directory FileName=> FileName FileNameWithoutExtension=> FileNameNoExtension Extension=> FileExtension Folder.Create FolderPath: Directory FolderName: $'''masked''' Folder=> NewFolder File.Copy Files: TargetFilePath Destination: NewFolder IfFileExists: File.IfExists.Overwrite CopiedFiles=> CopiedFiles SET TargetFilePath TO CopiedFiles[0] # /* ---------- 変数設定ここから ---------- */ /# ・FieldLeft:フィールドの左位置(左下が基点) ・FieldTop:フィールドの上位置(左下が基点) ・FieldRight:フィールドの幅、0以下の値にすることでページの幅に合わせる ・FieldBottom:フィールドの高さ、0以下の値にすることでページの高さに合わせる#/ # ・FieldText:フィールドに設定する文字列 SET FieldLeft TO 0 SET FieldTop TO 0 SET FieldRight TO -1 SET FieldBottom TO 300 SET FieldText TO $'''社外秘''' # /* ---------- 変数設定ここまで ---------- */ # スクリプトでAcrobatを制御してテキストフィールド追加 System.RunVBScript VBScriptCode: $'''Option Explicit MaskPDF \"%TargetFilePath%\", CSng(%FieldLeft%), CSng(%FieldTop%), CSng(%FieldRight%), CSng(%FieldBottom%), \"%FieldText%\" Private Sub MaskPDF(ByVal TargetFilePath, _ ByVal FieldLeft, _ ByVal FieldTop, _ ByVal FieldRight, _ ByVal FieldBottom, _ ByVal FieldText) \'指定したPDFにテキストフィールドを被せる Dim app \'Acrobat.AcroApp Dim avdoc \'Acrobat.AcroAVDoc Dim pddoc \'Acrobat.AcroPDDoc Dim pt \'Acrobat.AcroPoint Dim formApp \'AFORMAUTLib.AFormApp Dim numPages, i Const PDSaveIncremental = 0 Set app = CreateObject(\"AcroExch.App\") Set avdoc = CreateObject(\"AcroExch.AVDoc\") If avdoc.Open(TargetFilePath, \"\") Then app.Show \'アプリケーション表示 Set pddoc = avdoc.GetPDDoc Set formApp = CreateObject(\"AFormAut.App\") \'すべてのページにフィールド挿入 numPages = pddoc.GetNumPages For i = 0 To numPages - 1 Set pt = pddoc.AcquirePage(i).GetSize If FieldLeft < 0 Then FieldLeft = 0 If FieldTop < 0 Then FieldTop = 0 If FieldRight < 0 Then FieldRight = pt.x If FieldBottom < 0 Then FieldBottom = pt.y With formApp.Fields.Add(\"Cover_\" & i + 1, \"text\", i, FieldLeft, FieldTop, FieldRight, FieldBottom) .Alignment = \"center\" .BorderStyle = \"solid\" \'境界線のスタイル:実線 .BorderWidth = 0 .IsHidden = False .PrintFlag = True .IsReadOnly = True .Value = FieldText \'表示するテキスト .TextSize = 0 \'文字サイズ:自動 .SetForegroundColor \"RGB\", 255, 255, 255, 0 \'文字色:白 .SetBackgroundColor \"RGB\", 0, 0, 0, 0 \'背景色:黒 End With Set pt = Nothing Next \'保存して閉じる pddoc.Save PDSaveIncremental, \"\" \'上書き保存 avdoc.Close 1 app.Hide: app.Exit End If End Sub''' ScriptOutput=> VBScriptOutput ScriptError=> ScriptError # 必要に応じて印刷 DISABLE System.PrintDocument DocumentPath: TargetFilePath
1. 変数の設定
処理対象のファイルパスを変数「%TargetFilePath%」として設定します。
2. ファイル パス部分の取得
処理対象のファイルが保存されているフォルダやファイル名、拡張子等を取得します。
3. フォルダーの作成
処理対象のファイルと同じ場所にフォルダを作成します。
・新しいフォルダーを次の場所に作成:%Directory%
・新しいフォルダー名:masked
4. ファイルのコピー
処理対象のファイルを作成したフォルダにコピーします。
・コピーするファイル:%TargetFilePath%
・宛先フォルダー:%NewFolder%
・ファイルが存在する場合:上書き
5. 変数の設定
コピーしたファイルを処理対象とするため、変数の値を設定し直します。
・宛先:%CopiedFiles[0]%
6. 変数の設定
スクリプトによるフィールド追加処理に必要な値を、変数として設定していきます。
- %FieldLeft%:フィールドの左位置(左下が基点)
- %FieldTop%:フィールドの上位置(左下が基点)
- %FieldRight%:フィールドの幅、0以下の値にすることでページの幅に合わせる
- %FieldBottom%:フィールドの高さ、0以下の値にすることでページの高さに合わせる
- %FieldText%:フィールドに設定する文字列
7. VBScript の実行
OLEオートメーションでAcrobatを制御し、各ページにテキストフィールドを被せるスクリプトを実行します。
Option Explicit MaskPDF "%TargetFilePath%", CSng(%FieldLeft%), CSng(%FieldTop%), CSng(%FieldRight%), CSng(%FieldBottom%), "%FieldText%" Private Sub MaskPDF(ByVal TargetFilePath, _ ByVal FieldLeft, _ ByVal FieldTop, _ ByVal FieldRight, _ ByVal FieldBottom, _ ByVal FieldText) '指定したPDFにテキストフィールドを被せる Dim app 'Acrobat.AcroApp Dim avdoc 'Acrobat.AcroAVDoc Dim pddoc 'Acrobat.AcroPDDoc Dim pt 'Acrobat.AcroPoint Dim formApp 'AFORMAUTLib.AFormApp Dim numPages, i Const PDSaveIncremental = 0 Set app = CreateObject("AcroExch.App") Set avdoc = CreateObject("AcroExch.AVDoc") If avdoc.Open(TargetFilePath, "") Then app.Show 'アプリケーション表示 Set pddoc = avdoc.GetPDDoc Set formApp = CreateObject("AFormAut.App") 'すべてのページにフィールド挿入 numPages = pddoc.GetNumPages For i = 0 To numPages - 1 Set pt = pddoc.AcquirePage(i).GetSize If FieldLeft < 0 Then FieldLeft = 0 If FieldTop < 0 Then FieldTop = 0 If FieldRight < 0 Then FieldRight = pt.x If FieldBottom < 0 Then FieldBottom = pt.y With formApp.Fields.Add("Cover_" & i + 1, "text", i, FieldLeft, FieldTop, FieldRight, FieldBottom) .Alignment = "center" .BorderStyle = "solid" '境界線のスタイル:実線 .BorderWidth = 0 .IsHidden = False .PrintFlag = True .IsReadOnly = True .Value = FieldText '表示するテキスト .TextSize = 0 '文字サイズ:自動 .SetForegroundColor "RGB", 255, 255, 255, 0 '文字色:白 .SetBackgroundColor "RGB", 0, 0, 0, 0 '背景色:黒 End With Set pt = Nothing Next '保存して閉じる pddoc.Save PDSaveIncremental, "" '上書き保存 avdoc.Close 1 app.Hide: app.Exit End If End Sub
8. ドキュメントの印刷
必要に応じてPDFを印刷します。
下記記事でも書いている通り、「ドキュメントの印刷」アクションはファイルの右クリックメニューにある「印刷」を実行したときと同じ動きをします。
実行画面
実行画面は下図の通りです。
上記の通りスクリプトでAcrobatを制御することによって、PDFの一部をマスキングするという、当初の目的が達成できました。
Acrobatが必要になってしまいますし、Acrobatを制御するためのスクリプトの知識も必要となりますが、知っておくとPDF処理の自動化に大いに役立つでしょう。
この記事へのコメントはありません。