2017-06-22 78 views
0

这已经得罪我了昨天,我刚出来的想法。不能写完整的HTML到PDF

我想写一个PDF一个子类pdfkit.PDFKit(姑且称之为MyPDFKit):它工作得很好(我只是子类它添加在ARGS使用xvfb-run的可能性)。我指定不是类的问题。

我尝试了一些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(..)是舍去你在传递字符串的一个。

不能在模板或对象的数据的问题,因为我只得到了一定范围内的,然后当正确地创建PDF文件(由于HTML的行数,在相同的渲染中超过350个项目开始导致该问题)。例如,objs[:315]效果不错,但不是objs[:350]

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

回答

0

好了,最后,与其他程序员的帮助下,我找到了问题。

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

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

现在,如何防止这种行为?通过了--quiet的说法。但是,对于这一点,你需要继承PDFKit(如我MyPDFKit所做的那样),以及手动添加argsline of code)。

问题解决。

编辑

看来,我可以通过在options kwargs --quiet,因此无需子类的,如果这是唯一的问题(虽然这将是很好有它积极的默认...)