5

我在我的 html 页面中使用了 unicode,它在 html 页面中正确显示。但是在使用 xhtml2pdf 将其转换为 html 时,它会在 unicode 中生成黑色的实心方框。除了 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()

生成的pdf文件

我什至需要包括字体吗?

4

4 回答 4

7

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

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

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

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

于 2013-08-25T17:57:04.933 回答
2

答案有点晚,但我认为了解为什么相对路径不适fontface用于 xhtml2pdf 很重要:

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

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

要解决此问题,您可以:

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

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

于 2013-12-20T12:01:21.867 回答
0

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

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

请参阅: 如何从我的 xml 文件中删除 BOM 字符

于 2013-11-11T20:04:45.777 回答
0

文档看来,您应该提供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')
于 2013-08-23T18:05:42.123 回答