【问题标题】:Show Bangla font properly on pdf file generated from Java project在 Java 项目生成的 pdf 文件上正确显示 Bangla 字体
【发布时间】:2020-12-05 14:38:28
【问题描述】:

我正在开发一个基于 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>

【问题讨论】:

  • 能否请您在java中提供a Minimal, Reproducible Example
  • 这是一个最小的、可重现的例子。只需将此代码放在任何带有 FlyingSaucer 的 Spring 项目中,然后更改字体的文件位置,代码就会运行!
  • @Partho63 bhai,我面临的问题完全相同。你是怎么解决的,Bhai?还是有其他方法?
  • @MuhammadSaimon 我找不到任何解决此问题的方法。我最终使用了pdfmake JavaScript 库。

标签: java pdf-generation flying-saucer bangla-font


【解决方案1】:

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

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

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

它可以在 Chrome 和 Edge 中正确呈现。这是 sn-p (它使用本地文件,所以我不确定它会如何在 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>মোট উপার্জন</p>

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

这是我的浏览器在本地渲染这个 HTML 文件的屏幕截图。

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

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

【讨论】:

  • 关于替代 PDF 生成器的其他问题,我只使用了 Javascript。它们是:1. PDFKit (pdfkit.org) 2. svg2pdf (github.com/yWorks/svg2pdf.js) 3. Google Puppeteer (developers.google.com/web/tools/puppeteer) - 是的,您可以在无头 chrome 中加载 HTML 并将 HTML 保存为 PDF。服务器端渲染和生成的 PDF 的位内存可能很大。请参阅本文了解替代方案 (medium.com/upskillie/pdf-generation-with-nodejs-c29da5e2433c)
  • 这个答案是为了在 html 页面上显示 Bangla 字体。对于那件事我没有任何疑问。我有孟加拉字体正确显示的页面。我的问题是:通过 FlyingSaucer 生成 PDF 后,Bangla 字体无法正确显示。不管怎样,谢谢。 ?
  • 好的,谢谢@Partho63。由于您提到的问题'...开始使用 Flying Saucer 并且一切正常,直到我尝试在 PDF 报告中包含 Bangla 字体...',我将其解释为 FlyingSaucer 没问题,问题出在字体上。您可能需要编辑您的问题以澄清。谢谢。
猜你喜欢
  • 1970-01-01
  • 2015-07-14
  • 1970-01-01
  • 2012-06-26
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
  • 2023-01-28
  • 1970-01-01
相关资源
最近更新 更多