如何在 PHP 中拼合带有预填表单域的 PDF?

问题描述 投票:0回答:1

我需要在使用 PHP 将预填写的 PDF 表单发送到外部签名服务之前将其展平。我试过使用 php-pdftk 库 (https://github.com/mikehaertl/php-pdftk),但它对我不起作用。

这是我试过的代码:

<?php

require __DIR__ . '/vendor/autoload.php';

use mikehaertl\pdftk\Pdf;

($pdf = new Pdf('/app/pdf-prefilled.pdf'))->flatten()->saveAs('/app/pdf-flat.pdf');

echo $pdf->getError();

这会导致以下错误:

Unhandled Java Exception in create_output():
java.lang.ClassCastException: class pdftk.com.lowagie.text.pdf.PdfString cannot be cast to class pdftk.com.lowagie.text.pdf.PdfDictionary (pdftk.com.lowagie.text.pdf.PdfString and pdftk.com.lowagie.text.pdf.PdfDictionary are in unnamed module of loader 'app')
        at pdftk.com.lowagie.text.pdf.PdfStamperImp.flatFields(PdfStamperImp.java:738)
        at pdftk.com.lowagie.text.pdf.PdfStamperImp.close(PdfStamperImp.java:163)
        at pdftk.com.lowagie.text.pdf.PdfStamperImp.close(PdfStamperImp.java:304)
        at com.gitlab.pdftk_java.filter.create_output_filter(filter.java:424)
        at com.gitlab.pdftk_java.TK_Session.create_output(TK_Session.java:1445)
        at com.gitlab.pdftk_java.pdftk.main_noexit(pdftk.java:192)
        at com.gitlab.pdftk_java.pdftk.main(pdftk.java:163)
There was a problem with pdftk-java. Please report it at
https://gitlab.com/pdftk-java/pdftk/issues
including the message above, the version of pdftk-java (3.2.2), and if possible steps to reproduce the error.Xdebug: [Step Debug] Time-out connecting to debugging clien

我还尝试使用 tcpdi 库 (https://github.com/kulbakin/tcpdi),它成功地展平了 PDF 但不保留预填充的数据。不幸的是,它还不支持解析表单字段。

<?php

use TCPDI;

$pdf = new TCPDI();
$pagecount = $pdf->setSourceData($data);
for ($i = 1; $i <= $pagecount; $i++) {
    $tplidx = $pdf->importPage($i);
    $pdf->setPrintHeader(false);
    $pdf->setPrintFooter(false);
    $pdf->AddPage();
    $pdf->importAnnotations($i);
    $pdf->useTemplate($tplidx);
}
$data = $pdf->Output('', 'S');

在保留预填数据的同时,还有其他方法可以在 PHP 中展平预填的 PDF 表单吗?任何帮助将不胜感激

php pdf pdftk php-pdftk flatten-pdf
1个回答
1
投票

FPDF
PHP 库,用于使用预填表单字段拼合 PDF。

setasign/fpdi

下载:

composer require setasign/fpdi

例子:

<?php
// After include FPDF library

// Load the PDF file
$pdf = new FPDI();
$pdf->AddPage();
// Set source
$pdf->setSourceFile('path/to/your/pdf.pdf');
$template = $pdf->importPage(1);
$pdf->useTemplate($template);

// Flatten the form fields
$pdf->flattenFields();

// Output the flattened PDF
$pdf->Output('path/to/output.pdf', 'F');
?>

您可以使用

flattenFields()
方法来展平PDF 中的表单域。输出是不可编辑的表单字段。填写的数据将在文档中可见。

资源:

  1. setasign/fpdi-https://packagist.org/packages/setasign/fpdi
  2. setasign/setafpdf-https://packagist.org/packages/setasign/setafpdf
© www.soinside.com 2019 - 2024. All rights reserved.