字体(Myanmar3)无法在 iText 中正确呈现

Posted

技术标签:

【中文标题】字体(Myanmar3)无法在 iText 中正确呈现【英文标题】:Font (Myanmar3) not rendering correctly in iText 【发布时间】:2016-03-21 14:52:27 【问题描述】:

在jasper-reports 部分有这个jasper-report-character-encoding-in-pdf 问题。

jasper 报告中无法解决该问题,因为它似乎是 itext 问题(使用 iText v. 5.5.4)

示例代码:

public class FontTest 

    /** The resulting PDF file. */
    public static final String RESULT = "pdf/fontTest.pdf";
    /** the text to render. */
    public static final String TEST = "\u1005\u101B\u1004\u103A\u1038\u1021\u1004\u103A\u1038\u1019\u103B\u102C\u1038\u1011\u100A\u103A\u101E\u103D\u1004\u103A\u1038\u1001\u103C\u1004\u103A\u1038";

    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(
            "lib/mm3.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();
    

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

字体可以在mm3.ttf下载

会错误渲染为:

它应该呈现为(在浏览器中使用相同的ttf

只是出于好奇,发生了什么? (似乎某些字符,带有虚线的圆圈应该向后移动,但这没有发生)。

这是.tff 的问题还是iText 不支持这些字体?

【问题讨论】:

您看到的行为是由 iText 不支持连字引起的。您需要 iText 的下一个未发布版本之一。我们将在明年发布测试版,但仅限于客户。 @BrunoLowagie,1000 感谢您的回复,期待新版本 是否可以直接使用此版本的 iText 处理 字形?那么你只需要知道这个字体的内部 OpenType '规则',你就可以在你的代码中进行字符翻译。 .. 例如,序列\u1004\u103A ("င ်") 转换为字形索引109 158,这些在链接上下文查找中被引用。查找 (Lookup #54) 将字形索引 158 更改为字形索引 233 并保持其他字符不变。字形索引 233 没有分配给它的 Unicode 代码点,因此您确实需要在字形索引之间进行转换,并且能够在呈现文本字符串时引用这些索引。 @Jongware 感谢您的 cmets,我将研究是否以及如何在 itext 中直接访问字形(已经看到这个开放问题 ***.com/questions/33748186/…)。 【参考方案1】:

将 Bruno Lowagie(itext 的原始开发者)评论转换为答案(社区 wiki)

您看到的行为是由 iText 不支持连字造成的。 (当前版本在github.com5.5.8

您需要 iText 的下一个未发布版本之一。我们将于明年(2016 年)发布测试版,但仅限客户使用

感谢@Rad Lexus 提供的一些赏金,关于在 iText 中直接访问 openType 字形的其他问题有一个答案Accessing OpenType glyph variants in iText

【讨论】:

我编辑了你的答案,因为官方下载页面在 GitHub 上。 Sourceforge 只是一个遗留备份。 它不是我的,是每个人的:) 我们现在是 5.5.9,但这主要是一个错误修复版本。不是布鲁诺提到的新版本。【参考方案2】:

请尝试以下代码,

string ZawgyiOnePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "ZawgyiOne.ttf");
            BaseFont ZawgyiOneBaseFont = BaseFont.CreateFont(ZawgyiOnePath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

 iTextSharp.text.Font ZawgyiOneFont = new iTextSharp.text.Font(ZawgyiOneBaseFont, 9);

【讨论】:

以上是关于字体(Myanmar3)无法在 iText 中正确呈现的主要内容,如果未能解决你的问题,请参考以下文章

iText 7:此 pdf 文档可能无法正确显示 Firefox

如何在iText 5中设置字体系列?

Itext 在 PDF 中嵌入字体

使用 iText 将字体嵌入 PDF 文件

使用iText 7(C#)创建删除线字体

记:解决itext5使用html模板生成PDF时,中文不显示的问题。