【问题标题】:Merge existing PDF with dynamically generated PDF using TCPDF使用 TCPDF 将现有 PDF 与动态生成的 PDF 合并
【发布时间】:2020-04-16 23:38:30
【问题描述】:

我正在使用 TCPDF 生成 PDF 文档。我的要求是在动态生成的 PDF 的最后一页合并现有的 PDF 内容。

【问题讨论】:

  • 你能分享一些你已经拥有的代码吗?我们可以帮助您更新它。
  • 因此您想将一个 PDF 附加(或在末尾插入)另一个 PDF。我发现这里的“合并”一词具有误导性,您应该考虑更改它。此外:您应该向我们展示您尝试过的代码,但没有成功或部分成功。
  • require_once('../PDFMerger/fpdi/fpdi.php'); $pdfm = 新的 FPDI(); $PDF = 'pdf 路径'; $pageCount = $pdfm->setSourceFile($PDF); for ($i = 1; $i importPage($i,'/MediaBox'); $size = $pdfm->getTemplateSize($tplx); $pdfm->AddPage('P', array($size['w'], $size['h'])); $pdfm->useTemplate($tplx);$pdf->Output($ono.'-'.$fy.".pdf", 'I'); $pdf 是用于创建页面的 TCPDF 对象
  • @T.G 请不要发布更大的代码 sn-ps 作为评论。您可以编辑您的问题并将其添加到那里。

标签: php tcpdf


【解决方案1】:

到目前为止,您的问题的最佳解决方案是使用FPDI

https://github.com/Setasign/FPDI

它的工作方式是FPDI 扩展TCPDF,因此您可以使用您习惯使用TCPDF 的所有方法来处理FPDI 对象,但您可以使用其他方法需要从现有 PDF 文件(setSourceFilegetTemplateSizeuseTemplate)导入页面。

设置起来看起来有点令人生畏,但如果您使用 Composer,它实际上非常容易。只需将setasign/fpdisetasign/fpdi-tcpdf 添加到您的composer.json 文件中,然后使用FPDI 的实例代替您的TCPDF 实例。我发现我什至不必像 github 页面上提到的那样打电话给class_exists('TCPDF', true)。一旦我将这些其他条目添加到composer.json 并运行composer dumpautoload,它就可以工作了。

【讨论】:

  • 请注意:PDF版本> 1.5仅商业插件支持
【解决方案2】:

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

【讨论】:

【解决方案3】:

我尝试过免费版的 FPDI,但不支持 PDF 1.5 或更高版本。

如果其他人正在寻找免费的解决方案,我使用了 TCPDI。你可以在 github 上找到它。

我的项目没有使用composer,所以我使用了https://github.com/pauln/tcpdi的master分支 如果你正在使用 composer,你也可以为 composer 找到一些 fork。在 github 上搜索 tcpdi 即可。

将其添加到项目后,代码就非常简单了。

这是我的代码中的一个 sn-p。我用它来保存隐私政策的副本(静态 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');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    相关资源
    最近更新 更多