问题设置
我正在尝试准确确定字体(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 以不同的方式测量字体的宽度,以免发生这种情况?
最佳答案
你的观察
The right border that cuts through the
f
对应于 Ubuntu-Italic 字母 f 的定义:
你得到的宽度是字母在基线上的宽度,即水平前进,它不是从最左边到最右边的x坐标的距离。
关于java - iText 5.5.3 由于字体大小的测量方式,ColumnText 无法正确换行文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26349579/