【发布时间】:2013-09-20 22:30:06
【问题描述】:
我有一个在线日记/日记网站,用户通过 PHP 和 MYSQLi 将他们的日记条目保存到我的数据库中。
我想添加一个功能,用户可以通过单击菜单链接将所有条目保存到 PDF 文件中。
最好的方法是什么?我研究过 DOMPDF,它看起来很容易而且很有希望,但是让它工作需要几天时间,我准备好看看其他解决方案。
也许有很多解决方案,我不想花 3 天时间来找出答案,这不适合我,所以我问那些做过类似事情的人,什么对你有用。
更新 我能够让 dompdf 工作,它相当容易并且工作得很好。我遇到的问题是,如果它尝试渲染大量 HTML,它会崩溃。似乎是代码的内存问题(谷歌共识)。例如。我的数据库有 603 条记录,每条记录只有大约 2 段文本。对我来说,从 MYSQL DB 方面来看,这不是我认为的 LARGE。
我不得不将最大超时设置增加到 320 秒,这样我才能让它读取大约 400 条记录而不会导致 Apache 崩溃。我将 LIMIT 400 添加到我的 SQL 语句中,这将需要大约 300 秒并显示 PDF 文件(太长而不合理)。如果我将 LIMIT 增加到 450,它会使 apache 崩溃。和 Apacher 错误与错误的内存覆盖等有关。所以它工作得很好,对我来说,直到返回 400 条记录,在渲染阶段,它会很慢并且在大约 450 条记录时崩溃。
我搜索了一下,发现很多人都有类似的问题。这似乎是 DOMPDF 会知道并在他们的常见问题解答或修复中提到的东西,但他们没有。因此,尽管我仍然喜欢 PDF 选项。我选择简单地允许用户将数据保存为文本文件。这是非常简单的 PHP 编码(5 行),可以立即将我的数据保存为文件。
以下是将数据保存到文本文件的代码的核心:
$myFile = "pdjentries.txt";
$fo = fopen($myFile, 'w') or die("can't open file");
$data = "ALL Your Entries from PersonalDreamJournal.com\r \n\r\n\r\n";
while ($row = $Recordset1->fetch_assoc() )
{
$data .= date("m-d-Y", strtotime($row['date'])).' '.$row['flag']. "\r\n";
$data .= $row['text']. "\r";
$data .= "****************************************************************";
$data .= "\r\n\r\n\r\n\r\n\r\n"; ;
} //end while
$data .='----END OF ALL ENTRIES-----';
header('Content-type: application/txt');
header('Content-Disposition: attachment; filename="pdj-entries.txt"');
echo $data;
【问题讨论】:
-
您在使用 dompdf 时遇到过什么问题?它应该像创建 HTML 页面一样简单,尽管某些 HTML 布局可能会出现问题。
-
@BrianS 我能够让 dompdf 正常工作,而且它相当简单而且效果很好。我遇到的问题是,如果它尝试渲染大量 HTML,它会崩溃。在我看来,代码的内存问题。
-
有可能,具体取决于文档的大小。也可能与文档结构有关(例如,dompdf 无法处理高度超过页面高度的表格单元格)。
-
我没有桌子。只使用默认值并显示每条记录中的 2 个字段。日期和文本。它是一个日记应用程序。现在对于它将呈现的 400 条记录......在大约 300 秒内,创建的 PDF 大约有 180 页。 :-) 现在后视是 20/20,我现在看到这是一个相当大的 PDF 文件,可能不合理......这就是为什么我去保存为文本文件,这需要大约 1 秒。更好的用户体验,用户可以获取文本文件数据并按照自己的意愿使用它,甚至可以将其制作为 PDF。唯一的遗憾是 PDF 允许保持数据纯净,因此没有人可以更改信息。
标签: php mysql pdf-generation dompdf