PHP创建动态pdf

时间:2014-08-06 19:47:38

标签: php pdf

我试图使用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;

如果我注释掉输出它会加载表单,但是当我尝试运行该函数来替换它无法加载的占位符时。以前有人这样做过吗?

5 个答案:

答案 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代码。

http://wkhtmltopdf.org/

另一种选择是使用纯PHP而不是之前的可执行文件

http://www.tcpdf.org/

我使用了两者并且更喜欢wkhtmltopdf,因为它在HTML和CSS中更快更昂贵

答案 4 :(得分:0)

如果原始PDF文档没有特定要求,则无法替换PDF中的文本字符串。

对此类项目的一些评论:

PDF文档使用字节偏移来允许快速访问文档中的特定对象。通过更改字符串,这些偏移将变为无效,并且PDF文档可能被视为已损坏。

最后,压缩PDF文档中的大多数内容流。所以你要搜索的字符串(可能)在其中一个流中,而不是&#34;可见&#34;。

你看到的字符串&#34;&#34;在呈现PDF之后,不能与PDF源中的相同。 替换/新字符串可能使用在使用的字体中不可用的字符,或者通过单独的编码与其他字符匹配。

还有更多要考虑的事情......