1

在此处输入图像描述在一个 PDf 中,我得到了小型大写字母,字体大小为 0.0。我已经提取字体

using:------  

iTextSharp.text.Rectangle rect = new iTextSharp.text.Rectangle(curBaseline[Vector.I1], curBaseline[Vector.I2], topRight[Vector.I1], topRight[Vector.I2]);
Single curFontSize = rect.Height;

int 这段代码 curfontsize 我得到了 0.0。但我能够提取字体系列。但无法提取字体大小。所以文本没有显示。任何人都可以为此提供解决方案。有没有其他方法。?

谢谢你

4

1 回答 1

2

我只是试图重现您的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 内省和反射机制应该可以实现类似的技巧。

于 2013-04-01T22:08:52.390 回答