无法在PDF中写入完整的HTML

时间:2017-06-22 09:01:01

标签: python subprocess python-pdfkit

这让我从昨天开始惹恼了我,我只是出于想法。

我正在尝试编写带有子类pdfkit.PDFKit的PDF(我们称之为MyPDFKit):它运行良好(我只是将其子类化以增加使用xvfb-run的可能性args)。我指定不是课程的问题

我试图将一些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)。< / LI>
  2. f.write(..)是截断您传入的字符串的那个。
  3. 不能是模板或对象数据的问题,因为我只能在获得某个范围时才能正确创建PDF(同一渲染中超过350个项目由于HTML编号而导致问题开始导致问题线)。例如,objs[:315]效果很好,但objs[:350]没有。

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

1 个答案:

答案 0 :(得分:0)

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

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

这条评论(我说评论给他们一种数据,因为我不知道PDF文件是如何处理评论的),在Adobe Reader等程序中无法处理,因此它检测到文件已损坏/损坏,而在SumatraPDF / Edge这样的程序中,它只是忽略了它并很好地显示了PDF。

现在,如何防止这种行为?传递--quiet参数。但是,为此,您需要继承PDFKit(就像我使用 MyPDFKit 一样),并手动添加argsline of code)。

问题解决了。

修改

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