使用 TCPDF 将现有 PDF 与动态生成的 PDF 合并
Merge existing PDF with dynamically generated PDF using TCPDF
我正在使用 TCPDF 生成 PDF 文档。我的需求是在动态生成的PDF的最后一页合并现有的PDF内容。
TCPDF 仍在开发中:http://www.tcpdf.org/doc/code/classTCPDF__IMPORT.html#a5a9effc936e8fa461c0f6717c2d10d93
如果可能你可以使用 ZEND:
require_once 'Zend/Pdf.php';
$pdf1 = Zend_Pdf::load("1.pdf");
$pdf2 = Zend_Pdf::load("2.pdf");
foreach ($pdf2->pages as $page){
$pdf1->pages[] = $page;
}
$pdf1->save('3.pdf');
如果您 运行 正在 Linux,您还可以 运行 一个 shell 命令。
<?php
exec('pdfjam 1.pdf 2.pdf -o 3.pdf'); // -o = output
您可以从这里安装 pdfjam:http://www2.warwick.ac.uk/fac/sci/statistics/staff/academic/firth/software/pdfjam/pdfjam_latest.tgz
到目前为止,解决您问题的最佳方法是使用 FPDI
.
https://github.com/Setasign/FPDI
它的工作方式是 FPDI
扩展 TCPDF
因此您可以使用您习惯于 [=12] 的所有方法来处理 FPDI
对象=],但需要使用其他方法从现有 PDF 文件导入页面(setSourceFile
、getTemplateSize
和 useTemplate
)。
设置看起来有点令人生畏,但如果您使用 Composer,它实际上非常简单。只需将 setasign/fpdi
和 setasign/fpdi-tcpdf
添加到您的 composer.json
文件,然后使用 FPDI
的实例代替您的 TCPDF
实例。我发现我什至不必像 github 页面上提到的那样调用 class_exists('TCPDF', true)
。一旦我将这些其他条目添加到 composer.json
和 运行 composer dumpautoload
中,它就起作用了。
我试过FPDI的免费版,但不支持PDF 1.5及以上版本
如果其他人正在寻找免费的解决方案,我已经使用了 TCPDI。您可以在 github 上找到它。
我的项目没有使用 composer,所以我使用了 https://github.com/pauln/tcpdi 的 master 分支
如果您使用的是作曲家,您也可以找到一些作曲家的分支。只需在 github.
上搜索 tcpdi
将其添加到项目后,代码非常简单。
这是我的代码片段。我用它来保存隐私政策的副本(静态 pdf),在页脚中包含用户名和协议日期。
// Create new PDF document
$pdf = new TCPDI(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
...
// Add the pages from the source file.
$pagecount = $pdf->setSourceFile($localPrivacy);
for ($i = 1; $i <= $pagecount; $i++) {
$tplidx = $pdf->importPage($i);
$pdf->AddPage();
$pdf->useTemplate($tplidx);
// Add agreement text in document footer
$pdf->SetXY(15,282);
$pdf->Cell(180, 5, "Documento approvato da {$fullName} il {$date}", 0, 0, 'C');
}
// Send PDF on output
$pdf->Output(FOLDER_PATH . DIRECTORY_SEPARATOR . "{$userId}.pdf", 'F');
我正在使用 TCPDF 生成 PDF 文档。我的需求是在动态生成的PDF的最后一页合并现有的PDF内容。
TCPDF 仍在开发中:http://www.tcpdf.org/doc/code/classTCPDF__IMPORT.html#a5a9effc936e8fa461c0f6717c2d10d93
如果可能你可以使用 ZEND:
require_once 'Zend/Pdf.php';
$pdf1 = Zend_Pdf::load("1.pdf");
$pdf2 = Zend_Pdf::load("2.pdf");
foreach ($pdf2->pages as $page){
$pdf1->pages[] = $page;
}
$pdf1->save('3.pdf');
如果您 运行 正在 Linux,您还可以 运行 一个 shell 命令。
<?php
exec('pdfjam 1.pdf 2.pdf -o 3.pdf'); // -o = output
您可以从这里安装 pdfjam:http://www2.warwick.ac.uk/fac/sci/statistics/staff/academic/firth/software/pdfjam/pdfjam_latest.tgz
到目前为止,解决您问题的最佳方法是使用 FPDI
.
https://github.com/Setasign/FPDI
它的工作方式是 FPDI
扩展 TCPDF
因此您可以使用您习惯于 [=12] 的所有方法来处理 FPDI
对象=],但需要使用其他方法从现有 PDF 文件导入页面(setSourceFile
、getTemplateSize
和 useTemplate
)。
设置看起来有点令人生畏,但如果您使用 Composer,它实际上非常简单。只需将 setasign/fpdi
和 setasign/fpdi-tcpdf
添加到您的 composer.json
文件,然后使用 FPDI
的实例代替您的 TCPDF
实例。我发现我什至不必像 github 页面上提到的那样调用 class_exists('TCPDF', true)
。一旦我将这些其他条目添加到 composer.json
和 运行 composer dumpautoload
中,它就起作用了。
我试过FPDI的免费版,但不支持PDF 1.5及以上版本
如果其他人正在寻找免费的解决方案,我已经使用了 TCPDI。您可以在 github 上找到它。
我的项目没有使用 composer,所以我使用了 https://github.com/pauln/tcpdi 的 master 分支 如果您使用的是作曲家,您也可以找到一些作曲家的分支。只需在 github.
上搜索 tcpdi将其添加到项目后,代码非常简单。
这是我的代码片段。我用它来保存隐私政策的副本(静态 pdf),在页脚中包含用户名和协议日期。
// Create new PDF document
$pdf = new TCPDI(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
...
// Add the pages from the source file.
$pagecount = $pdf->setSourceFile($localPrivacy);
for ($i = 1; $i <= $pagecount; $i++) {
$tplidx = $pdf->importPage($i);
$pdf->AddPage();
$pdf->useTemplate($tplidx);
// Add agreement text in document footer
$pdf->SetXY(15,282);
$pdf->Cell(180, 5, "Documento approvato da {$fullName} il {$date}", 0, 0, 'C');
}
// Send PDF on output
$pdf->Output(FOLDER_PATH . DIRECTORY_SEPARATOR . "{$userId}.pdf", 'F');