无法将完整 HTML 写入 PDF

Cannot write full HTML into the PDF

从昨天开始,这让我很生气,我完全没有想法。

我正在尝试编写带有子classed pdfkit.PDFKit 的 PDF(我们称之为 MyPDFKit):效果很好(我只是子class编辑它以添加在 args 中使用 xvfb-run 的可能性)。我指定 不是 class 的问题。

我试图将一些 HTML 转换为 PDF。模板如下所示:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <!-- Simplified for reading. -->
    <style type="text/css">..</style>
  </head>
  <body>
    <!-- Simplified for reading. -->
    {% for obj in objs %}
    <div>
      <div>
        <p>{{ obj.name }}</p>
      </div>
      <p>{{ obj.age }}</p>
    </div>
    {% endfor %}
  </body>
</html>

使用这些模板,objs 有近 400 个实例,HTML 的输出接近 5k 行。

当试图将其写入文件时出现问题。它可能在这两个地方之一:

  1. MyPDFKit.to_pdf(..)(调用自MyPDFKit.from_string(..))的stdout有大小限制,截断部分字符串(函数源代码为here) .
  2. f.write(..) 是截断您传入的字符串的那个。

不可能是模板或对象数据的问题,因为我可以在仅获取特定范围的 then 时正确创建 PDF(同一渲染中超过 350 个项目开始导致问题,原因是 HTML行数)。例如,objs[:315] 效果很好,但 objs[:350] 不行。

我试过将缓冲区大小设置为-1,这是无限制的,但也不起作用。以前有人遇到过这个问题吗?

好的,最后,在另一位程序员的帮助下,我找到了问题所在。

它看起来像 PDFKit,当处理大量 HTML(我们所说的 PDF 页面数量或多或少超过 349 个)时,将进度条注释发送到缓冲区以查看它是如何处理的去。然后,当它完成时,还会发送一条完成评论消息。

这个评论(我说评论是为了给他们一种数据,因为我真的不知道 PDF 文件如何处理评论),在像 Adob​​e Reader 这样的程序中无法处理,所以它检测到该文件是 corrupted/damage,而在 SumatraPDF/Edge 这样的程序中,它只是忽略然后很好地显示 PDF。

现在,如何防止这种行为?传递 --quiet 参数。但是,为此,您需要子类化 PDFKit(就像我对 MyPDFKit 所做的那样),并手动添加 args (line of code).

问题已解决。

编辑

似乎我可以在 options kwargs 中传递 --quiet,所以如果这只是问题所在,则不需要子类化(尽管默认情况下激活它会很好......)