Power Automate for desktop

[Power Automate Desktop]Acrobatを操作して指定したPDFにテキストフィールドを被せてマスキングするフロー

先日開催された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だけでも十分に処理できそうです。

そこで今回は、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処理の自動化に大いに役立つでしょう。

参考Webサイト

Microsoft Edgeのバージョンに合わせてWebDriverをダウンロードするVBAマクロ前のページ

2021年8月の人気記事次のページ

関連記事

  1. Office関連

    PDFのしおり数を取得するVBAマクロ

    「VBA Acrobat しおり数」といったキーワード検索でのアクセス…

  2. VBScript

    Windows Updateの更新履歴をCSV(UTF-8)で保存するVBScript

    以前書いたスクリプトが出てきました。Windows Updateの…

  3. Office関連

    Adobe Readerを利用してPDFファイルのページ数を取得するVBAマクロ

    mougの回答用に書いたコードです。mougは半年でログが消えてし…

コメント

  • コメント (0)

  • トラックバックは利用できません。

  1. この記事へのコメントはありません。

Time limit is exhausted. Please reload CAPTCHA.

※本ページはプロモーションが含まれています。

Translate

最近の記事

アーカイブ

PAGE TOP