Scribble at 2025-03-31 17:24:04 Last modified: 2025-04-02 07:52:49
<?php
use setasign\Fpdi\Fpdi;
require_once( './_ext/fpdi/autoload.php' );
require( './_ext/fpdf/fpdf.php' );
$SRCDIR = 'D:/sources/';
$DSTDIR = 'D:/results/';
$files = array();
$dir = scandir( $SRCDIR, SCANDIR_SORT_DESCENDING );
sort( $dir );
foreach( $dir as $key => $value )
{
$pdfs = array();
if ( $value != '.' AND $value != '..' )
{
$files = scandir( $SRCDIR . $value, SCANDIR_SORT_DESCENDING );
sort( $files );
$page = 1;
mkdir( $DSTDIR . $value );
foreach( $files as $file )
{
if ( $file != '.' AND $file != '..' )
{
if ( ! file_exists( $SRCDIR . $value . '/' . $file ) )
{
continue;
}
else
{
$pdf = new FPDF( 'P', 'mm', 'A4' );
$pdf->AddPage( 'P', 'A4', 0 );
$pdf->Image( $SRCDIR . $value . '/' . $file, 0, 0, 210, 297 );
$pdf->Output( 'F', $DSTDIR . $value . '/' . sprintf( "%04d", $page ) . '.pdf' );
$pdf->close();
$pdfs[] = $DSTDIR . $value. '/' . sprintf( "%04d", $page ) . '.pdf';
$page++;
}
}
}
$fpdi = new Fpdi();
foreach ( $pdfs as $p )
{
$cnt = $fpdi->setSourceFile( $p );
for ( $i = 1; $i <= $cnt; $i++ )
{
$tpl = $fpdi->importPage( $i );
$fpdi->AddPage();
$fpdi->useTemplate( $tpl, [ 'adjustPageSize' => true ] );
}
}
$fpdi->Output( $DSTDIR . $value . '.pdf', "F" );
}
}
画像が入っているフォルダを一つの単位として PDF にまとめる処理というのは、Adobe Acrobat では簡単にできない。Adobe のクラウドを使えばいいなどと馬鹿げたことを書いているブログ記事があるけれど、プライベートな写真や企業の資産として格納してある画像などを、なんで他人が運営するクラウドに預けて処理しなくてはいけないのか。あんな連中、Node.js でスパイ活動してるくらいだから、絶対に他人のアップロードした画像を覗き見したり盗むに決まってるだろう。そんなデタラメとしか言いようがないコーディング事例なんて誰が採用するか。
ということで、ローカルの環境で画像をフォルダごとに PDF へまとめるコードを上に紹介する。先の落書きでも書いたように、僕は ImageMagick が大嫌いなので、GD を裏で利用している FPDF というライブラリを使っている。ただし、FPDF は PDF をマージできないので、それは FPDI という別のライブラリを使った。実際に動かしてみると分かるが、意外に処理は速い。