Java iText 5.5.3 ColumnText不';由于字体大小的测量方式,无法正确包装文本 问题设置

Java iText 5.5.3 ColumnText不';由于字体大小的测量方式,无法正确包装文本 问题设置,java,itext,Java,Itext,我试图准确地确定字体的宽度(Ubuntu斜体),尽管iText似乎忽略了水平前进后最后一个字形的部分,如下图所示 我用于生成此示例的代码如下所示: Document document = new Document(PageSize.LETTER); FileOutputStream out = new FileOutputStream(new File("test.pdf")); PdfWriter writer = PdfWriter.getInstance(document, out);

我试图准确地确定字体的宽度(Ubuntu斜体),尽管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以不同的方式测量字体的宽度,这样就不会发生这种情况?

您的观察结果

穿过
f

对应于Ubuntu斜体字母f的定义:


你得到的宽度是字母在基线上的宽度,水平前进,它不是从最左边到最右边x坐标的距离。

我最终解决了这个问题,在
PdfPCell
的左右两侧添加了填充,并将
ColumnText
的宽度增加到与我添加的填充相等。通过这种方式,文本以相同的方式流动,并且允许iText只考虑字体的水平推进值。

我欣赏图片和说明,尽管我的问题不是关于字体,而是如何使iText尊重从最左边到最右边x坐标的距离。我更新了标题并组织了问题以使其更清楚。IText不知道从最左边到最右边x坐标的距离。它只知道水平位移。要了解更多信息,它必须详细分析字体数据,而这不是它的重点。为此,您应该另外使用以字体为中心的库。使用以字体为中心的库对我的情况没有帮助,因为ColumnText控制文本的流动。我恐怕正如我所说的,iText只知道水平前进值。在右侧添加填充-如果您查看我回答中字母
f
的定义,你会发现你应该在左边加一些填充物。如果放大,还可以在测试PDF中看到截止点。