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 (<vendor>/<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](https://qiita-image-store.s3.amazonaws.com/0/82334/8545b537-cc29-2069-009d-2a3bbe2d77c0.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フォントのダウンロードページ](http://ipafont.ipa.go.jp/old/ipafont/download.html)
ここから、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();
```