Satoshi's Data Labo            
開発メモ : レンタルサーバー上のクラウドDBからのPDF帳票出力

最近、PHPRunner という開発ツールを使い、レンタルサーバー上で初歩的なMySQL DBシステムを作成してきた。
しかし、レポートに関してはクエリー結果をシンプルに纏めた表の出力のみであり、官公庁向け所定様式のようなレイアウトの複雑な帳票出力にはトライしていない。 外部から入手するPDFフォームの各フィールドにクエリー結果を出力することを目標に情報収集を開始。 以下、備忘録として収集した情報をメモするもの。

先ず目指したのは、PDFフォームを入手、乃至、作成のうえ、PDFフォーム上の各フィールドに対して、クエリー結果をマッピングすること。 調べた限り、 iText がポピュラーなソリューションであることが判った。 しかし、iText はJAVA、派生品の iText Sharp はC# で書かれており、私のレンタルサーバーではこれらのライブラリの活用は出来ない点がネックとなり断念。

次に、レンタルサーバーの制約を考慮し、クライアントサイドで動くJava Script 又はレンタルサーバーでも動くPHPで書かれたものに絞って検索し、2つのライブラリをピックアップした。


① jsPDF (1.3.2)
jsPDFは検索によれば PDFフォームに対応しているとの記述があったので、まずこれを試してみた。
ダウンロードしたZipファイルをレンタルサーバーのルートフォルダに解凍し、jsPDF-1.3.2 フォルダとして保存。
一方、テストファイル格納用のフォルダとして、pdf_test も作成。

テスト結果は以下に示した通りであり、html からJava Script を呼び出すことで簡単にPDFを作成することができた。
しかし、オフィシャルサイトの例示によれば、jsPDF は PDFフォームそのものを作成(同時にコンテンツのセット)することはできるが、既存のPDFフォームを読み込みターゲットフィールドにクエリ結果を出力することはできないようである。 残念!


/PDF01.png

< test.html >  -->  test.html

/PDF03.png

< basic.js >

/PDF04.png


② TCPDF & FPDI
TCPDF が最もポピュラーなPDF出力ライブラリであることは承知していたが、PDFフォーム上のフィールドへの出力ができないため、それ以外のライブラリ活用を目指していたが、結局TCPDF に戻ってきた。 今までTCPDF を使う機会がなく、基礎知識もないため以下の通り段階的に機能確認してみた。

TCPDF をレンタルサーバーのルートフォルダ配下に保存。 また、既存のPDFファイルを読み込むために必要となる、FPDI (含む FPDF-TPL.php)も同様にルートフォルダ配下に保存。 さらに、テストファイル格納用のフォルダとして、pdf_test2 を作成しPDF出力のテンプレートとなるBook1.pdf もここに保存した。

※FPDIで読み込むPDFテンプレートは、最新バージョンのPDFではデータの書き込みができずエラーとなるため、CutePDFを使い、Ver.1.4 形式で作成しておく必要あり。 (Acrobat Distiller の設定変更でも対応できるが、他のPDF作成にも影響が及ぶことを避けるため、CutePDFを追加で導入することとした。)


/PDF02.png

< Book1.pdf >

/PDF05.png

< test2.php >  -->  test2.php
読み込んだPDFテンプレート上に座標でMultiCell を配置し、ここにテキストを出力

/PDF06a.png


< test3.php >  -->  test3.php
基本はTest 2と同じだが、出力対象のテキストを変数化したもの。

/PDF07.png

< test4.php >  -->  test4.php
test 2, 3 の MultiCell に代えて、Write を使ったもの。

/PDF08.png

< test5.php >  -->  test5.php
MySQL のデータを database.php でクエリーのうえ、クエリ結果をテーブルとして出力。

/PDF09.png

< database.php >

/PDF11.png

< test6.php >  -->  test6.php
配列を定義のうえ、配列の要素毎に改ページしてPDF出力。

/PDF10.png

< test7.php >  -->  test7.php
下調べは一通り済ませたので、いよいよ本丸へ突入。 test6までと同様、test7.php を用意し、新たなPDFテンプレートとして Book2.pdf を用意。 Test5 で準備した7冊の蔵書テーブルのタイトル、作者をターゲットのPDFテンプレートに出力。


/PDF12.png

出力結果は以下の通り。 ほぼ狙い通りの位置にクエリー結果が出力され、テンプレート適用、改ページもOK。

/PDF13.png

出力位置の設定は、PDFテンプレートの座標を用いた。 アクロバットの表示で「カーソル座標」を表示させ、大体狙った位置に出力することができるようだ。

/PDF14.png

試行錯誤を重ねたが、これならなんとか実務投入できるものが作れそうだ。 めでたしめでたし。

編集後記
当初探していたPDFフォームの各フィールドへの出力には至らなかったが、PDFテンプレートの任意の箇所に出力することはできたので一応目的は達せられた。 しかし、PDFテンプレート上でXY座標を確認しながらの出力位置調整はやはりいささか面倒なプロセスだと思う。 願わくばTCPDF のプロジェクトでPDFフォームの各フィールドをデータ出力先として指定できるような機能が追加されれば非常に有益だと思う。 PDFフォームの作成、修正は非常に簡単なので生産性がぐっとあがるだろう。。

 
 
 
Copyright © 2017 Satoshi Ashikari All Rights Reserved.