前言
最近遇到了需要把多个PDF文件合并成一个PDF文件、把PNG格式的图片合并生成一个新的PDF文件的需求。
解决办法是采用Fpdi类库来实现。
* composer命令安装:composer require setasign/fpdf
* composer命令安装:composer require setasign/fpdi
<?php
//档案管理中的公用方法
//引入加载PDF合成多个PDF的扩展
vendor('setasign.fpdi.autoload');
use setasign\Fpdi\Fpdi;
/**
* 拼接多个PDF
* @param [type] $pdf_road_datas 需要合并的PDF文件的绝对路径地址一维数组,['F:\02.01.12.pdf','F:\18.44.01.pdf']
* @param [type] $local_path 合成以后生成的PDF文件到指定的路径+文件名,"F:\merge.pdf"
* @return void
*/
function selectionSplicingToNewPdf($pdf_road_datas, $local_path)
{
//实例化模型类
$pdf = new Fpdi();
//合并PDF
for ($i = 0; $i < count($pdf_road_datas); $i++) {
$page_count = $pdf->setSourceFile($pdf_road_datas[$i]);
for ($pageNo = 1; $pageNo <= $page_count; $pageNo++) {
//一页一页的读取PDF,添加到新的PDF
$templateId = $pdf->importPage($pageNo);
$size = $pdf->getTemplateSize($templateId);
$pdf->AddPage($size['orientation'], $size);
$pdf->useTemplate($templateId);
$pdf->SetFont('Helvetica');
$pdf->SetXY(5, 5);
}
}
//方法F,保存合并以后的PDF文件到指定的目录
$pdf->output("F", $local_path);
}
/**
* 先转换PDF为PNG图片,然后合并成PDF文件
* @param [type] $pdf_road_datas 需要合并的PDF文件的绝对路径地址一维数组,['F:\02.01.12.pdf','F:\18.44.01.pdf']
* @param [type] $png_path 生成图片的地址 "F:/"
* @param [type] $local_path 合成以后生成的PDF文件到指定的路径+文件名,"F:\merge.pdf"
* @return void
*/
function selectionPngToNewPdf($pdf_road_datas, $png_path, $local_path)
{
//实例化模型类
$pdf = new Fpdi();
foreach ($pdf_road_datas as $row) {
$pages = getPageTotal($row);
foreach (range(0, intval($pages) - 1) as $page) {
$img = pdf2png($row, $png_path, $page);
$pdf->AddPage();
$pdf->Image($img, 0, 0, 210, 297);
}
}
//方法F,保存合并以后的PDF文件到指定的目录
$pdf->output("F", $local_path);
}
/**
* 获取PDF文件的页数
* @param [type] $path 文件的绝对路径地址
* @return void
*/
function getPageTotal($path)
{
//打开文件
if (!$fp = @fopen($path, 'r')) {
return json(['code' => -1, 'msg' => '文件打开失败']);
} else {
//初始化参数
$max = 0;
while (!feof($fp)) {
$line = fgets($fp, 255);
if (preg_match("/\/Count [0-9]+/", $line, $matches)) {
preg_match("/[0-9]+/", $matches[0], $matches2);
if ($max < $matches2[0]) {
$max = $matches2[0];
}
}
}
fclose($fp);
//返回页数
return $max;
}
}
/**
* pdf文件转png图片
* @param [type] $pdf PDF文件绝对路径地址
* @param [type] $path 保存PNG图片地址
* @param integer $page PDF的页数
* @return void
*/
function pdf2png($pdf, $path, $page = 0)
{
try {
$im = new Imagick();
$im->setResolution(120, 120); //设置图像分辨率
$im->setCompressionQuality(100); //压缩比
$im->readImage($pdf . "[" . $page . "]"); //设置读取pdf的第一页
//$im->thumbnailImage(200, 100, true);//改变图像的大小
//$im->scaleImage(200,100,true);//缩放大小图像
$filename = $path . "/" . md5(time()) . '.png';
if ($im->writeImage($filename) == true) {
$Return = $filename;
}
return $Return;
} catch (PDOException $e) {
return ['code' => -1, 'msg' => '数据处理失败'];
}
}
附上windows10环境下安装Imagick扩展的方法。
https://blog.youkuaiyun.com/WHROC21/article/details/105330023