我试图将文本垂直放在矩形中心,但它总是稍微偏离。
使用的字体是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()
}
答案 0 :(得分:1)
您实际上有两个问题需要解决:
对于给定的字体大小 fs ,几乎没有任何字母实际上具有 fs 的高度,通常短的字母序列也不会。 强>
您的代码假设它必须垂直居中高度 fs 的内容,但您使用大写字母而基线下方没有任何部分,因此它们的高度远小于 fs
用于绘制文字的y坐标是基线的高度,而不是所有文字底部的高度。
E.g。看看这封信
如果你在某个坐标 x , y 上绘制这个字母,它的下划线甚至会 y > height,而代码假设整个字母位于 y 和 y + fs 之间。
前一个问题很可能必须保留。如果你垂直居中以确定字母的确切外观,那么相邻的单元格可能会有跳跃的基线,这看起来比某种程度的偏离中心更糟糕。
你的主要问题是后者,你可以通过增加文本绘制的高度(或降低边界绘图的高度)来解决它 fs 乘以最大下降的绝对值字体。
您可以从字体的字体描述符(PDFontDescriptor.getDescent()
)或字体的边界框({{1}})中检索字体下降