2

我正在使用 itext 和 ColdFusion (java) 将文本字符串写入 PDF 文档。我有需要使用的 trueType 和 openType 字体。Truetype 字体似乎工作正常,但字距调整未用于任何以 .otf 结尾的字体文件。下面的代码在 Airstream (OpenType) 中写入“Line 1 of Text”,但缺少“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>
4

2 回答 2

1

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

我查看了源代码,IText 实现只检查字距是否为 truetype 字体,根本不读取 GPOS 表,因此内部字距必须为空,并且 hasKernPairs 必须返回 false。

所以,有两种方法可以解决:

  • 摆脱你使用的otf :)
  • 通过读取 GPosition 表来修补 truetypefont
  • 等我,我正在处理 cff 内容,但 PDF 是我的可选内容:) 但不排除这种可能性:)
于 2012-05-16T21:49:02.817 回答
0

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

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

于 2011-10-27T13:58:36.083 回答