見出し画像

VBAで既存のPDFファイルに文字列を差し込む方法

はじめに

国税庁のホームページに、令和4年分の年末調整関係書類が掲載されました。

年末調整で従業員が提出する書類のひとつに「給与所得者の扶養控除等(異動)申告書」があります。個人住民税の「給与所得者の扶養親族申告書」と統合された様式です。会社に提出することで様々な控除を受けられます。

新入社員・中途社員でなければ、年末調整時に当年分と翌年分の扶養控除申告書が会社から配布されます。
当年分は、前年の年末調整時に従業員が記入したもので、申告内容に変更があれば訂正します。(令和3年分から訂正印が不要になりました)
翌年分は、原則として翌年1月分の給与を貰うまでに提出することになっています。

従業員がWebから入力(申告)することもありますが、中小企業の多くは未だ紙申告だと思います。国税庁がNECに作らせた「年調ソフト」もありますが、給与計算ソフト大手の給与奉行、PCA給与、弥生給与は連携しないようです。

年末調整DXの実現は、下記サイトによると2026年頃とみられています。

紙申告の場合、記入ミスが多く発生すると給与担当者の負担が増えるので、予め、給与計算ソフトから抽出した扶養データをプレ印字した上で配布することが多いです。

そこで、国税庁からダウンロードできる扶養控除申告書のPDFファイルに、VBA(ExcelやAccessで使えるマクロ言語)で文字列を差し込む方法を紹介します。

準備するもの

Adobe Acrobat がインストールされているパソコン
VBA から Adobe Acrobat のCOMオブジェクトをコントロールするので必要です。無料版の Acrobat Reader ではダメです。製品版を購入して下さい。

インタラクティブフォームフィールドがあるPDFファイル
国税庁のホームページに掲載されている「入力用」のPDFファイルを使います。

画像3

Acrobat Reader の「入力と署名」ツールで作成できるフラットフォームフィールドでは、VBAから文字列を差し込むことはできません。インタラクティブフォームフィールドを自作するには、Adobe Acrobat Pro 等のPDFオーサリングソフトが必要です。

マクロの作成

では作成していきましょう!

すべてのフォームフィールドには、内部でユニークな「フィールド名」が振られています。これが分からないと差し込む場所を指定できないため、確認用のPDFファイルを作成しておきます。

マクロと同じフォルダに扶養控除申告書のPDFファイルを置き、次のマクロを実行すると「フィールド番号確認用.pdf」を出力します。

Sub PDFにフィールド名を埋め込む()
   Dim pdDoc As Object, oField As Object
   Dim i As Integer, sFieldName As String
    
   ' Adobe Acrobat API
   Set pdDoc = CreateObject("AcroExch.PDDoc")
   
   ' PDFドキュメントを開く
   If Not pdDoc.Open(ThisWorkbook.Path & "\r03_01_input.pdf") Then
       MsgBox "PDFが開けませんでした", vbCritical
       Exit Sub
   End If
   
   With pdDoc.GetJSObject
       For i = 0 To .numFields - 1
           sFieldName = .getNthFieldName(i)
           Set oField = .getField(sFieldName)
           If oField.Type = "text" Then oField.Value = Replace(sFieldName, "Text", "")
       Next
   End With
       
   pdDoc.Save 1, ThisWorkbook.Path & "\フィールド番号確認用.pdf"
   pdDoc.Close
End Sub

「フィールド番号確認用.pdf」を開くと、各フィールド内に数字が入力されているのが確認できます。

画像1

この番号(フィールド名)を頼りに、文字列を差し込み、PDFファイル名を「従業員番号+氏名」で保存していくわけです。

sCode = 1234         ' 従業員番号
sName = "山田 花子"  ' 従業員氏名
With pdDoc.GetJSObject
   .getField("Text7").Value = sName                    ' あなたの氏名
   .getField("Text10").Value = "東京都港区赤坂35-4-9"   ' 住所
   .getField("Test14").Value = "太郎"                  ' 世帯主の氏名
   .getField("Test15").Value = "夫"                    ' あなたとの続柄
End With
       
pdDoc.Save 1, ThisWorkbook.Path & "\" & sCode & "_" & sName & ".pdf"  ' 保存

実際には、この差し込み文字列を、ExcelシートやCSVファイル、Accessのテーブルから取得することになるでしょうけど、このやり方はVBAをかじったことのある人なら難しくないと思いますので、説明は割愛させていただきます。

差し込み用のテストデータは、下記サイトで生成すると良いです。

国や自治体が配布しているPDFファイルはインタラクティブフォームフィールド付きも少なくないので、上手に活用すると生産性を上げられそうですね。

さいごに

マインドウッドでは、企業のバックエンド業務を支える人事・給与・勤怠・会計システムとAPIで連携できる「痒い所に手が届くツール」の制作も請け負っています。詳細はホームページからお問い合わせ下さい。