LoginSignup
12
12

More than 3 years have passed since last update.

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

Last updated at Posted at 2017-11-02

はじめに

 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();
12
12
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
12