无法将完整 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 行。
当试图将其写入文件时出现问题。它可能在这两个地方之一:
MyPDFKit.to_pdf(..)
(调用自MyPDFKit.from_string(..)
)的stdout
有大小限制,截断部分字符串(函数源代码为here) .
f.write(..)
是截断您传入的字符串的那个。
不可能是模板或对象数据的问题,因为我可以在仅获取特定范围的 then 时正确创建 PDF(同一渲染中超过 350 个项目开始导致问题,原因是 HTML行数)。例如,objs[:315]
效果很好,但 objs[:350]
不行。
我试过将缓冲区大小设置为-1,这是无限制的,但也不起作用。以前有人遇到过这个问题吗?
好的,最后,在另一位程序员的帮助下,我找到了问题所在。
它看起来像 PDFKit,当处理大量 HTML(我们所说的 PDF 页面数量或多或少超过 349 个)时,将进度条注释发送到缓冲区以查看它是如何处理的去。然后,当它完成时,还会发送一条完成评论消息。
这个评论(我说评论是为了给他们一种数据,因为我真的不知道 PDF 文件如何处理评论),在像 Adobe Reader 这样的程序中无法处理,所以它检测到该文件是 corrupted/damage,而在 SumatraPDF/Edge 这样的程序中,它只是忽略然后很好地显示 PDF。
现在,如何防止这种行为?传递 --quiet
参数。但是,为此,您需要子类化 PDFKit(就像我对 MyPDFKit 所做的那样),并手动添加 args
(line of code).
问题已解决。
编辑
似乎我可以在 options
kwargs 中传递 --quiet
,所以如果这只是问题所在,则不需要子类化(尽管默认情况下激活它会很好......)
从昨天开始,这让我很生气,我完全没有想法。
我正在尝试编写带有子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 行。
当试图将其写入文件时出现问题。它可能在这两个地方之一:
MyPDFKit.to_pdf(..)
(调用自MyPDFKit.from_string(..)
)的stdout
有大小限制,截断部分字符串(函数源代码为here) .f.write(..)
是截断您传入的字符串的那个。
不可能是模板或对象数据的问题,因为我可以在仅获取特定范围的 then 时正确创建 PDF(同一渲染中超过 350 个项目开始导致问题,原因是 HTML行数)。例如,objs[:315]
效果很好,但 objs[:350]
不行。
我试过将缓冲区大小设置为-1,这是无限制的,但也不起作用。以前有人遇到过这个问题吗?
好的,最后,在另一位程序员的帮助下,我找到了问题所在。
它看起来像 PDFKit,当处理大量 HTML(我们所说的 PDF 页面数量或多或少超过 349 个)时,将进度条注释发送到缓冲区以查看它是如何处理的去。然后,当它完成时,还会发送一条完成评论消息。
这个评论(我说评论是为了给他们一种数据,因为我真的不知道 PDF 文件如何处理评论),在像 Adobe Reader 这样的程序中无法处理,所以它检测到该文件是 corrupted/damage,而在 SumatraPDF/Edge 这样的程序中,它只是忽略然后很好地显示 PDF。
现在,如何防止这种行为?传递 --quiet
参数。但是,为此,您需要子类化 PDFKit(就像我对 MyPDFKit 所做的那样),并手动添加 args
(line of code).
问题已解决。
编辑
似乎我可以在 options
kwargs 中传递 --quiet
,所以如果这只是问题所在,则不需要子类化(尽管默认情况下激活它会很好......)