前言
最近遇到了需要把多个PDF文件合并成一个PDF文件、把PNG格式的图片合并生成一个新的PDF文件的需求。
解决办法是采用Fpdi类库来实现。
* composer命令安装:composer require setasign/fpdf
* composer命令安装:composer require setasign/fpdi
<?php
vendor('setasign.fpdi.autoload');
use setasign\Fpdi\Fpdi;
function selectionSplicingToNewPdf($pdf_road_datas, $local_path)
{
$pdf = new Fpdi();
for ($i = 0; $i < count($pdf_road_datas); $i++) {
$page_count = $pdf->setSourceFile($pdf_road_datas[$i]);
for ($pageNo = 1; $pageNo <= $page_count; $pageNo++) {
$templateId = $pdf->importPage($pageNo);
$size = $pdf->getTemplateSize($templateId);
$pdf->AddPage($size['orientation'], $size);
$pdf->useTemplate($templateId);
$pdf->SetFont('Helvetica');
$pdf->SetXY(5, 5);
}
}
$pdf->output("F", $local_path);
}
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);
}
}
$pdf->output("F", $local_path);
}
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;
}
}
function pdf2png($pdf, $path, $page = 0)
{
try {
$im = new Imagick();
$im->setResolution(120, 120);
$im->setCompressionQuality(100);
$im->readImage($pdf . "[" . $page . "]");
$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.csdn.net/WHROC21/article/details/105330023