我正在尝试准确地确定字体的宽度(Ubuntu Italic),尽管iText似乎忽略了水平前进后最后一个字形的部分,如下图所示。
我用来生成这个例子的代码如下:
Document document = new Document(PageSize.LETTER);
FileOutputStream out = new FileOutputStream(new File("test.pdf"));
PdfWriter writer = PdfWriter.getInstance(document, out);
document.open();
String text = "ff";
Chunk chunk = new Chunk(text, FontFactory.getFont("Ubuntu-Italic.ttf", 72)
Phrase phrase = new Phrase(chunk);
float width = ColumnText.getWidth(phrase);
System.out.println(width + ", " + chunk.getWidthPoint());
PdfPTable table = new PdfPTable(1);
table.setWidthPercentage(100);
table.setTotalWidth(width);
PdfPCell cell = table.getDefaultCell();
cell.setPadding(0);
cell.setUseDescender(true);
cell.setUseAscender(true);
table.addCell(phrase);
float height = table.calculateHeights();
PdfContentByte canvas = writer.getDirectContent();
ColumnText columnText = new ColumnText(canvas);
columnText.setSimpleColumn(36, 756 - height, 36 + width, 756);
columnText.addElement(table);
columnText.go();
document.close();
out.close();
正如代码中所示,我尝试了ColumnText.getWidth(phrase)
和chunk.getWidthPoint()
,它们都返回相同的值,并带有一点浮点差异。
我上面写的代码模拟了iText中的情况,其中文本没有正确地包装到下一行。我遇到的问题是我正在使用的代码中的ColumnText被裁剪。问题在于,由于iText测量文本的方式,ColumnText认为右边有f
的空间,实际上确实没有,所以在我的情况下它会被切断。有没有办法强制ColumnText以不同的方式测量字体的宽度,以便不会发生这种情况?
答案 0 :(得分:1)
你的观察
切断
的右边框f
对应于Ubuntu-Italic字母f的定义:
你得到的宽度是基线上字母的宽度,水平前进,不从最左边到最右边x坐标的距离。
答案 1 :(得分:0)
我最后通过在PdfPCell
的左侧和右侧添加填充并通过增加ColumnText
的宽度等于我添加的填充来解决此问题。这样,文本以相同的方式流动,并允许iText仅考虑字体的水平超前值。