在rect pdfbox中垂直居中

时间:2016-02-04 17:18:16

标签: java pdfbox

我试图将文本垂直放在矩形中心,但它总是稍微偏离。

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

用于写入单元格的代码位于下方,图像显示垂直未对齐的单元格。

Uncentered cells

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()
}

1 个答案:

答案 0 :(得分:1)

您实际上有两个问题需要解决:

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

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

  • 用于绘制文字的y坐标是基线的高度,而不是所有文字底部的高度。

    E.g。看看这封信

    g

    如果你在某个坐标 x y 上绘制这个字母,它的下划线甚至会 y height,而代码假设整个字母位于 y y + fs 之间。

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

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

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