はじめに
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 ←リターン
Minimum Stability []: ←リターン
Package Type (e.g. library, project, metapackage, composer-plugin) []: ←リターン入力
License []: ←リターン入力
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.2 for setasign/fpdi
Search for a package: ←もう必要なパッケージはない
Would you like to define your dev dependencies (require-dev) interactively [yes]? ←リターン入力
{
"name": "nweb2/tcpdf",
"require": {
"tecnickcom/tcpdf": "^6.2",
"setasign/fpdi": "^2.2"
}
}
Do you confirm generation [yes]? ←リターン入力
Would you like to install dependencies now [yes]? ←リターン入力
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 2 installs, 0 updates, 0 removals
- Installing setasign/fpdi (v2.2.0): Loading from cache
- Installing tecnickcom/tcpdf (6.2.26): Loading from cache
setasign/fpdi suggests installing setasign/fpdf (FPDI will extend this class but as it is also possible to use TCPDF or tFPDF as an alternative. There's no fixed dependency configured.)
setasign/fpdi suggests installing setasign/fpdi-fpdf (Use this package to automatically evaluate dependencies to FPDF.)
setasign/fpdi suggests installing setasign/fpdi-tcpdf (Use this package to automatically evaluate dependencies to TCPDF.)
setasign/fpdi suggests installing setasign/fpdi-tfpdf (Use this package to automatically evaluate dependencies to tFPDF.)
Writing lock file
Generating autoload files
%
composer.json と vendorフォルダの中にダウンロードされています
TcpdfとFpdiで最小限のサンプル
カレントにおいてあるtest.pdfに小塚ゴシックと小塚明朝で日本語を記入するサンプルです。
phpはUTF-8Nで作ってください。
PDFはAcrobat4形式(ver1.3)またはAcrobat5形式(ver1.4)のものでないとエラーが発生します。
試してみたら、Acrobat8形式(ver1.7)まで使えました。ただし、オブジェクトレベルの圧縮を「オフ」または「タグのみ」である必要があります(圧縮エラーが発生します)。また、セキュリティオプションがついている場合はセキュリティエラーが発生します。
tcpdfでは"kozgopromedium"と指定すると小塚ゴシック、"kozminproregular"と指定すると小塚明朝が使えます。
<?php
use setasign\Fpdi;
require_once('vendor/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フォントのみです。
<?php
use setasign\Fpdi;
require_once('vendor/autoload.php');
$pdf = new Fpdi\TcpdfFpdi('P', 'mm', 'A4');
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
$font = new TCPDF_FONTS();
//ttfフォントをTCPDF用に変換
$fontfile = 'ipamp.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が追加されます。
フォントファイルは、カレントに置くか $fontfileに絶対パスを指定します。
このipamp.phpなどの中にある$file='ipamp.z';
を削除すると、フォントの埋め込みをされなくなるようです。kozgopromedium.phpなどを見ると、この$file=...;
の定義がないのでChromeで見ると小塚ゴシックが明朝で表示されるのでしょう。
文字列の回転
最後に文字列の回転ですが、次のサンプルでできます。
(10,160)から30°、(10,180)から30°傾いた文字列を表示します。文字列を傾けた後は-30°に傾けておかないと何故か不思議な状況になります。
<?php
use setasign\Fpdi;
require_once('vendor/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();