読者です 読者をやめる 読者になる 読者になる

FPDFを使ってPDFにページ番号を振る

某アプリケーションのページ番号を振る機能が貧弱だったので、PHP で PDF ファイルを出力するライブラリ FPDF を使って作ってみた。
もとからある PDF を取り込む場合は FPDI というライブラリを使う。
バージョンはそれぞれ FPDF 1.6, FPDI 1.4.2 を使う。(FPDF 1.7 はフォントが見つからないと言われて動かない)

<?php
define('FPDF_FONTPATH', dirname(__FILE__) . '/fpdf/font/');
require 'fpdf/fpdi.php';

// ページ番号からページ番号の文字列を生成する関数
// 1 => i, 2 => ii, 3 => iii など
$numberingFunction = 'romanNumeral';

$pdf =& new FPDI();

// SetXY() で座標を指定するときに影響を受けるのでゼロ
// 改ページしないようにする
$pdf->SetMargins(0, 0, 0);
$pdf->SetAutoPageBreak(false);

$pagecount = $pdf->setSourceFile($argv[1]);
$start = isset($argv[2]) ? $argv[2] : 1; // 開始ページ番号

// 各ページを読み込んでページ番号を付けていく
for ($i = 1; $i <= $pagecount; $i++) {
	$tplidx = $pdf->importPage($i, '/MediaBox');
	
	$pdf->addPage();
	$pdf->useTemplate($tplidx);
	
	$pdf->SetFont('Times', '', 10);
	$pdf->SetTextColor(0, 0, 0);
	
	$pageNum = $numberingFunction($start + $i - 1);
	// 座標は [mm] で指定する。用紙がA4であることを想定
	$x = (210 - $pdf->GetStringWidth($pageNum)) / 2;
	$y = 297 - 20;
	$pdf->SetXY($x, $y);
	
	// 第1引数は行の高さ [pt]
	$pdf->Write(10, $pageNum);
}

$pdf->Output('a.pdf', 'F');

使用例

% php addpagenumber.php input.pdf