在矩形 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 高度,而您的代码假定整个字母居中位于 y 和 y[= 之间51=] + fs.
前一个问题很可能必须保留。如果您垂直居中以获得字母的确切外观,相邻单元格可能会有跳跃的基线,这看起来比一定程度的偏离中心更糟糕。
你的主要问题是后一种,你可以通过增加文字绘制高度(或降低边界绘制高度)fs倍绝对值来解决字体最大下降值。
您可以从字体的字体描述符 (PDFontDescriptor.getDescent()
) 或字体的边界框 (PDFont.getBoundingBox()
) 中检索字体下降
我试图将文本在矩形内垂直居中,但它总是偏离一点点。
使用的字体是 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 高度,而您的代码假定整个字母居中位于 y 和 y[= 之间51=] + fs.
前一个问题很可能必须保留。如果您垂直居中以获得字母的确切外观,相邻单元格可能会有跳跃的基线,这看起来比一定程度的偏离中心更糟糕。
你的主要问题是后一种,你可以通过增加文字绘制高度(或降低边界绘制高度)fs倍绝对值来解决字体最大下降值。
您可以从字体的字体描述符 (PDFontDescriptor.getDescent()
) 或字体的边界框 (PDFont.getBoundingBox()
) 中检索字体下降