徒然

日常を垂れ流します。

PHP FPDI + FPDF でPDFファイルを分割する

タイトルの通りです。お仕事で使ったので、備忘録。

青空文庫から人間失格ー太宰治のPDFを取得し、テストデータとした。

PDFから、最初の3ページ分を抜粋し、新しいPDFとして保存する。

今回使うのは、PHPのPDFの編集用ライブラリとして太古の昔から存在する、FPDIとFPDFである。

PHPで使えるPDFのライブラリはたくさんこと存在する。PDFlib、TCPDF、haru...

今回の選定ポイントは、古いPHP動くこと、その一点に尽きる。

PHP動くようにする(XAMPP、VSCode

今回の記事も長くなりそうである。なぜなら、環境から作る必要があるから。

でも環境構築なら優れた記事はもうたくさんあるので丸投げして任せよう。

ここがいいんじゃないかな

Qiitaーisual Studio Code でPHPを開始するまでの手順

f:id:whzwiz:20200522021333p:plain うむうむ。

ん~、開発用途に一つサーバー借りようかな。VSCodeをリモートで動かしたい。

さて次

FPDI と FPDF のダウンロード

Composerを使ったりとかするんだろうけど、今回はそんな大層なことはしないので愚直にクラスファイルをダウンロードして、htdocsに突っ込むことにする。

ダウンロード

フォルダ構成は以下

f:id:whzwiz:20200522021425p:plain

ソースコード

最小構成ならば、実に簡単にPDFのあれこれができてしまう。

<?php

use setasign\Fpdi\Fpdi;

require_once('fpdf/fpdf.php');         // はじめにFPDF
require_once('fpdi/src/autoload.php'); // 次にFPDIの順で読み込むよ。

// PDFファイルを読み込む
$pdf = new Fpdi();
$pageCount = $pdf->setSourceFile('NingenShikkaku.pdf');

for ($i = 1; $i <= $pageCount; $i++) {        // カウントは1から!(ページ数に相当)
    if ($i <= 3) {
        $templateId = $pdf->importPage($i);   // 該当ページをテンプレートとしてインポート
        $pdf->AddPage();                      // 出力用のページを一つ追加
        $pdf->useTemplate($templateId);       // 出力用のページに、テンプレートを適用する
    }
}

$pdf->Output('result_3pages.pdf', 'F');   // ファイルとしてフォルダ内に書き出し

echo("<h1>Finished.</h1>");               // おわり

動かす

用意したのは青空文庫人間失格をPDF化したもの。47ページ。

f:id:whzwiz:20200522021712p:plain

ブラウザ。まあ見るまでもないわなw

f:id:whzwiz:20200522021529p:plain

生成ファイルは、"result_3pages.pdf"

f:id:whzwiz:20200522021620p:plain

生成されたファイルは3ページになっているが。。。おっと。

f:id:whzwiz:20200522021640p:plain

もとが横長のページだったが、それが反映されず、縦向きの文書として出力された結果である。

$pdf->useTemplate($templateId);

$pdf->useTemplate($templateId, ['adjustPageSize' => true]);

とすればよい。

はいどうぞ

f:id:whzwiz:20200522021739p:plain

感想

師が「PHPはなんか、よくわからんが、何でもできるんだ。気軽にな。」と言っていた。

ようやく気持ちが分かってきた気がする。なんだかわからんが確かにできるんだなぁ。気軽になぁ。