我试图使用php创建动态pdf,
我可以在提交表单后加载pdf但是当我尝试编辑pdf时无法加载
我缩短了代码以保持直接
PDF结构
Your Name is : <<NAME>>
PHP动态脚本
set_time_limit(180);
//Create Variable Names
$name = $_POST['name'];
function pdf_replace($pattern, $replacement, $string) {
$len = strlen($pattern);
$regexp = '';
for($i = 0; $i <$len; $i++) {
$regexp .= $pattern[$i];
if($i < $len - 1) {
$regexp .= "(\)\-{0,1}[0-9]*\(){0,1}";
}
}
return ereg_replace ($regexp, $replacement, $string);
}
header('Content-Disposition: filename=cert.pdf');
header('Content-type: application/pdf');
//$date = date('F d, Y');
$filename = 'testform.pdf';
$fp = fopen($filename, 'r');
$output = fread($fp, filesize($filename));
fclose($fp);
//Replace the holders
$output = pdf_replace('<<NAME>>', $name, $output);
echo $output;
如果我注释掉输出它会加载表单,但是当我尝试运行该函数来替换它无法加载的占位符时。以前有人这样做过吗?
答案 0 :(得分:0)
我已经尝试过你的代码了,我可以假设有以下原因导致问题:
当您调用pdf_replace()时,PHP会在ereg_replace()函数上返回不推荐的通知。这会破坏PDF结构并导致PDF无法加载。自PHP 5.3.0起,该函数已弃用。简单的解决方案是开始使用preg_replace()。
function pdf_replace($pattern, $replacement, $string) {
return preg_replace('/'.preg_quote($pattern,'/').'/', $replacement, $string);
}
如果你不能这样做,那么解决方案是编辑php.ini文件并编辑error_reporting参数。您可以将“^ E_DEPRECATED”添加到当前配置值以禁用不推荐使用的通知。其他选项是在脚本开头添加error_reporting()并使用适当的值。
我没有看到您使用的PDF,但有些PDF生成器编码PDF源代码。在这种情况下,在那里找到文本是一个问题。例如,我在Mac上尝试过“打印到PDF”功能,但我无法在源代码中找到纯文本。所以无论是fopen还是ereg_replace都会抱怨错误的文件格式。在这种情况下,您应该使用一些可以更巧妙地使用PDF的库。我更喜欢FPDF但是有很多这样的库。
答案 1 :(得分:0)
我是网页设计师,我使用ezPDF创建pdf文件,以便在任何浏览器中生成报告和查看。这是我查找教程的网页:http://www.weberdev.com/get_example.php3?ExampleID=4804
我希望这会有所帮助:)
答案 2 :(得分:0)
您的代码似乎有两个问题。
首先,ereg_replace()
是 DEPRECATED 功能。由于这个PHP脚本抛出错误,错误消息打破了pdf结构。将函数更改为preg_replace(),它应该工作。
其次,我用示例pdf表单尝试了您的代码。似乎ereg_replace()无法处理某些字符。在我使用的pdf格式中,此函数在遇到特定字符 §
后截断字符串(pdf格式数据)。这就是为什么即使你使用 error_reporting(E_ALL ^ E_DEPRECATED);
来抑制错误,
即使这样,代码也无法正常工作。
所以,你最好去 preg_replace();
<?php
set_time_limit(180);
//Create Variable Names
$name = $_POST['name'];
function pdf_replace($pattern, $replacement, $string) {
$len = strlen($pattern);
$regexp = '';
for($i = 0; $i <$len; $i++) {
$regexp .= $pattern[$i];
if($i < $len - 1) {
$regexp .= "(\)\-{0,1}[0-9]*\(){0,1}";
}
}
return preg_replace ($regexp, $replacement, $string);
}
header('Content-Disposition: filename=cert.pdf');
header('Content-type: application/pdf');
//$date = date('F d, Y');
$filename = 'testform.pdf';
$fp = fopen($filename, 'r');
$output = fread($fp, filesize($filename));
//fclose($fp);
//Replace the holders
$output = pdf_replace('<<NAME>>', $name, $output);
echo $output;
?>
答案 3 :(得分:0)
为什么你不使用str_replace? 请检查此代码是否适合您(假设您可以在简单的文本编辑器中看到要替换的单词):
// hide all errors so there will be no errors output which will break your PDF file
error_reporting(0);
ini_set("display_errors", 0);
//Create Variable Names
$name = $_POST['name'];
$filename = 'testform.pdf';
$fp = fopen($filename, 'r');
$output = fread($fp, filesize($filename));
fclose($fp);
//Replace the holders
$output = str_replace('<<NAME>>', $name, $output);
// I added the time just to avoid browser caching of the PDF file
header('Content-Disposition: filename=cert'.time().'.pdf');
header('Content-type: application/pdf');
echo $output;
有许多PHP项目使用PHP生成动态PDF文件,为什么你不使用它们,为什么你使用这个正则表达式?,可能你会有一些设计你会 必须在将来添加到pdf,如表徽标和东西,最简单的方法是将HTML转换为PDF。 如果你正在寻找性能和几乎100%相似的HTML和CSS你应该使用wkhtmltopdf它免费且易于使用它在你的服务器上运行但它不是PHP它是可执行文件,你将不得不执行它来自您的PHP代码。
另一种选择是使用纯PHP而不是之前的可执行文件
我使用了两者并且更喜欢wkhtmltopdf,因为它在HTML和CSS中更快更昂贵
答案 4 :(得分:0)
如果原始PDF文档没有特定要求,则无法替换PDF中的文本字符串。
对此类项目的一些评论:
PDF文档使用字节偏移来允许快速访问文档中的特定对象。通过更改字符串,这些偏移将变为无效,并且PDF文档可能被视为已损坏。
最后,压缩PDF文档中的大多数内容流。所以你要搜索的字符串(可能)在其中一个流中,而不是&#34;可见&#34;。
你看到的字符串&#34;&#34;在呈现PDF之后,不能与PDF源中的相同。 替换/新字符串可能使用在使用的字体中不可用的字符,或者通过单独的编码与其他字符匹配。
还有更多要考虑的事情......