以前の記事では、4D Write Pro を使用して PDF/A-3ファイル内にドキュメントを埋め込む方法について、電子インボイスの作成も含めてご紹介しました。フランス や ドイツ など、ヨーロッパのさまざまな国で電子インボイスの発行が義務化されるにつれ、これらの PDF に埋め込まれた XMLファイルを抽出する機能は非常に重要になってきています。しかし、PDF/A-3 の有用性はインボイスだけにとどまりません。これらのファイルには、さまざまな種類の文書を埋め込むことが可能なため、それらを抽出する手法が必要です。
Adobe Acrobat Reader のようなツールは手動で抽出をおこないますが、この記事では、4D 20 R6 を使用した、効率的で自動化された方法を紹介します。
専用コンポーネント
すべての添付ファイルを (メモリ内に) 抽出し、必要に応じて管理できるようにするため、専用のコンポーネントが開発されました。たとえば、XMLファイルを直接 DOMツリーに解析したり、画像ファイルをディスクに保存したりすることができます。
コンポーネントマネージャー
このコンポーネントは、4D 20 R6 に搭載されている コンポーネントマネージャー のおかげで、簡単にインストールできます。Sourcesフォルダーの中に dependencies.jsonファイルを作成し、下の数行を入力するだけです。すると、プロジェクト起動時にコンポーネントがインストールされます。提供されている HDI は、このメカニズムに基づいています。
{
"dependencies":
{
"4D-QPDF":
{
"github": "4d/4D-QPDF",
"version":"*"
}
}
}
抽出
コンポーネントが提供する 1つのメソッドで、PDFファイル内に含まれる文書のリストと内容を取得することができます。
$colAttachments:=PDF Get attachments ($PDFfile)
このメソッドは、オブジェクトのコレクションを返します。各オブジェクト要素には 1件の添付ファイルの情報が格納されており、name, extension, fullName, mimeType, content のような属性が含まれます。詳細は HDI と、コンポーネントのドキュメンテーションで説明されています。
$path:="/DATA/TestPDFs/ManyEnclosures.pdf"
$PDFfile:=File($path; fk posix path)
Form.attachments:=PDF Get attachments($PDFfile)
もちろん、電子インボイスの場合は、格納されている XML要素に直接アクセスすることもできます!
$XMLattachments:=PDF Get attachments($file).query("mimeType = :1"; "text/xml")
If ($XMLattachments.length#0)
$xml:=BLOB to text($XMLattachments[0].content; UTF8 text without length)
$dom:=DOM Parse XML variable($xml)
End if
GitHub のコンポーネントドキュメントでは、その他の機能 (チェック、更新など) についても詳しく説明しています。
抽出ダイアログの例
HDI では、返されたコレクションに基づいて添付ファイルの一覧をリストボックスに表示する方法を紹介しています。
まとめ
GitHub でソースコードが公開されているこのコンポーネントは、4Dアプリケーション内で PDF/A-3ファイルから添付ファイルを抽出するための信頼性の高い方法を提供するために、QPDFライブラリ (ここで自由に利用できるオープンソースのソリューション) を活用しています。このコンポーネントは、コンポーネントマネージャーからすぐに使用することができ、ニーズの拡大や QPDFライブラリの進化に合わせて柔軟にカスタマイズすることができます。