2011-12-01 56 views
4

我正在通过使用TCPDF实现报表生成解决方案。我的一些报告很小(2-3页),但用户可以选择一次选择多个报告,并请求全部报告。使用TCPDF创建大型PDF的最有效方法是什么?

目前,我生成一个包含所有报告的PDF,每个报告都在新页面上开始,并使用页面分组,因此每个报告都重新启动页码。当它工作的时候,它工作的很好,但是当我选择了太多的报告之后,代码就消失了,最终我得到了一个空的PDF。

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

我的问题是:

  1. 什么是产生这个PDF,而不与空白的PDF结束了最有效的方法是什么?我似乎无法找到TCPDF可以处理的大小是否有限制。

  2. 我应该在PHP中使用ob_start()还是在建立一个大字符串,因为我没有问题?

  3. 我的报告最初是HTML,因此我正在发送该TCPDF。但是,如果我使用其他方法输出信息(如Cell,MultiCell等),TCPDF的性能会更好吗?

这是我输出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 
} 
+0

我会生成很多小报告并生成一个ZIP文件供用户下载,其中包含所有PDF文件。 –

+0

有效的想法,但不是客户想要的。他们希望将报告放在一份PDF中的目录中,以便他们轻松地从报告切换到报告(学生信息到学生信息)。 –

+0

为什么downvote?我讨厌downvote没有评论。 –

回答

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的。

+0

@问题2:根本不需要使用ob_start()。这只是一种防止破坏二进制流(标题)的情况,以防您希望在单个请求中下载生成的PDF文件。如果您在生成PDF时不小心遗漏了一些空格,那么当您尝试下载“无法修改标题,输出已经以..开头”时可能会出错。函数ob_start().. ob_get_clean()对于放弃这些不需要的输出并启用正确设置的标题可能是辅助的。您可以在PDF生成开始之前启动ob_start(),并在下载PDF文件之前启动ob_get_clean()。 – lubosdz

4

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

例如TCPDF花费了大约70到80秒的篇幅 - 详细概述(包含150页图片,链接和一些内容)。

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

+0

此信息非常有用,谢谢。 –

相关问题