为啥使用 Arial Unicode MS 无法正确呈现古吉拉特语-印度语文本?

Posted

技术标签:

【中文标题】为啥使用 Arial Unicode MS 无法正确呈现古吉拉特语-印度语文本?【英文标题】:Why is the Gujarati-Indian text not rendered correctly using Arial Unicode MS?为什么使用 Arial Unicode MS 无法正确呈现古吉拉特语-印度语文本? 【发布时间】:2016-08-07 22:40:15 【问题描述】:

这是对这个问题How to export fonts in Gujarati-Indian Language to pdf?、@amedee-van-gasse、iText 的 QA 工程师asked me 的后续跟进,以发布一个特定于 itext 的问题以及相关的 mcve。

为什么这个 unicode \u0ab9\u0abf\u0aaa\u0acd\u0ab8 序列没有正确呈现?

应该是这样渲染的:

હિપ્સ ,也用unicode-converter测试过

但是这段代码(示例改编形式iText: Chapter 11: Choosing the right font)

public class FontTest 

    /** The resulting PDF file. */
    public static final String RESULT = "fontTest.pdf";
    /** the text to render. */
    public static final String TEST = "\u0ab9\u0abf\u0aaa\u0acd\u0ab8";

    public void createPdf(String filename) throws IOException, DocumentException 
        Document document = new Document();
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(filename));
        document.open();
        BaseFont bf = BaseFont.createFont(
            "ARIALUNI.TTF", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
        Font font = new Font(bf, 20);
        ColumnText column = new ColumnText(writer.getDirectContent());
        column.setSimpleColumn(36, 730, 569, 36);
        column.addElement(new Paragraph(TEST, font));
        column.go();
        document.close();
        System.out.println("DONE");
    

    public static void main(String[] args) throws IOException, DocumentException 
        new FontTest().createPdf(RESULT);
    

生成此结果

看起来不一样

હિપ્સ

我用 itextpdf-5.5.4.jar,itextpdf-5.5.9.jaritext-2.1.7.js3.jar 进行了测试(与 jasper-reports 一起分发)

使用它的字体与 MS Office ARIALUNI.TTF 一起分发,可以从这里下载 Arial Unicode MS *下载可能存在一些法律问题,请参阅 Mike 'Pomax' Kamermans 评论

【问题讨论】:

请注意,您的下载链接是......不是 100% 合法的。 Arial Unicode 与 Microsoft Office 免费捆绑在一起,但这并不能使字体本身免费。如果您查看fonts.com/font/monotype/arial-unicode,很明显这是一种非常昂贵的字体(如果您没有购买Office,这两个家庭需要370美元)。 另一个问题是这里的问题是谁 - iText 依赖什么文本整形器,您是否尝试过查看 it 在呈现 Unicode 序列和字体资源时的作用?这可以是 iText,但也可以是 iText 所依赖的任何 Java 整形器。 仅供参考:Guajarati 需要在应用字体自身的 OpenType 功能之前重新排序字形。该字体文件中没有可重新排序的代码;它留给渲染器软件首先对字符串进行预处理。另请参阅Microsoft's notes on Gujarati。 iText(Sharp) 目前不支持连字。 iTextSharp 的下一个版本(大约一周后将在班加罗尔的 Great Indian Developer Summit 上展示)将支持连字,但将添加此支持的排版插件将不会作为开源提供。我们决定让它成为一个封闭源代码的商业插件,因为太多人认为开源是“免费”的同义词(事实并非如此)。 感谢布鲁诺的评论,消息已收到,祝峰会好运。 【参考方案1】:

无论您选择哪种字体,iText5 和 iText2(顺便说一下,这是一个非常过时的版本)都不支持渲染印度语脚本。

渲染印度文字与任何拉丁文字都不同,因为应该采取一系列额外的操作来获得正确的结果,例如有些字符需要先根据语言规则重新排序。

这是 iText 公司的一个已知问题。

iText5 中有一个 Gujaranti 的存根实现,称为 GujaratiLigaturizer,但实现非常糟糕,你不能指望用它得到正确的结果。

您可以尝试使用此连字器处理您的字符串,然后按以下方式输出结果字符串:

IndicLigaturizer g = new GujaratiLigaturizer();
String processed = g.process(inputString);
// proceed with the processed string

【讨论】:

感谢您的回答,我将对其进行测试,您是否知道任何更好的实现,仅供参考旧版本(itext2),因为这是与最新的碧玉报告分发一起分发的(我认为他们有一些问题pdf/a 或法律问题)。 非常感谢......浪费了很多时间试图找到解决办法......【参考方案2】:

使用最新的排版 jar 文件构建您的应用程序 将解决您在 pdf 中的古吉拉特语字体渲染问题 在正文中。

【讨论】:

以上是关于为啥使用 Arial Unicode MS 无法正确呈现古吉拉特语-印度语文本?的主要内容,如果未能解决你的问题,请参考以下文章

是否有可用的 Windows Unicode 字体与 Arial Unicode MS 一样完整,但免费,即使用于商业用途? [关闭]

当从 html 文件中读取 Unicode 内容时,为啥 Unicode 字体无法在 QTextBrowser 中正确显示?

为啥我的支持 unicode 的软件无法识别 ANSI 文件中的“Š”和其他字符?如何解决?

MS Access VBA 并使用 unicode UTF-8 / UTF-16 报告问题

如何检索 Unicode CSV 剪贴板数据 MS Windows XP?

为啥我的AE打不了字啊