如何在PHP中动态向PDF添加表格或二维码(电子签章需求)
问题
我有一份需多轮审批的规则类PDF文件,需要完成两个操作:
- 在指定位置添加二维码作为电子签章;
- 在PDF最后内容之后添加一个包含文本和二维码的无框表格(示例:若PDF最后内容结束于高度200的位置,新内容需置于高度210的位置)。
使用TCPDF时,writeHtml会将生成的HTML置于页面顶部,writeHTMLCell和MultiCell则需要指定具体的x、y坐标;尝试mPDF也遇到同样问题,且mPDF的Overwrite方法仅能覆盖自身生成的内容。
写入HTML前的PHP代码如下:
$pageCount = PDF::setSourceFile($file); $template = PDF::importPage($i); $size = PDF::getTemplateSize($template); PDF::AddPage($size['orientation'], array($size['width'], $size['height'])); PDF::useTemplate($template); // After this, I need to call writeHtml, writeHTMLCell, or MultiCell, but none of those met what I need. // Or placing an image with PDF::Image also need to define the x and y ... // PDF::SetX() // PDF::SetY() // PDF::Image($qrPath, null, null, 12, 12, 'PNG'); // PDF::WriteHTML(view('document-requests.approver.stamp', ['qr' => $qrPath]), true, false, true, false, ''); PDF::Output($file, 'F');
解决方案
针对TCPDF的实现方式
- 定位内容插入位置
导入模板后,若已知原内容结束的Y坐标(比如示例中的200),直接通过SetY()将光标定位到目标位置(如210);若未知坐标,可通过解析原PDF内容边界(或提前记录生成原PDF时的内容高度)来确定插入点。 - 添加指定位置的二维码
明确签章的精确坐标后,设置光标位置再插入图片:// 设置二维码的精确坐标(示例x=100,y=150) PDF::SetX(100); PDF::SetY(150); PDF::Image($qrPath, null, null, 12, 12, 'PNG'); - 在内容末尾添加无框表格
定位到原内容下方后,写入无框表格的HTML:// 定位到原内容下方210的位置 PDF::SetY(210); // 生成无框表格HTML $tableHtml = '<table border="0"><tr><td>审批人:XXX</td><td><img src="' . $qrPath . '" width="12" height="12"></td></tr></table>'; // 写入HTML(已定位光标,不会从顶部开始) PDF::writeHTML($tableHtml, true, false, true, false, '');
针对mPDF的实现方式
mPDF导入外部PDF后无法自动识别内容末尾,需手动定位坐标:
- 导入页面并定位光标:
$mpdf->SetImportUse(); $pageCount = $mpdf->SetSourceFile($file); $template = $mpdf->ImportPage($i); $size = $mpdf->GetTemplateSize($template); $mpdf->AddPage($size['orientation'], [$size['width'], $size['height']]); $mpdf->UseTemplate($template); // 定位到原内容下方210的位置 $mpdf->SetY(210); - 添加二维码和表格:
注意:mPDF的// 添加指定位置的二维码 $mpdf->SetXY(100, 150); $mpdf->Image($qrPath, '', '', 12, 12); // 添加无框表格 $tableHtml = '<table style="border:0;"><tr><td>审批记录:已完成</td><td><img src="' . $qrPath . '" width="12" height="12"></td></tr></table>'; $mpdf->WriteHTML($tableHtml);Overwrite方法仅支持修改自身生成的内容,导入外部PDF后只能通过坐标定位新增内容。
内容的提问来源于stack exchange,提问作者TheArKa
相关产品推荐
相关产品推荐

