PHPでPDFフォームを操作し入力させる

2023/03/29
高橋

こんにちは。株式会社リンクネット、ソリューション事業部の高橋です。

電子帳簿保存法が2022年に改正され、今まで紙で保管する必要があった書類も電子データで保管できるようになり、
様々な書類を電子データで作成させる需要が高まってきております。
電子帳簿保存法で保存可能な拡張子の中でもPDFファイルは電子署名が可能なことから、改ざんから保護された状態で保管が可能です。

PDFの機能の一つであるPDFフォームは、Adobe Acrobatソフトウェアを使用して作成されるPDF形式の文書で、ユーザー入力に応じて欄を埋めることができます。
このPDFフォームは、電子帳簿保存法においても書類として認められています。

本記事ではPDFフォームをPHPで操作し、WEBシステムで入力させたPDFを生成する方法を共有します。

環境

バージョン情報
$ sail artisan -V
Laravel Framework 8.82.0
$ sail php -v
PHP 8.1.5 (cli) (built: Apr 21 2022 10:15:06) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.5, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.5, Copyright (c), by Zend Technologies
    with Xdebug v3.1.2, Copyright (c) 2002-2021, by Derick Rethans

PDFのフォームについて

今回、サンプルとして利用するPDFは下記になります。

alt 未入力のPDFファイル

Dockerfileのカスタマイズ

今回のカスタマイズの目的はPDFを操作するライブラリであるpdftkをインストールします。
Dockerfileに下記の内容を追加しました。

Dockerfile
+      && apt-get -y install pdftk \

PDFのフォームの名称を取得する

pdftkコマンドを使用してPDFファイルのフォームの名称、入力ルールを取得します。

pdftk
$sail sehll
sail@95a980a7d0e2:/var/www/html$ pdftk sample.pdf dump_data_fields > fieldname.txt 

取得したフォームのうちテキストボックスの名称、入力ルールは下記のテキストになります。
PDFフォームを操作するにはFieldNameを参照します。
下記のFieldName住所となり、これは数値参照文字のため、
Unicodeへの変換を行うと住所になります。

fieldname.txtの一部(テキストボックス)
---
FieldType: Text
FieldName: 住所
FieldFlags: 12582912
FieldJustification: Left
---

プルダウンメニューの場合は下記になります。

fieldname.txtの一部(プルダウンメニュー)
---
FieldType: Choice
FieldName: お見積り
FieldFlags: 131072
FieldValue:  ▼選択してください
FieldValueDefault:  ▼選択してください
FieldJustification: Left
FieldStateOption:  ▼選択してください
FieldStateOption: お見積りは必要です
FieldStateOption: お見積りは不要です
---

上記のFieldNameお見積りとなり、これは数値参照文字のため、
Unicodeへの変換を行うとお見積りになります。
FieldValueは選択されている値、
FieldValueDefaultは初期値で▼選択してください
FieldStateOptionは選択肢のオプションとなります。
オプションはそれぞれ▼選択してくださいお見積りは必要ですお見積りは不要ですとなります。

PDFのフォームに値を入力する

下記のようにPHPでPDFフォームを操作し値を入力します。
今回、PDFを操作するライブラリはmikehaertl\pdftkを利用します。
インストール方法は下記になります。

pdftk
$sail composer require mikehaertl/php-pdftk

mikehaertl\pdftkを使用してPDFを操作するソースコードは下記になります。

PHPでファイル変換の一部を抜粋
        use mikehaertl\pdftk\Pdf;
        
        $pdf_path = $sample_path."/sample.pdf";
        $pdf = new Pdf($pdf_path);
        $result = $pdf->fillForm([
            '名前かな' => 'ヤマダ タロウ',
            '名前漢字' => '山田 太郎',
            '住所番号' => '9218163',
            '住所' => '石川県金沢市横川7丁目35番地1',
            '電話1' => '076',
            '電話2' => '245',
            '電話3' => '3001',
            'メルアド1' => 'pdftest',
            'メルアド2' => 'link-nt.co.jp',
            '相談' => '0',
            '電話' => 'On',
            'ファックス' => 'On',
            'メール' => 'On',
            '訪問' => 'On',
            'お見積り' => 'お見積りは必要です。',
        ])
        ->needAppearances()
        ->saveAs($sample_path.'/sample_filled.pdf');

実行結果は下記となります。

alt 入力済のPDFファイル

まとめ

今回はPDFフォームをPHPで操作する方法をまとめました。
通常はHTMLやエクセルファイルで一からPDFを作成することが多く、
PDFフォームを利用することは少ないですが、
官公庁等が公開している電子帳票はPDFフォームのものも多数あるため、
今後のプロジェクトにも活かしていけると考えております。

前の記事次の記事