phpでPDFファイルの用紙サイズを取得したい場面がありました。和文でのソースが見当たらなかったため、備忘録としてまとめます。
バージョン
今回は以下の環境で動かしています。
この記事では、それぞれがインストール済みであることを前提とします。
- tecnickcom/tcpdf 6.6.2
- setasign/fpdi v2.3.7
- setasign/fpdi-tcpdf v2.3.0
- PHP 8.0.29
サイズを取得する
サーバー上にあるPDFファイルの用紙サイズは、以下で取得できます。
wに用紙サイズの横幅が、hに縦幅がそれぞれmm単位で格納されます。
require (__DIR__ . '/vendor/autoload.php'); // composerを使用している前提
function getSizeOfPdf(){
$pdf = new setasign\Fpdi\Tcpdf\Fpdi(); // 適宜編集してください
$pdf->setSourceFile('/Path/To/PDF/File.pdf'); // サイズを取得したいPDFファイルへのパスを記載
$tpl = $pdf->importPage(1);
$size = $pdf->getTemplateSize($tpl);
$w = $size['width'];
$h = $size['height'];
echo('(width, height)=(' . $w . ', ' . $h . ')');
}
なお、上記のコード例における$size
をvar_dump
すると以下のようになっています。
array(5) {
["width"]=> float(160)
["height"]=> float(207)
[0]=> float(160)
[1]=> float(207)
["orientation"]=> string(1) "P" }
$size['width']
と$size['height']
に加え、$size[0]
に横幅が、$size[1]
に縦幅がそれぞれ格納されています。上記の例では横幅16.0cm、縦幅20.7cmです。
$size['orientation']
は用紙のタイプです。'L'なら横長(Landscape)、'P'なら縦長(Portrait)です。
特定のファイルと同じサイズでページを作る
サーバー上に存在するPDFファイルから、一部のページを切り出した新しいPDFファイルを作ることを考えます。このとき、単純にnew \Fpdi
しただけではファイルサイズが同じになるとは限りません。場合によってはコピー元のPDFファイルがはみ出たり、反対にページ内に余分な空白が生まれてしまう場合があります。
記事の前半で載せたコードを応用して、「サーバー上のPDFファイルから一部のページを切り出し、用紙サイズを揃えて別のPDFに読みこむ」という処理は以下で実現できます。
require (__DIR__ . '/vendor/autoload.php'); // composerを使用している前提
function extractPageFromPdf(){
$pdf = new setasign\Fpdi\Tcpdf\Fpdi(); // 適宜編集してください
$pdf->setSourceFile('/Path/To/PDF/File.pdf'); // サイズを取得したいPDFファイルへのパスを記載
$tpl = $pdf->importPage(1);
$size = $pdf->getTemplateSize($tpl);
$w = $size['width'];
$h = $size['height'];
$pdf = new setasign\Fpdi\Tcpdf\Fpdi('P', 'mm', array($w, $h));
$pdf->AddPage();
$pdf->setSourceFile('/Path/To/PDF/File.pdf');
$tpl = $pdf->importPage(1);
$pdf->useTemplate($tpl, 0, 0, $w, $h);
$pdf->Output('/Path/To/New/PDF/File.pdf', 'F'); // 保存先のパスを入れないと上手く動きません
}
終わりに
ページサイズを揃えて特定のページだけ切り出したい場面は意外と多いのではないでしょうか?
ほとんど公式ドキュメントの焼き直しですが、参考になれば幸いです。