【问题标题】:What is the most efficient way to create large PDFs with TCPDF?使用 TCPDF 创建大型 PDF 的最有效方法是什么?
【发布时间】:2012-01-10 15:58:42
【问题描述】:

我正在使用 TCPDF 实施报告生成解决方案。我的一些报告很小(2-3 页),但用户可以选择一次选择多个报告,然后全部请求。

目前我生成一个包含所有报告的 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
}

【问题讨论】:

  • 我会生成很多小报告并生成一个 ZIP 文件供用户下载,其中包含所有 PDF 文件。
  • 有效的想法,但不是客户想要的。他们希望在一个文档中包含 PDF 目录中的报告,以便他们轻松地从报告切换到报告(学生信息到学生信息)。
  • 为什么投反对票?我讨厌没有评论就投反对票。
  • 我也是。这就是为什么我 +1 让你否定它。
  • @Truth 谢谢。我根据要求更新了内容,希望避免混淆。我已经对此进行了研究,并且我的代码是一个好的开始,所以我不确定为什么有人会拒绝投票。我只有在遇到困难并觉得自己已经用尽其他选择后才来到这里。

标签: php pdf pdf-generation tcpdf


【解决方案1】:

问题 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 的使用提供意见。

【讨论】:

  • @问题 2:您根本不需要使用 ob_start()。如果您想在单个请求中下载生成的 PDF 文件,它只是防止损坏二进制流(标题)。如果您在生成 PDF 时不小心遗漏了一些空格,那么您在尝试下载“无法修改标题,输出已在 .. 中开始”时可能会出错。函数 ob_start() .. ob_get_clean() 可能有助于丢弃此类不需要的输出并启用正确设置的标头。您可以在 PDF 生成开始之前启动 ob_start(),在下载 PDF 文件之前启动 ob_get_clean()。
【解决方案2】:

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

例如TCPDF 花了大约 70 到 80 秒进行文章详细概述(150 页的图片、链接和一些东西)。

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

【讨论】:

    猜你喜欢
    • 2017-08-06
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    相关资源
    最近更新 更多