4

我正在研究一个基于Java、Spring、Hibernate、Thymeleaf、MySQL的项目。对于该项目,我必须在多个部分中生成 PDF 报告。所以我开始使用Flying Saucer并且一切正常,直到我尝试在 PDF 报告中包含 Bangla 字体。起初它什么也没显示。然后我加入了孟加拉语字体,如“Kalpurush”、“SolaimanLipi”。现在它显示Bangla 字体但格式不正确。比如“মোট উপার্জন”变成了“ম োট উপ ার্‌জন”;. 我有一些带有孟加拉字体的页面,它们按预期工作。在 PDF 中使用 Bangla 字体时会出现问题。我怎么解决这个问题?

飞碟的替代品有哪些,可用于生成带有孟加拉字体的 PDF 报告。

我的代码:

控制器

@GetMapping("/print_bangla_pdf")
private void printBanglaPdf(HttpServletResponse response) throws Throwable {
    response.setContentType("application/octet-stream");
    String headerKey = "Content-Disposition";
    String headerValue = "attachment; filename=bangla_pdf_report.pdf";
    response.setHeader(headerKey, headerValue);
    Context context = new Context();
    context.setVariable("banglaWord", "মোট উপার্জন");
    String processHTML = templateEngine.process("pdf_reports/bangla_pdf_report", context);
    ServletOutputStream outputStream = response.getOutputStream();
    ITextRenderer renderer = new ITextRenderer();
    ITextFontResolver resolver = renderer.getFontResolver();
    resolver.addFont("C:\\kalpurush.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
    renderer.setDocumentFromString(processHTML);
    renderer.layout();
    renderer.createPDF(outputStream, false);
    renderer.finishPDF();
    outputStream.close();
}

Bangla_pdf_report.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8" />
    <style>
        .bengaliFont {
            font-family: "Kalpurush";
        }
    </style>
</head>

<body>
    <p class="bengaliFont" th:text="'মোট উপার্জন'"></p>
    <p class="bengaliFont" th:text="${banglaWord}"></p>
</body>
</html>
4

1 回答 1

2

您是否尝试过隔离问题?我怀疑两个潜在的原因:

  1. Thymeleaf 引擎有问题吗?
  2. 您是否缺少 TTF 字体的 @import ?

为了消除这些原因,我尝试在不使用 Thymeleaf 模板的情况下创建一个独立的 HTML 文件,并且除了 Kalpurush.TTF 之外还使用 Google Bangla 字体(Galada)。Galada 可以使用 Google Fonts API 导入,而 Kalpursh.ttf 必须从本地文件下载和导入。

它可以在 Chrome 和 Edge 中正确呈现。这是片段(它使用本地文件,所以我不确定它会如何在 SO 中呈现)。我还附上了它在我的浏览器中的显示截图。您可以将 HTML 保存在本地并自己尝试。只需替换 Kalpurush.TTF 的 @import 即可引用您的本地目录路径。

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8" />
    <style>
        @import url('https://fonts.googleapis.com/css2?family=Galada&display=swap');
        @import url('file://d:/Giri/temp/so/kalpurush.ttf');

        .bengaliFont {
            font-family: 'Galada', cursive;
        }
        .bengaliFont2 {
            font-family: 'Kalpurush';
        }
    </style>
</head>

<body>
    <p class="bengaliFont"><span>Galada font:&nbsp;</span>মোট উপার্জন&lt;/p>

    <p class="bengaliFont2"><span>Kalpurush font:&nbsp;</span>মোট উপার্জন&lt;/p>
</body>
</html>

这是我的浏览器在本地呈现此 HTML 文件的屏幕截图。

在此处输入图像描述

这表明字体文件没有问题。

您可能想要获取独立的 html 文件并通过 FlyingSaucer 运行它以生成 PDF 并查看它是否解决了问题,然后从那里开始。

于 2020-08-26T02:39:00.067 回答