寻求一种更有效、更可靠的方式来通过 php 将表单数据输入 pdf 文档


Seeking a more efficient and reliable way to feed form data into a pdf doc via php

2005 年开始的几年左右,我一直在寻找一种使用 php 填充预先存在的 pdf 文档的方法,因为在 php 中从头开始重绘现有 pdf 以获得与现有 PDF 完全相同的外观是一项 heluva 任务,尤其是在不断变化的联邦 BK 文档方面。

经过永恒的搜索,我在 2008 年找到了这段代码,它"有效",但不可靠,从某种意义上说,它可能无法"找到"fdf 文件(必须将其放入等待的 pdf 中),因此用户必须尝试几次,fdf 加载到浏览器缓存中,最后触发:

$tstamp = date('mdYHis');
$test1 = mysql_real_escape_string($_POST['test1']);
$test2 = mysql_real_escape_string($_POST['test2']);
$fdf=dirname(__FILE__).'/doc_test/'.$tstamp.'.fdf';
if (file_exists($fdf)) {unlink($fdf);} 
require_once 'createFDF_doc_test.php';
$pdf_file_doc_test=$link. '/forms/doc_test.pdf';
// allow for up to 25 different files to be created, based on the minute
$min=date('i') % 25;
$fdf_file_dt=dirname(__FILE__).'/doc_test/'.$tstamp.'.fdf';
if(isset($_POST['test1'])){
    $_POST['test1']=$_POST['test1'];
    // get the FDF file contents
    $fdf_doc_test=createFDF_doc_test($pdf_file_doc_test,$_POST);
    // Create a file for later use
    if($fp=fopen($fdf_file_dt,'w')){
        fwrite($fp,$fdf_doc_test,strlen($fdf_doc_test));
        $CREATED=TRUE;
    }else{
        echo 'Unable to create file: '.$fdf_file_dt.'<br><br>';
        $CREATED=FALSE;
    }
    fclose($fp);
  } 

以下是createFDF_doc_test.php的内容:

<?php
function createFDF_doc_test($file,$info){
    $data="%FDF-1.2'n%âãÏÓ'n1 0 obj'n<< 'n/FDF << /Fields [ ";
    foreach($info as $field => $val){
        if(is_array($val)){
            $data.='<</T('.$field.')/V[';
            foreach($val as $opt)
                $data.='('.trim($opt).')';
            $data.=']>>';
        }else{
            $data.='<</T('.$field.')/V('.trim($val).')>>';
        }
   }
    $data.="] 'n/F (".$file.") /ID [ <".md5(time()).">'n] >>".
        " 'n>> 'nendobj'ntrailer'n".
        "<<'n/Root 1 0 R 'n'n>>'n%%EOF'n";
    return $data;
}
?>

所有这些所做的是创建一个 fdf 文件并将其存储在服务器上的文件夹中。html表单中的字段名称与pdf匹配,fdf充当两者之间的管道。

fdf 的内容(始终成功保存到服务器)将如下所示:

%FDF-1.2 
%âãÏÓ
1 0 obj
<< 
/FDF << /Fields [ <</T(test1)/V(Test)>><</T(test2)/V(Complete)>>] 
/F (http://example.com/forms/doc_test.pdf) /ID [ <5d721ab873727ae4de3ebd21859bbc60>
] >> 
>> 
endobj
trailer
<<
/Root 1 0 R 
>>
%%EOF

问题是 fdf 和 pdf 之间的"联姻"通常不会因为某些浏览器问题或调用 fdf 的时间或其他原因而触发。无论哪种方式,代码都是旧的,我希望有人知道一个更好,更高效的代码,可以通过php快速,无错误地将html表单数据移动到等待的pdf文档中。我已经使用上述内容8年了,我已经厌倦了。

我们一直在重建模板引擎,以便根据用户提供的模板生成报告。在网络上搜索解决方案后,pdftk + https://github.com/mikehaertl/php-pdftk 的组合上升为最佳解决方案。

它有一个非常简单的界面,可以使用php数组填充pdf表单,也具有良好的UTF8支持。

如文档所示,最简单的用例是:

use mikehaertl'pdftk'Pdf;
// Fill form with data array
$pdf = new Pdf('form.pdf');
$pdf->fillForm(array('name'=>'ÄÜÖ äüö мирано čárka'))
    ->needAppearances()
    ->saveAs('filled.pdf');
// Fill form from FDF
$pdf = new Pdf('form.pdf');
$pdf->fillForm('data.fdf')
    ->saveAs('filled.pdf');

我知道这对当前的问题没有帮助,但相信这将提供更易于维护的代码。

但是,如果您想嵌入图片,真正的乐趣就开始了,我们不得不求助于辅助python脚本来计算我们要附加图片的元素的位置。