使用xhtml2pdf为django正确渲染@ font-face自定义字体

时间:2013-01-23 20:57:01

标签: html css django font-face xhtml2pdf

我试图在尝试从HTML渲染pdf时使用自定义字体。

我在HTML中尝试过,字体显示出来,因此字体的路径必须正确,并且可能正确使用。字体的类型为.ttf,根据http://xhtml2pdf-base.googlecode.com/hg/doc/xhtml2pdf-en.html上的文档,它应该呈现,但它不会。

以下是我的样式标签中的内容:

@font-face {
  font-family: "Swiss";
  src: url("/static/font/swiss.ttf");
}
body {
  font-family: "Swiss";
  font-size: 12px;
}

和html:

<body>
  asdf
</body>

我尝试过很多东西,从字体网址和字体系列中删除引号,我的正文包含在HTML标记中,因此html格式正确。在网页中渲染时,所有内容都呈现正常,但转换为PDF时无法正确呈现。任何人都可以帮我发现错误吗?

3 个答案:

答案 0 :(得分:2)

最好的方法是使用回调来使用文件系统路径获取字体。更准确,你也不会为每个资源(资源含义,字体,图像等)点击网络服务器

pisa.CreatePDF(html.encode("UTF-8"), file_object , encoding='UTF-8',
               link_callback=fetch_resources)

def fetch_resources(uri, rel):
    find_file_in_path_using_uri
    return path

顺便说一句,我认为你的问题是你还没有收集静态,所以字体不是真的在/static/font/swiss.ttf。我的意思是他们不在户外django,而xhtml2pdf它在django之外。我不是百分百肯定。

答案 1 :(得分:0)

我对此线程比较晚,但是最近我遇到了同样的问题。使用回调提供字体定义的建议确实可行(但在我的情况下有一些限制,因为我需要一些逻辑来根据外部条件使用不同的字体)。但是,我发现问题在于url(“ / static / font / swiss.ttf”)需要是一个绝对文件位置,而不是相对于您的应用程序位置,如图所示。例如,在我的情况下,我的应用程序位置为“ / home / user / app”,URL必须为: url(“ / home / user / app / static / font / swiss.ttf”)。

答案 2 :(得分:0)

我遇到了同样的问题。 gdrimes是正确的。从相对网址更改后:

@font-face {
            font-family: FreeSans;
            src: url("./FreeSans.ttf");
        }

绝对

@font-face {
            font-family: FreeSans;
            src: url("/home/rok/Documents/Muzey/muzey/website/templates/pdf/FreeSans.ttf");
        }

我的PDF文档中的字体已更新。