为啥使用 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.jar
和 itext-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 报告问题