我只是试图重现您的rec.Height == 0.0
问题
iTextSharp.text.Rectangle rect = new iTextSharp.text.Rectangle(curBaseline[Vector.I1],
curBaseline[Vector.I2], topRight[Vector.I1], topRight[Vector.I2]);
Single curFontSize = rect.Height
这样做我假设您选择curBaseline
表示基线的起点和topRight
表示上升线的终点。Rectangle rect
我的结果(分别为 my 收到的每个TextRenderInfo
对象输出宽度和高度以及文本RenderListener
):
[140,29, 6,66] "nagement en beleid. Via omscholing ("
[ 11,87, 5,00] "PDB"
[ 4,95, 6,66] ", "
[ 9,36, 5,00] "MB"
[ 4,37, 5,00] "A"
[ 26,76, 6,66] ", deels "
[ 11,28, 5,00] "SPD"
[ 5,82, 6,66] ") "
[ 88,66, 6,66] "ben ik in het financiële v"
因此,“PDB”、“MB”、“A”和“SPD”的高度不是0.0,而是 5.00。
此结果是使用相当最新的 iText 版本生成的。因此,您可能希望首先更新您的库。如果这没有帮助,您可能希望在此处显示您的源代码以进行查看。
编辑
正如这里的评论中所讨论的,我扩展了测试类以提取实际字体大小(Tf操作数的大小以及应用当前转换和文本矩阵后的大小)。结果:
[140,29, 6,66, 8,50] "nagement en beleid. Via omscholing (" ([, , , AAHACD+SlimbachStd-Book] at 1,00)
[ 11,87, 5,00, 6,38] "PDB" ([, , , AAGNLJ+SlimbachStd-Book-SC750] at 1,00)
[ 4,95, 6,66, 8,50] ", " ([, , , AAGNLJ+SlimbachStd-Book-SC750] at 1,00)
[ 9,36, 5,00, 6,38] "MB" ([, , , AAGNLJ+SlimbachStd-Book-SC750] at 1,00)
[ 4,37, 5,00, 6,38] "A" ([, , , AAGNLJ+SlimbachStd-Book-SC750] at 1,00)
[ 26,76, 6,66, 8,50] ", deels " ([, , , AAHACD+SlimbachStd-Book] at 1,00)
[ 11,28, 5,00, 6,38] "SPD" ([, , , AAGNLJ+SlimbachStd-Book-SC750] at 1,00)
[ 5,82, 6,66, 8,50] ") " ([, , , AAHACD+SlimbachStd-Book] at 1,00)
[ 88,66, 6,66, 8,50] "ben ik in het financiële v" ([, , , AAHACD+SlimbachStd-Book] at 1,00)
如您所见,Tf字体大小始终为 1.0,小型大写字母的有效字体大小(缩放后)为 6.38。
由于我主要使用 iText(不是 iTextSharp),因此我也在 Java 中完成了必要的反射和自省工作。这是RenderText
我使用的实现代码:
public void renderText(TextRenderInfo renderInfo)
{
LineSegment curBaseline = renderInfo.getBaseline();
LineSegment curAscentline = renderInfo.getAscentLine();
Rectangle rect = new Rectangle(curBaseline.getStartPoint().get(Vector.I1),
curBaseline.getStartPoint().get(Vector.I2),
curAscentline.getEndPoint().get(Vector.I1),
curAscentline.getEndPoint().get(Vector.I2));
try {
System.out.printf(" [%6.2f, %6.2f, %6.2f] \"%s\" (%s at %6.2f)\n",
rect.getWidth(), rect.getHeight(),
getEffectiveFontSize(renderInfo),
renderInfo.getText(),
Arrays.asList(renderInfo.getFont().getFullFontName()[0]),
getFontSize(renderInfo));
} catch (Exception e) {
e.printStackTrace();
}
}
float getEffectiveFontSize(TextRenderInfo renderInfo)
throws IllegalArgumentException, SecurityException,
IllegalAccessException, InvocationTargetException,
NoSuchFieldException, NoSuchMethodException
{
Method convertHeight = TextRenderInfo.class.getDeclaredMethod("convertHeightFromTextSpaceToUserSpace", Float.TYPE);
convertHeight.setAccessible(true);
return (Float)convertHeight.invoke(renderInfo, getFontSize(renderInfo));
}
float getFontSize(TextRenderInfo renderInfo)
throws SecurityException, NoSuchFieldException,
IllegalArgumentException, IllegalAccessException
{
Field gsField = TextRenderInfo.class.getDeclaredField("gs");
gsField.setAccessible(true);
GraphicsState gs = (GraphicsState) gsField.get(renderInfo);
return gs.getFontSize();
}
.Net 内省和反射机制应该可以实现类似的技巧。