Edited at

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 ←リターン

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)まで使えました。ただし、オブジェクトレベルの圧縮を「オフ」または「タグのみ」である必要があります(圧縮エラーが発生します)。また、セキュリティオプションがついている場合はセキュリティエラーが発生します。

Image1.png

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


index.php

<?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フォントのみです。


mkfont.php

<?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°に傾けておかないと何故か不思議な状況になります。


text.php

<?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();