LoginSignup
0
0

【FPDI+TCPDF】PDFファイルの用紙サイズを取得する

Last updated at Posted at 2023-06-29

phpでPDFファイルの用紙サイズを取得したい場面がありました。和文でのソースが見当たらなかったため、備忘録としてまとめます。

【公式ドキュメント】 FPDI Manual

バージョン

今回は以下の環境で動かしています。
この記事では、それぞれがインストール済みであることを前提とします。

  • 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 . ')');
}

なお、上記のコード例における$sizevar_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'); // 保存先のパスを入れないと上手く動きません
}

終わりに

ページサイズを揃えて特定のページだけ切り出したい場面は意外と多いのではないでしょうか?
ほとんど公式ドキュメントの焼き直しですが、参考になれば幸いです。

0
0
0

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
0
0