iText 5.5.3由于测量字体大小的方式,ColumnText无法正确包装文本

时间:2014-10-13 22:02:11

标签: java itext

问题设置

我正在尝试准确地确定字体的宽度(Ubuntu Italic),尽管iText似乎忽略了水平前进后最后一个字形的部分,如下图所示。

ff using Ubuntu Italic Font

我用来生成这个例子的代码如下:

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以不同的方式测量字体的宽度,以便不会发生这种情况?

2 个答案:

答案 0 :(得分:1)

你的观察

  

切断f

的右边框

对应于Ubuntu-Italic字母f的定义:

Ubuntu-Italic letter f

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

答案 1 :(得分:0)

我最后通过在PdfPCell的左侧和右侧添加填充并通过增加ColumnText的宽度等于我添加的填充来解决此问题。这样,文本以相同的方式流动,并允许iText仅考虑字体的水平超前值。