Laravel5でZendPDFを使う

ZendFrameworkのコンポーネントであるZendPDFは、PDFファイルの読み込みや生成が簡単にできるライブラリとして提供されています。標準でマルチバイト文字に対応していますので、日本語のPDFファイルの出力が容易にできるのが魅力です。また、複数のPDFファイルのマージや1ページ単位で編集などの多機能で使いやすいのが特徴です。

今日は、そのZendPDFをLaravel5で使用する方法を調べてみたいと思います。

ZendPDFのインストール

ZendPDFのインストールはComposer経由で可能ですので、インストールは簡単です。下記のようにcomposer.jsonにZendPDFを追加記述します。

"require": {
 "laravel/framework": "5.0.*",
 "zendframework/zendpdf": "dev-master"
 },

上記の3行目を追加記述したら、composerをupdateします。

cd c:\xampp\htdocs\laravel
composer update

composerをupdateしたら、app/vendorフォルダにzendframeworkフォルダがインストールされています。

日本語フォントの用意

デフォルトのフォントでは、日本語が表記できませんので、日本語を利用できるフリーのフォントを用意します。下記のサイトから自由に選択して下さい。

2015年用、日本語のフリーフォント164種類のまとめ

私は、今回のその中から、Unicodeの全漢字9万字以上を収録している、花園フォントをダウンロードします。花園フォントのダウンロードをクリックすると、OSDNのダウンロードページへ移動します。真ん中より少し下の方に、hanazono-20141012.zipファイルがありますので、クリックしてダウンロードします。

2015-06-18 10-05-20

ダウンロードしたZipファイルを解凍したら、HanaMinA.ttfとHanaMinB.ttfファイルをpublic/fontsフォルダに保存します。

2015-06-18 10-20-52

PDFを作成/保存する

それでは、実際にPDFを作成するために、コントローラを作成してみます。コマンドプロンプトから、下記を実行します。

php artisan make:controller PdfController

ルーターにPdfControllerを追加します。

Route::controller('pdf','PdfController');

生成されたコントローラのcreateメソッドをgetCreateに変更して、PDFを生成してみます。

<?php namespace App\Http\Controllers;
use App\Http\Requests;
 use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
//ZendPdfをインポート
 use ZendPdf\PdfDocument;
 use ZendPdf\Font;
 use ZendPdf\Page;
class PdfController extends Controller {
public function getCreate()
 {
 // PDFドキュメントを生成
 $pdf = new PdfDocument();
// A4サイズでPDFのページ生成
 $pdfPage = new Page(Page::SIZE_A4);
// 日本語のフォントを指定
 $font = Font::fontWithPath('fonts/HanaMinA.ttf');
// フォントと文字のサイズを指定
 $pdfPage->setFont($font , 24 );
// 出力する文字と位置、文字コードの指定
 $pdfPage->drawText('ZendPDFでPDF生成',100, 800, 'UTF-8');
// 生成したページをPDFドキュメントに追加
 $pdf->pages[] = $pdfPage;
// ファイルとして保存、ブラウザに出力
 $pdf->save('sample.pdf');
 header ('Content-Type:', 'application/pdf');
 header ('Content-Disposition:', 'inline;');
 echo $pdf->render();
 }
 }

それでは、実際にブラウザで表示してみましょう。

2015-06-18 10-57-49

そして、public/sample.pdfファイルが生成されています。

PDFファイルを読み込む

既存のPDFファイルを読み込むのは、とても簡単です。getIndexアクションを下記のように記述します。

public function getIndex()
 {
 //PDFを読み込む
 $pdf= PdfDocument::load('sample.pdf');
//ブラウザに表示
 header ('Content-Type:', 'application/pdf');
 header ('Content-Disposition:', 'inline;');
 echo $pdf->render();
 }

これで、簡単にブラウザでPDFファイルを表示することができます。

PDFファイルをマージする

複数のPDFファイルをマージして1つのPDFファイルとして扱う方法を調べてみます。

getMergeアクションを作成して、下記のように記述します。

public function getMerge()
 {
 //マージするPDFファイル
 $files=['sample.pdf','sample2.pdf'];
//マージ用のPDFオブジェクト
 $merge=new PdfDocument;
 foreach($files as $file):
 //PDFを読み込む
 $pdf= PdfDocument::load($file);
 //PDFの内容を取得
 $extractor=new \ZendPdf\Resource\Extractor();
 //各ページを取得
 foreach($pdf->pages as $page):
 //ページの内容をコピー
 $clone=$extractor->clonePage($page);
 //マージ用のPDFにページ内容を追加
 $merge->pages[]=$clone;
 endforeach;
 endforeach;
 //マージしたPDFファイルを保存
 $merge->save('sample3.pdf');
 }

尚、マージするPDFファイル( sample.pdfとsample2.pdf )は、publicフォルダの直下に用意して下さい。

これで、2つのPDFファイルがマージされて1つのPDFファイルが生成されました。

本日のまとめ

  1. ZendPdfのインポート
    use ZendPdf\PdfDocument;
    use ZendPdf\Font;
    use ZendPdf\Page;
    use ZendPdf\Resource\Extractor;
  2. 新規PDFドキュメントの作成及び読み込み
    //新しいPDFドキュメントの作成
    $pdf1=new PdfDocument();
    //ファイルからPDFドキュメントを読み込む
    $pdf2=PdfDocument::load($fileName);
    //文字列からPDFドキュメントを読み込む
    $pdf3=PdfDocument::parse($pdfString);
  3. PDFドキュメントの保存
    //PDFドキュメントを読み込みます
    $pdf=PdfDocument::load($fineName);
    //ドキュメントを更新します
    $pdf->save($fileName,true);
    //ドキュメントを新しいファイルに保存します
    $pdf->save($newFileName);
    //PDFドキュメントを文字列で返します
    $pdfString=$pdf->render();
  4. PDFドキュメントのページ操作
    //PDFドキュメントを読み込みます
    $pdf=PdfDocument::load($fineName);
    //ページの並び順を反転します
    $pdf->pages=array_reverse($pdf->pages);
    //A4サイズで新しいページを追加します
    $pdf->pages[]=new Page(Page::SIZE_A4);
    //指定したページを削除します
    unset($pdf->pages[$id]);
  5. ページの複製
    //テンプレートを別の変数に格納します
    $template=$pdf->pages[$templatePageIndex];
    //新しいページを追加します
    $page1=new Page($template);
    //日本語フォントを指定
    $font=Font::fontWithPath($fontName);
    $page1->setFont($font,24);
    //追加するテキスト
    $text="Some text...";
    //X座標(左端からの距離)
    $x=50; //ポイント数(1インチの1/72)
    //Y座標(下部からの距離)
    $y=800;  //ポイント数(1インチの1/72)
    //テキストを描画
    $page1->drawText($text,$x,$y,"UTF-8");
    $pdf->pages[]=$page1;
    //別のページを追加します
    $page2=new Page($template);
    //追加するテキスト
    $text="Anothe text...";
    //X座標
    $x=50;
    //Y座標
    $y=750;
    //2ページ目を描画
    $page2->drawText($text,$x,$y,"UTF-8");
    $pdf->pages[]=$page2;
    //最後にテンプレートページをドキュメントから削除
    unset($pdf->pages[$templatePageIndex];
  6. Extractorクラスを利用して既存のページを複製
    $extractor=new Extractor();
    $page1=$extractor->clonePage($pdf->pages[$templatePageIndex1]);
    $page2=$extractor->clonePage($pdf->pages[$templatePageIndex2]);
    $font=Font::fontWithPath($fontName);
    $page1->setFont($font,24);
    $page1->drawText('Some text...',$x,$y,'UTF-8');
    $page2->setFont($font,24);
    $page2->drawText('Another text...',$x,$y,'UTF-8');
    $pdf=new PdfDocument();
    $pdf->pages[]=$page1;
    $pdf->pages[]=$page2;
  7. ページの大きさはページオブジェクトから取得します
    $pdf=PdfDocument::load($fineName);
    //ページの横幅を取得
    $width=$pdf->pages[$PageIndex]->getWidth();
    //ページの縦幅を取得
    $height=$pdf->pages[$pageIndex]->getHeight();

ZendPDFのサイト

その他のZendPDFの詳細な利用方法は、ZendFramework2の公式サイトを確認して下さい。

Zend_Pdf

2015-06-18 12-25-20

本日は、以上です。

このエントリーを含むはてなブックマーク Buzzurlにブックマーク livedoorクリップ Yahoo!ブックマークに登録

トラックバック&コメント

この投稿のトラックバックURL:

コメントをどうぞ

このページの先頭へ