tcPDF
fpdi

FtcpdfとFpdiを簡単に使う方法と文字列の回転

はじめに

 fpdfとfpdiでずっと使ってきたけど、日本語パッチを当てないとfpdfが動かないし、文字列の回転ができなかったのでtcpdfを使ってみようと思いました。
 簡単にできるかなと思ったのですが、思いのほか手間取ったのでうまくいく方法を公開しておきます。

Composerで環境つくり

Composerの作成

 Composerを使ったことがなかったので、ここから始めました。
 さくらインターネットのレンタルサーバーで動作確認しています。
% curl -sS https://getcomposer.org/installer | php
とすると composer.phar ができます。これを使って、環境をインストールするみたいです。

初期設定

 対話形式で設定ファイルを作ります。
% php composer.phar init
このコマンドで、次のように入力していきます。
Welcome to the Composer config generator

This command will guide you through creating your composer.json config.

Package name (/) [mag2/ttt]: ←自分のベンダ名/プロジェクト名を入れます
Description []: ←プロジェクトの説明
Author [, n to skip]: n ←作者について nでなし
Minimum Stability []:  ←空でOK
Package Type (e.g. library, project, metapackage, composer-plugin) []: project  ←とりあえずprojectと入力
License []:  ←空でOK

Define your dependencies.

Would you like to define your dependencies (require) interactively [yes]?  ←リターン入力
Search for a package: tcppdf  ←必要なパッケージを入力

Found 15 packages matching tcppdf

[0] tecnickcom/tcpdf
[1] tecnick.com/tcpdf
[2] spipu/html2pdf
[3] setasign/fpdi
[4] whiteoctober/tcpdf-bundle
[5] setasign/fpdi-tcpdf
[6] elibyy/tcpdf-laravel
[7] tecnickcom/tc-lib-pdf
[8] ensepar/html2pdf-bundle
[9] maxxscho/laravel-tcpdf
[10] ensepar/tcpdf
[11] xaoc/laravel-tcpdf
[12] wallabag/tcpdf
[13] swiss-payment-slip/swiss-payment-slip-tcpdf
[14] soqrate/tcpdf

Enter package # to add, or the complete package name if it is not listed: 0  ←0を選択
Enter the version constraint to require (or leave blank to use the latest version):  ←バージョンはおまかせ
Using version ^6.2 for tecnickcom/tcpdf
Search for a package: fpdi  ←必要なパッケージを入力

Found 15 packages matching fpdi

[0] setasign/fpdi
[1] setasign/fpdi-fpdf
[2] setasign/fpdi-tcpdf
[3] itbz/fpdi
[4] madnh/fpdi-protection
[5] istom1n/fpdi-tfpdf
[6] chap-pfp/fpdi
[7] artack/fpdi
[8] chadyred/fpdf-fpdi-symfony2
[9] onigoetz/fpdi_tcpdf
[10] uam/tcpdfx
[11] kitpages/pdf-bundle
[12] chadyred/easy-pdf-bundle
[13] setasign/fpdi-protection
[14] scouting-nl/fpdi

Enter package # to add, or the complete package name if it is not listed: 0  ←0を選択
Enter the version constraint to require (or leave blank to use the latest version):  ←バージョンはおまかせ
Using version ^2.0 for setasign/fpdi
Search for a package:  ←もう必要なパッケージはない
Would you like to define your dev dependencies (require-dev) interactively [yes]? n  ←開発環境?よくわからないのでn

{
"name": "mag2/ttt",
"type": "project",
"require": {
"tecnickcom/tcpdf": "^6.2",
"setasign/fpdi": "^2.0"
}
}

Do you confirm generation [yes]? y  ←上のデータがcomposer.jsonとしてできる
%

完成したcomposer.json

composer.json
{
    "name": "mag2/ttt",
    "type": "project",
    "require": {
        "tecnickcom/tcpdf": "^6.2",
        "setasign/fpdi": "^2.0"
    }
}

ちょっとわかったら、このファイルを直接作ったほうが早いかもしれないです。
 これで % php composer.phar install とするとtcpdfとfpdiを自動でダウンロードして、ある程度環境を作ってくれます。バージョンが変わった場合には、composer.jsonのバージョンを修正して % php composer.phar update です。
 環境(ライブラリ)はカレントのvendorフォルダ以下にインストールされます。

TcpdfとFpdiで最小限のサンプル

カレントにおいてあるtest.pdfに小塚ゴシックと小塚明朝で日本語を記入するサンプルです。
phpはUTF-8Nで作ってください。

PDFはAcrobat4形式(ver1.3)またはAcrobat5形式(ver1.4)のものでないとエラーが発生します。
試してみたら、Acrobat8形式(ver1.7)まで使えました。ただし、オブジェクトレベルの圧縮を「オフ」または「タグのみ」である必要があります(圧縮エラーが発生します)。また、セキュリティオプションがついている場合はセキュリティエラーが発生します。
Image1.png

tcpdfでは"kozgopromedium"と指定すると小塚ゴシック、"kozminproregular"と指定すると小塚明朝が使えます。

index.php
<?php
use setasign\Fpdi;

require_once('vendor/tecnickcom/tcpdf/tcpdf.php');
require_once('vendor/setasign/fpdi/src/autoload.php');

$pdf = new Fpdi\TcpdfFpdi();
$pdf->setSourceFile("test.pdf");

// add a page
$pdf->AddPage();
$importPage = $pdf->importPage(1);
$pdf->useTemplate($importPage, 0, 0);

$pdf->SetFont("kozgopromedium", "", 36);
$pdf->Text(10, 160, "小塚ゴシックPro M1234567890@ABCabc");

$pdf->SetFont("kozminproregular", "", 36);
$pdf->Text(10, 180, "小塚明朝Pro M1234567890@ABCabc");

$pdf->Output();

フォントの追加

 Adobeで見ると正しくゴシック表示されるのに、Chromeで見ると小塚ゴシックが明朝で表示されます。
 これが面白くないし、非プロポーショナルフォントも表示したいのでフォントを追加します。
IPAフォントのダウンロードページ
ここから、IPAフォントをダウンロードしました。追加できるのはttfフォントのみです。

mkfont.php
<?php
require_once('vendor/tecnickcom/tcpdf/tcpdf.php');

$pdf = new Tcpdf('P', 'mm', 'A4');  
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
$font = new TCPDF_FONTS();   

//ttfフォントをTCPDF用に変換
$fontfile = 'ipamp.ttf';
//$fontfile = 'ipagp.ttf';
//$fontfile = 'ipam.ttf';
//$fontfile = 'ipag.ttf';

$myFont = $font->addTTFfont($fontfile);
$pdf->SetFont($myFont, '', 11);  

$pdf->AddPage();
$x = 10;
$y = 30;
$pdf->Text($x, $y, "フォント" . $fontfile);
$y += 10;
$pdf->Text($x, $y, "0123456789");
$y += 10;
$pdf->Text($x, $y, "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
$y += 10;
$pdf->Text($x, $y, "abcdefghijklmnopqrstuvwxyz");
$y += 10;
$pdf->Text($x, $y, "あいうえおかきくけこさしすせそ");
$y += 10;
$pdf->Text($x, $y, "日本は、国土はアジアにありながら、国民精神においては西洋の近代文明を受け入れた。");

$pdf->Output("sample.pdf", "I");

 これでフォントがvendor/tecnickcom/tcpdf/fontsに追加されます。'ipamp.ttf'の場合、ipamp.ctg.z ipamp.z ipamp.phpが追加されます。
 このipamp.phpなどの中にある$file='ipamp.z';を削除すると、フォントの埋め込みをされなくなるようです。kozgopromedium.phpなどを見ると、この$file=...;の定義がないのでChromeで見ると小塚ゴシックが明朝で表示されるのでしょう。

文字列の回転

 最後に文字列の回転ですが、次のサンプルでできます。
(10,160)から30°、(10,180)から30°傾いた文字列を表示します。文字列を傾けた後は-30°に傾けておかないと何故か不思議な状況になります。

text.php
<?php
use setasign\Fpdi;

require_once('vendor/tecnickcom/tcpdf/tcpdf.php');
require_once('vendor/setasign/fpdi/src/autoload.php');

$pdf = new Fpdi\TcpdfFpdi();
$pdf->setSourceFile("test.pdf");

// add a page
$pdf->AddPage();
$importPage = $pdf->importPage(1);
$pdf->useTemplate($importPage, 0, 0);

$pdf->Line(10, 160, 10 + 200 * cos(30 / 180 * 3.14), 160 - 200 * sin(30 / 180 * 3.14));
$pdf->SetFont("kozgopromedium", "", 36);
$pdf->Rotate(30, 10, 160);
$pdf->Text(10, 160, "小塚ゴシックPro M1234567890@ABCabc");
$pdf->Rotate(-30, 10, 160);

$pdf->Line(10, 160, 10 + 200 * cos(30 / 180 * 3.14), 180 - 200 * sin(30 / 180 * 3.14));
$pdf->SetFont("kozminproregular", "", 36);
$pdf->Rotate(30, 10, 180);
$pdf->Text(10, 180, "小塚明朝Pro M1234567890@ABCabc");
$pdf->Rotate(-30, 10, 180);

$pdf->Output();