使用TCPDF创建大型PDF的最有效方法是什么?

时间:2011-12-01 13:57:41

标签: php pdf pdf-generation tcpdf

我正在努力使用TCPDF实现报告生成解决方案。我的一些报告很小(2-3页),但用户可以选择一次选择多个报告,并请求所有报告。

目前,我生成一个包含所有报告的PDF,每个报告从一个新页面开始,并使用页面分组,以便为​​每个报告重新开始页码编号。当它工作时,它工作得很好,但是在我选择了太多报告之后,代码就会生成,我最终会得到一个空的PDF。

更新:我应该提到,创建单个PDF是客户端的要求。他们希望拥有一个PDF目录,以便在选择了许多报告时在单个PDF中轻松切换报告。

我的问题是:

  1. 制作此PDF的最有效方法是什么,而不用空白PDF?我似乎无法找到TCPDF可以处理的大小是否有限制。

  2. 我应该在PHP中使用ob_start()还是正在构建一个大字符串,因为我做得好吗?

  3. 我的报告原来是HTML,所以我发送的是TCPDF。但是,如果我使用其他方法输出信息(例如Cell,MultiCell等),TCPDF的性能会更好吗?

  4. 这是我输出PDF的代码。 $ pdf对象是根据库中包含的相关TCPDF示例设置的:

    foreach ($students_info as $student_info) {
        $info = $student_info->fetch_object();  // get query result object
    
        // put in the student information
        $pdf->set_student_info($info->lastName, $info->firstName, $info->rank, $info->idNum);
    
        $pdf->startPageGroup(); // start a page group to handle paging for multiple students
        $pdf->AddPage();        // add a page
    
        $html = "<style>";
        $html .= file_get_contents(/*some style sheet*/);
        $html .= file_get_contents(/*some other style sheet*/);
        $html .= "</style>";
    
        $html .= start_report_div($i);
        $html .= '<table class="report_table">'.                    
                 '<tbody>'.
                 '<tr><td>';
        $html .= display_report_title($report);
        $html .= display_student_info($db, $info);
        $html .= display_academic_comments_body($db, $info->studentID, $info->sessionID);
        $html .= display_signature_block($report);
        $html .= '</td></tr>'.
                 '</tbody>'.                    
                 '</table>';
        $html .= end_report_div();
    
        $pdf->writeHTML($html, // the content
                true,              // put a newline after text
                false,             // paint background, false = transparent
                true,              // reset last cell height
                false,             // add left padding
                ''                 // align
        );
        $html = '';       // reset for next student
        $pdf->lastPage(); // pointer to last page in case we are doing more than one student
    }
    

2 个答案:

答案 0 :(得分:4)

我在使用大文件和TCPDF时遇到了麻烦。我从TCPDF切换到mPDF。该项目基于FPDF和HTML2PDF,使用HTML解析速度更快。

e.g。 TCPDF花了大约70到80秒的文章详细概述(150页有图片,链接和一些东西)。

相同的HTML代码和刚刚用mPDF类替换的相同PHP脚本和函数只需6到8秒即可创建相同的PDF。

答案 1 :(得分:3)

回答问题1:

嗯,这是由于我对PHP经验不足造成的另一个问题。空白PDF是由PHP的默认max_execution_time设置为30秒产生的。我使用ini_set为PDF生成脚本将值设置为300,并且我的报告已完整生成。

对于16页PDF,生成需要1分30秒。对于拥有更多TCPDF经验的人来说,这似乎有点长吗?

回答问题3:

我做了一些实验,使用TCPDF中的直接PDF函数生成PDF肯定比将HTML和CSS传递给TCPDF然后让它创建PDF更快。有道理,但仍然很高兴看到实际的性能差异。因此,尽管为PDF调用创建布局很繁琐,但如果您有大型PDF,性能提升可能是值得的。

问题2:

我仍然会感谢更有经验的PHP用户对ob_start的使用。