我正在springboot中开发一个微服务,通过使用freeMarker和openHtmlToPdf库生成pdf。我想引入自定义字体(泰米尔语)。但只得到####作为输出。不知道我哪里出错了。
html转pdf的方法
private fun convertToPdf(htmlContent: String): ByteArrayResource {
val jsoupDocument = Jsoup.parse(htmlContent)
jsoupDocument.outputSettings().syntax(Document.OutputSettings.Syntax.html)
val xmlDocument = W3CDom().fromJsoup(jsoupDocument)
val FONT_FILE = File("resources/fonts/NotoSansTamil.ttf")
val byteArrayOutputStream = ByteArrayOutputStream()
val baseUrl = javaClass
.protectionDomain
.codeSource
.location
.toString()
PdfRendererBuilder()
.withW3cDocument(xmlDocument, baseUrl)
.useFont(FONT_FILE, "Nota Sans")
.toStream(byteArrayOutputStream)
.run()
return ByteArrayResource(byteArrayOutputStream.toByteArray())
}
自由标记模板
<html>
<head>
<#-- <meta charset="UTF-16">-->
<title>FreeMarker</title>
<style>
@font-face {
font-family: 'Open Sans';
font-style: normal;
font-weight: 400;
src: url(./fonts/NotoSansTamil.ttf);
}
</style>
</head>
<body>
<h1> Welcome to FreeMarker ${name} </h1>
</body>
</html>
1条答案
按热度按时间wnrlj8wa1#
有多种不同的问题代码。
font-family
不匹配您将字体定义为
但是在hmtl框架中使用
只是为了记录这个字体叫诺托而不是Nota。
File
路径错误正如你定义的字体是完全错误的。我假设你的项目布局是像Maven / Gradle建议。在这种情况下,
resources
文件夹应该是[project_root]/src/main/resources
如果我是对的,那么字体应该是
[project_root]/src/main/resources/fonts/NotoSansTamil.ttf
,但你的FONT_FILE
将指向[project_root]/resources/fonts/NotoSansTamil.ttf
。基础URL混乱
构建
baseUrl
并将其传递给PdfRenderedBuilder
以解析资源。如果你的布局类似于Maven / Gradle,那么它指向
[project_root]/target/classes/
。它永远不会在另一台机器上工作,当你将代码打包到工件中时,它也不会工作。加载字体为文件而非资源
这个代码片段指定了文件系统上的一个文件,但是您需要一个资源,该资源通常是与该工件一起提供的。
混合字体分辨率概念
你添加了一个字体渲染器
.useFont(...)
和html / css侧src: url(...);
这是一个坏主意,不会正常工作。builder.useFont
或@font-face
规则,而不是两者都使用。我建议使用builder.useFont
。在这种情况下,不再需要@font-face
定义和凌乱的baseUrl
。把一切放在一起
修复所有前面提到的问题,下面的代码将工作。
注意:我以前从未写过Kotlin代码,可能它可以做得更好,优化等。