使用itext的OpenType字体字距调整

时间:2011-10-24 19:18:36

标签: java coldfusion itext opentype kerning

我使用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 个答案:

答案 0 :(得分:1)

根据所谓的规范:http://www.microsoft.com/typography/otspec/kern.htm 'kern'表不支持包含CFF轮廓的OpenType™字体,并且必须使用'GPOS'OpenType Layout表。

我检查了源代码,IText实现只检查kern是否为truetype字体,根本没有读取GPOS表,所以内部字符串必须为空,并且hasKernPairs必须返回false。

所以,有两种解决方法:

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

答案 1 :(得分:0)

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

或者,您可以使用{3f将otf转换为ttf。{/ p>