在矩形 pdfbox 内垂直居中

Center vertically inside rect pdfbox

我试图将文本在矩形内垂直居中,但它总是偏离一点点。

使用的字体是 Helvetica,字体大小设置为 12,我在字母上方和下方设置了 6 磅的填充,我将矩形的大小设置为 24 磅。

用于写入单元格的代码如下,图像显示单元格垂直未居中。

public void drawCell(PDPageContentStream owningStream, float xOffset, float yOffset) throws IOException {
    float cellHeightSpacing = fontSize / 2;
    float height = yOffset  - fontSize - cellHeightSpacing;
    if (isContentLargerThanCell()) {
        if (maxLines < 2)
            return;

    } else {
        float x = xOffset+getAlignedX(" "+content+" ");
        drawContent(owningStream," "+content+" ",x,height);
    }
    drawCellBoundaries(owningStream, xOffset, yOffset - 2 * fontSize, 2 * fontSize);
}

private void drawCellBoundaries(PDPageContentStream owniContentStream, float X, float startHeight, float sizeHeight) throws IOException {
    owniContentStream.addRect(X, startHeight, width, sizeHeight);
owniContentStream.stroke()
}

你实际上有两个问题要处理:

  • 对于给定的字体大小 fs,几乎没有任何字母实际上具有 fs[=51= 的高度], 通常短字母序列也不会。

    您的代码假设它必须将高度内容垂直居中 fs 但您使用大写字母,基线下方没有任何部分,因此它们的高度远小于 fs.

  • 你画文字的y坐标是基线的高度,不是所有文字底部的高度

    例如看看这封信

    如果你在某个坐标 x,y 绘制这个字母,它的下部甚至会绘制在下方 您的 y 高度,而您的代码假定整个字母居中位于 yy[= 之间51=] + fs.


前一个问题很可能必须保留。如果您垂直居中以获得字母的确切外观,相邻单元格可能会有跳跃的基线,这看起来比一定程度的偏离中心更糟糕。

你的主要问题是后一种,你可以通过增加文字绘制高度(或降低边界绘制高度)fs倍绝对值来解决字体最大下降值。

您可以从字体的字体描述符 (PDFontDescriptor.getDescent()) 或字体的边界框 (PDFont.getBoundingBox()) 中检索字体下降