PHP

TCPDF+PHPでPDFを動的に生成する

割と簡単に対応ができるし、高機能だけど見た目の調整は結構めんどうかも。。

今回はTCPDFを使用してみました。

TCPDFとは…

  • PHP用のライブラリで、PDFファイルを動的に作成するためのライブラリ
  • PHP4、PHP5で動作する
  • UNICODEで対応
  • Linux 、Windowsで動作
  • 日本語フォントにも対応しており、標準で「arialunicid0」「kozgopromedium」「kozminproregular」あたりが設定可能。

など。。細かいところはここを参照。

▼TCPDFのダウンロード
SorceForge(http://sourceforge.net/projects/tcpdf/files/)に最新のファイルがあるようなので、こちらからダウンロード
(PHP4のものはファイル名の後ろに_php4と書いてあるようです)

▼汎用ライブラリの作成
TCPDF側で持っているスタイルは基本利用しない形で作ってみました。

<?php
require_once(MLC_LIB_DIR . '/extlib/tcpdf/tcpdf.php');

/**
 * Pdf生成ライブラリ
 */
class Pdf extends TCPDF
{
	var $pdfInstance;
	var $_pdfFileName = 'sample.pdf';
	var $_pdfData;
	var $_pdfSubject = '○○株式会社様へのお知らせ';
	var $defaultFontType = 'kozminproregular';


	/**
	 *
	 */
	function Pdf($pdfEncode)
	{
		parent::__construct(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, $pdfEncode, false);

		$this->SetCreator(PDF_CREATOR);
		$this->SetAuthor('AUTHOR');
		$this->SetTitle('TITLE');
		$this->SetSubject('SUBJECT');
		$this->SetKeywords('KEYWORD');
		/**
		 * ヘッダ・フッタ設定
		 */
		$this->setHeaderFont(false);
		$this->setFooterFont(false);
		$this->setPrintHeader(false);
		/**
		 * 固定幅フォント設定
		 */
		$this->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
		/**
		 * マージン設定
		 */
		$this->SetMargins(0/*PDF_MARGIN_LEFT*/, 0/*PDF_MARGIN_TOP*/, 0/*PDF_MARGIN_RIGHT*/);
		$this->SetHeaderMargin(0/*PDF_MARGIN_HEADER*/);
		$this->SetFooterMargin(0/*PDF_MARGIN_FOOTER*/);
		/**
		 * ページブレイクの設定
		 */
		$this->SetAutoPageBreak(false, 0/*PDF_MARGIN_BOTTOM*/);
		/**
		 *
		 */
		$this->setImageScale(PDF_IMAGE_SCALE_RATIO);
		/**
		 *
		 */
		$this->setLanguageArray($l);
		/**
		 *
		 */
		$this->setFontSubsetting(true);
		/**
		 *
		 */
		$this->SetFont($this->defaultFontType, '', 20, '', true);
		/**
		 *
		 */
		$this->AddPage();
	}

	/**
	 *
	 */
	function setPdfSubject($pdfSubject)
	{
		$this->_pdfSubject = $pdfSubject;
	}

	/**
	 *
	 */
	function getPdfSubject()
	{
		return $this->_pdfSubject;
	}

	/**
	 *
	 */
	function setPdfFileName($pdfFileName)
	{
		$this->_pdfFileName = $pdfFileName;
	}

	/**
	 *
	 */
	function getPdfFileName()
	{
		return $this->_pdfFileName;
	}

	/**
	 *
	 */
	function setPdfData($pdfData)
	{
		$this->_pdfData = $pdfData;
	}

	/**
	 *
	 */
	function getPdfData()
	{
		return $this->_pdfData;
	}

	/**
	 * PDFファイルの生成
	 *
	 * @param $execMode PDF生成モード(D:ダウンロード, I:出力)
	 */
	function exec($execMode = 'D')
	{
		$this->writeHTML($this->getPdfData(), true, 0, true, 0);
		$this->Output($this->getPdfFileName(), $execMode);
	}

	/**
	 * インスタンスの生成
	 *
	 */
    function &getInstance($pdfEncode = 'UTF-8')
    {
        static $instance;
        if ( !$instance )
        {
            $instance = new Pdf($pdfEncode);
        }
        return $instance;
    }
}

こんな感じで利用

$pdfInstance = Pdf::getInstance('UTF-8');
$pdfInstance->setPdfFileName($pdfFileName);
$pdfInstance->setPdfData($template);
$pdfInstance->exec();

これCSSとかも反映されるし、すごい高機能だなーって印象。

参考にさせていただいたサイトさま

チーター・エンジニア – TCPDFに関するリファレンス・ドキュメント