寻求通过php将表单数据馈送到pdf文档的更高效、更可靠的方法

寻求通过php将表单数据馈送到pdf文档的更高效、更可靠的方法,php,pdf,Php,Pdf,从2005年左右开始的几年里,我一直在寻找一种使用php填充现有pdf文档的方法,因为在php中从头开始重新绘制现有pdf,使其具有与现有pdf完全相同的外观是一项heluva任务,尤其是在涉及不断变化的联邦BK文档时 经过一次永恒的搜索,我在2008年发现了这段代码,它“有效”,但不可靠,因为它可能无法“找到”fdf文件(必须将其放入等待的pdf中),因此用户必须尝试几次,fdf加载到浏览器缓存中,最终触发: $tstamp = date('mdYHis'); $test1 = mysql_

从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);
  } 
$tstamp=date('mdYHis');
$test1=mysql\u real\u escape\u字符串($\u POST['test1']);
$test2=mysql\u real\u escape\u字符串($\u POST['test2']);
$fdf=dirname(uuu文件)'/doc_test/'.$tstamp..fdf';
如果(文件_存在($fdf)){unlink($fdf);}
需要一次“createFDF_doc_test.php”;
$pdf\u文件\u文档\u测试=$link'/表格/doc_test.pdf';
//允许根据分钟数创建多达25个不同的文件
$min=日期('i')%25;
$fdf_file_dt=dirname(_file__)。“/doc_test/”.$tstamp..fdf';
如果(isset($_POST['test1'])){
$_POST['test1']=$_POST['test1'];
//获取FDF文件内容
$fdf_doc_test=createFDF_doc_test($pdf_file_doc_test,$\u POST);
//创建一个文件供以后使用
如果($fp=fopen($fdf\u file\u dt,'w')){
fwrite($fp,$fdf_doc_test,strlen($fdf_doc_test));
$CREATED=TRUE;
}否则{
echo“无法创建文件:”。$fdf_file_dt。“

”; $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-1.2
%âãÏÓ
10 obj
>> 
endobj
拖车
>
%%EOF

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

我们一直在重建模板引擎,以便根据用户提供的模板生成报告。 在搜索web解决方案后,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脚本来计算我们想要附加图片的元素的位置。

你是在寻找免费的还是付费的解决方案?