ここは、技術情報、身の回りに起こった出来事を、「もしかしたらみんなの役に立つかもしれない」と思って書き留めておく場所です。

Image

【PHP】既存のPDFに文字と画像を入れる方法

2020年11月10日
 

前回は、「新規のPDFを作成する方法」を紹介しました。

今回は、既存のPDFをフォーマットとして使いながら、その上に文字や画像を設定する方法を紹介します。

 

使用するライブラリ

PDFを作成するライブラリとしてFPDFを使用しようとしたのですが、

FPDFは日本語フォントが使えなかった(ttfファイルがそのまま使えないという理由もある)ため、それらに対応したtFPDFを使用します。

また、FPDF、tFPDFは既存のPDFを読み込めないため、それを拡張するFPDIも使用します。

 

インストール

composerを使用します。

composer require setasign/tfpdf
composer require setasign/fpdi

今回はインストールされた

tfpdf v1.32

fpdi v2.3.4

を使用します。

既存のPDFを用意する

今回はリクルートさんから

履歴書のPDFをダウンロードしてテンプレートとしました。

https://www.r-agent.com/guide/article3151/

 

既存のPDFを読み込む

<?php
use setasign\Fpdi\Tfpdf\Fpdi;
require_once('vendor/autoload.php');

$pdf = new Fpdi('L', 'mm', 'A3');
$pdf->AddPage();
$pdf->setSourceFile('rireki_in.pdf');
$tplId = $pdf->importPage(1);
$pdf->useTemplate($tplId);
$file = __DIR__ . '/test1.pdf';
$pdf->Output('F',  $file);

解説

Fpdiを使用すると、tFPDFの機能を継承して使用できるようになります。

パラメタで横向きの’L’、単位の'mm'、用紙サイズ’A3'を指定しています。

これは履歴書のPDFフォーマットの幅、高さに合わせています。

setSourceFileでPDFファイルを読み込み、ページに対してそのPDFをテンプレートとして指定しています。

Outputで'F'を指定して、新たなファイルとして出力します。

結果

PDFに線を書く

<?php
use setasign\Fpdi\Tfpdf\Fpdi;
require_once('vendor/autoload.php');

$pdf = new Fpdi('L', 'mm', 'A3');	// 420mm 297mm
$pdf->AddPage();
$pdf->setSourceFile('rireki_in.pdf');
$tplId = $pdf->importPage(1);
$pdf->useTemplate($tplId);

for ($x = 20; $x < 420; $x += 20) {
	$pdf->Line($x, 0, $x, 297);
}
for ($y = 20; $y < 297; $y += 20) {
	$pdf->Line(0, $y, 400, $y);
}

$file = __DIR__ . '/test2.pdf';
$pdf->Output('F',  $file);

解説

あまり目的とは関係なさそうですが、Lineで縦横20mmずつ線を引きます。

位置取りをしやすくするためと書き込みテストのためです。

結果

日本語の文字を出力する

<?php
use setasign\Fpdi\Tfpdf\Fpdi;
require_once('vendor/autoload.php');

define('FPDF_FONTPATH', __DIR__ . '/chifonts/');

$pdf = new Fpdi('L', 'mm', 'A3');	// 420mm 297mm
$pdf->AddPage();
$pdf->setSourceFile('rireki_in.pdf');
$tplId = $pdf->importPage(1);
$pdf->useTemplate($tplId);
$pdf->AddFont('ちはやゴシック', '', '', true);
$pdf->SetFont('ちはやゴシック', '', 16);
$pdf->SetXY(45, 40);
$pdf->Write(0, '田井中 太五郎');
$file = __DIR__ . '/test3.pdf';
$pdf->Output('F',  $file);

解説

日本語出力のためにフォントを指定します。

今回は手書き風にするため、

ちはやゴシック

https://welina.xyz/

をダウンロードして置いておきます。

FPDF_FONTPATHに「ちはやゴシック.ttf」へのパスを設定します。

パスはunifontというサブディレクトリが必須となっているため、以下のようなパスになります。

chifonts/unifont/ちはやゴシック.ttf

AddFontでフォントを追加します。4番目の引数にtrueを設定すると、ttfファイルを読み込みます。

SetFontで追加したフォントとフォントサイズを指定します。

SetXYで出力座標、Writeで文字出力です。

結果

〇を付けてみる

<?php
use setasign\Fpdi\Tfpdf\Fpdi;
require_once('vendor/autoload.php');

define('FPDF_FONTPATH', __DIR__ . '/chifonts/');

$pdf = new Fpdi('L', 'mm', 'A3');	// 420mm 297mm
$pdf->AddPage();
$pdf->setSourceFile('rireki_in.pdf');
$tplId = $pdf->importPage(1);
$pdf->useTemplate($tplId);
$pdf->AddFont('ちはやゴシック', '', '', true);
$pdf->SetFont('ちはやゴシック', '', 20);
$pdf->SetXY(119, 53);
$pdf->Write(10, '〇');
$file = __DIR__ . '/test4.pdf';
$pdf->Output('F',  $file);

解説

男女に〇をつけようとしたら、円を書くメソッドがありませんでした。

なので〇という文字で対応しました。

結果

画像を設定する

<?php
use setasign\Fpdi\Tfpdf\Fpdi;
require_once('vendor/autoload.php');
$pdf = new Fpdi('L', 'mm', 'A3');	// 420mm 297mm
$pdf->AddPage();
$pdf->setSourceFile('rireki_in.pdf');
$tplId = $pdf->importPage(1);
$pdf->useTemplate($tplId);
$image = __DIR__ . '/shoumei.png';

$pdf->Image($image , 145, 15, 30, 0, 'PNG');

$file = __DIR__ . '/test5.pdf';
$pdf->Output('F',  $file);

解説

Imageで画像を出力します。

ファイルパスとx, y, w, h, フォーマットを指定しています。

履歴書の画像は幅30mm、高さ40mmなので、幅を30で指定しています。

高さを0にすると、自動でアスペクト比を保ったまま幅に合わせてくれます。

逆に幅0で高さのみを指定しても、同様に高さに合わせてくれるようです。

結果

全部を合わせる

まとめ

本格的に使うならば、もう少し位置決めが楽にできるような方法を使う必要がありますが、サンプルなのでこんな感じにしておきます。

もっと詳しく知りたい場合は公式ドキュメントをどうぞ。

http://www.fpdf.org/

https://github.com/Setasign/tFPDF