有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java OpenType字体紧排与itext

我正在使用itext和ColdFusion(java)将文本字符串写入PDF文档。我需要使用trueType和openType字体。Truetype字体似乎工作正常,但字距调整没有用于任何以结尾的字体文件。otf。下面的代码在Airstream(OpenType)中写入“文本的第1行”,但缺少“T”和“e”之间的字距。当在其他程序中使用同一字体时,它会进行字距调整。我还下载了一个更新版本的itext,但是内核仍然不起作用。有人知道如何在itext中使用otf字体进行字距调整吗

<cfscript>
pdfContentByte = createObject("java","com.lowagie.text.pdf.PdfContentByte");
BaseFont= createObject("java","com.lowagie.text.pdf.BaseFont");
bf = BaseFont.createFont("c:\windows\fonts\AirstreamITCStd.otf", "" , BaseFont.EMBEDDED);
document = createobject("java","com.lowagie.text.Document").init();
fileOutput = createObject("java","java.io.FileOutputStream").init("c:\inetpub\test.pdf");
writer = createobject("java","com.lowagie.text.pdf.PdfWriter").getInstance(document,fileOutput);
document.open();    
cb = writer.getDirectContent(); 
cb.beginText();
cb.setFontAndSize(bf, 72);
cb.showTextAlignedKerned(PdfContentByte.ALIGN_LEFT,"Line 1 of Text",0,72,0);
cb.endText();
document.close();

bf.hasKernPairs(); //returns NO
bf.getClass().getName(); //returns "com.lowagie.text.pdf.TrueTypeFont"
</cfscript>

共 (2) 个答案

  1. # 1 楼答案

    看看这个关于How to use Open Type Fonts in Java的线程。 这里指出,java不支持otf(甚至不支持iText)。Otf支持取决于sdk版本和操作系统

    或者,您可以使用FontForge将otf转换为ttf

  2. # 2 楼答案

    根据所谓的规范:http://www.microsoft.com/typography/otspec/kern.htm 开放式™ “kern”表不支持包含CFF轮廓的字体,必须使用“GPOS”OpenType布局表

    我检查了源代码,IText实现只检查truetype字体的内核,根本不读取GPOS表,因此内部内核必须为空,hasKernPairs必须返回false

    所以,有两种方式可以解决问题:

    • 清除您使用的otf:)
    • 通过读取GPosition表来修补truetypefont
    • 等等,我正在处理cff内容,但PDF是可选的,但不排除可能性:)