【问题标题】:trouble in converting unicode template to pdf using xhtml2pdf使用 xhtml2pdf 将 unicode 模板转换为 pdf 的麻烦
【发布时间】:2013-08-23 02:16:24
【问题描述】:

我的 html 页面中使用了 unicode,它在 html 页面中正确显示。但是在使用 xhtml2pdf 将其转换为 html 时,它会在 unicodes 中生成黑色的实心方框。除了 UTF-8 设置之外,还有一些 unicode 设置。我不认为它的unicode问题。

# convert HTML to PDF
pisaStatus = pisa.CreatePDF(
        StringIO(sourceHtml.encode('utf-8')),                 
        dest=resultFile)

完整的py代码:

# -*- coding: utf-8 -*-

from xhtml2pdf import pisa
from StringIO import StringIO

source = """<html>
            <style>
                @font-face {
                font-family: Preeti;
                src: url("preeti.ttf");
                }

                body {
                font-family: Preeti;
                }
            </style>
            <body>
                This is a test <br/>
                       सरल
            </body>
        </html>"""

# Utility function
def convertHtmlToPdf(source):
    # open output file for writing (truncated binary)

    pdf = StringIO()
    pisaStatus = pisa.CreatePDF(StringIO(source.encode('utf-8')), pdf)

    # return True on success and False on errors
    print "Success: ", pisaStatus.err
    return pdf

# Main program
if __name__=="__main__":
    print pisa.showLogging()
    pdf = convertHtmlToPdf(source)
    fd = open("test.pdf", "w+b")
    fd.write(pdf.getvalue())
    fd.close()

我什至需要包含字体吗??

【问题讨论】:

  • sourceHtml 实际上是一个unicode 字符串吗?因为通常情况下,HTML 文件采用某种 8 位编码,并且在已经是 UTF-8(或者更糟的是 Latin-1 之类的东西)的 str 上调用 encode('utf-8') 不会有帮助。
  • 是的,它们在sourceHtml中是这样的,u093e\u0917\u093f \u0924\u092f\u093e\u0930:
    \n\t\t\n \n\t \t\t\n\t\t\t\t\u090 9\u092a\u092d\u094b\u0915\u094d\u0924\u093e \u092a\u0942\u0930\u094d\u0923\u092a\u094d\u092f\u093e\ u0915\u0947\u091c\u0915\u094b \u0932\u093e\u0917\u093f \u0924\u092f\u093e\u0930 :
    \n\t\t\t\n

标签: python unicode flask xhtml2pdf


【解决方案1】:

部分解决了。提供字体的绝对路径,即

    <style>
        @font-face {
        font-family: Preeti;
        src: url("c:/static/fonts/preeti.ttf");
        }

        body {
        font-family: Preeti;
        }
    </style>  

现在又出现了另一个问题。我混合了文本,部分是 unicode,部分是普通字体(我想我应该说它是普通字体:D),因为字体已被覆盖,现在普通字体出现在矩形框中。在这种情况下是一个空盒子。

【讨论】:

  • 你解决了这个问题吗,我需要在我尝试使用 Mangal(印地语字体)的 PDF 文件中同时包含印地语和英语,但一次只显示其中一个
  • 这对我有用 xhtml2pdf v0.2.3 与 Django 模板渲染系统 @Hemant_Negi
【解决方案2】:

回答有点晚,但我认为了解为什么相对路径在 xhtml2pdf 的 fontface 中不起作用很重要:

CreatePDF 函数(与https://github.com/chrisglass/xhtml2pdf/blob/master/xhtml2pdf/pisa.py 中的pisaDocument 方法相同)有一个path 命名参数。现在,如果您不设置此参数并使用相对路径,那么它将尝试在名为 __dummy__ 的文件夹下查找您的字体,如文件 https://github.com/chrisglass/xhtml2pdf/blob/master/xhtml2pdf/context.py 所示(搜索 dummy)。

所以,这就是为什么您的.ttf 文件在您使用绝对路径时有效。

要解决此问题,您可以:

  • 创建一个__dummy__ 文件夹并将您的.ttf 文件放在那里,或者
  • 将值传递给CreatePDFpath 命名参数

例如,在我的例子中,我通过 django 创建 PDF,所以我传递了 path='.' 并将我的 .ttf 放在与我的 manage.py 相同的文件夹中 - 一切正常美好的。更好的解决方案是定义 SETTINGS.PROJECT_PATH 并使用它。

【讨论】:

    【解决方案3】:

    the documentation 看来,您应该给CreatePDF 一个编码,否则“这是由HTML5 解析器猜到的”。

    因此,假设 HTML 文件的标题指定了用于梵文的任何旧字符集。您在向我们展示的代码之前将其正确解码为 Unicode,然后将其重新编码为 UTF-8,但标头指定了不同的字符集。在这种情况下,html5lib 会猜测错误的字符集,并错误地解释字符并为您提供 mojibake。

    当然,如果没有完整的示例,我无法确定这正是您所面临的问题,但很可能类似。最可能的解决方案对它们中的任何一个都是相同的:如果您编码为 UTF-8,请告诉转换器使用 UTF-8 而不是猜测:

    pisaStatus = pisa.CreatePDF(
        StringIO(sourceHtml.encode('utf-8')),                 
        dest=resultFile,
        encoding='utf-8')
    

    【讨论】:

      【解决方案4】:

      使用 xhtml2pdf 和 pisa 将 html 转换为 pdf 时,我的 pdf 中有一个黑框字符。原来我在文档中有一个 BOM(字节顺序标记)字符。

      可以通过在大多数文本编辑器中执行“另存为”来删除 BOM。在 UltraEdit 中,我选择了另存为...并选择了 UTF-8 (NO BOM) 类型。

      见: How do I remove the BOM character from my xml file

      【讨论】:

      • 根据问题作者的问题,所有 Unicode 字符都失败了。不仅仅是第一个字符。
      猜你喜欢
      • 2019-12-20
      • 1970-01-01
      • 1970-01-01
      • 2018-11-04
      • 2012-01-10
      • 1970-01-01
      • 1970-01-01
      • 2013-07-03
      • 1970-01-01
      相关资源
      最近更新 更多