【问题标题】:iText 5.5.3 ColumnText doesn't wrap text correctly due to the way font size is measurediText 5.5.3 ColumnText 由于字体大小的测量方式而无法正确换行
【发布时间】:2014-10-13 22:02:11
【问题描述】:

问题设置

我正在尝试准确确定字体的宽度(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 以不同的方式测量字体的宽度,以免发生这种情况?

【问题讨论】:

    标签: java itext


    【解决方案1】:

    你的观察

    穿过f的右边框

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

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

    【讨论】:

    • 我很欣赏图片和说明,尽管我的问题不是关于字体,而是如何让 iText 尊重从最左边到最右边 x 坐标的距离。我更新了标题并组织了问题以使其更清楚。
    • IText 不知道最左边到最右边x坐标的距离。它所知道的只是水平位移。更重要的是,它必须详细分析字体数据,这不是它的重点。为此,您应该另外使用以字体为中心的库。
    • 使用以字体为中心的库对我的情况没有帮助,因为 ColumnText 控制着文本的流动。
    • 恐怕如我所说,iText只知道水平推进值。
    【解决方案2】:

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

    【讨论】:

    • 在右侧添加填充 - 如果您在我的回答中查看字母 f 的定义,您会发现您应该添加一些左侧也有填充。如果放大,您还可以在测试 PDF 中看到截断。
    猜你喜欢
    • 1970-01-01
    • 2017-06-23
    • 2011-07-17
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    相关资源
    最近更新 更多