从
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脚本来计算我们要附加图片的元素的位置。