如何识别和纠正边界框问题?

时间:2017-10-24 03:17:53

标签: java pdf fonts pdfbox

这是一个简单的违规pdf

当我在下面运行DrawPrintTextLocations时,就是我所看到的......

enter image description here

但据我所知,边界框(上面的蓝色)应代表当您选择文字时在任何pdf阅读器中显示的灰色区域,如下所示。

enter image description here

如果pdf阅读器能够找出要突出显示的灰色区域,那么应该能够找出相同的颜色,从而得到字体大小(?)。这个问题适合任何人指出正确的方向。

以下是" T"的细节。在文本"测试线。"来自else对象变量TextPosition

text

问题:
 1. 边界框问题:当我打电话给72.4801 //text.getXDirAdj() 83.7600 //text.getYDirAdj() 1.0 //text.getFontSize() 50.0 //text.getFontSizeInPt() ::I'm unable to decipher the 50.0 12.0 //text.getXScale() ::Can I assume this to be the font size 8.004 //text.getHeightDir() 7.8984 //text.getWidthOfSpace() 7.1160 //text.getWidthDirAdj() 950.0 //fontDesc.getAscent() -222.0 //fontDesc.getDescent() [x=72.4801,y=75.7560,w=7.1160,h=8.0040] //Red Box boundaries [x=72.4801,y=46.3560,w=7.1160,h=66.9600] //The height of 66.96 relates to 50 but not sure how? //Blue Bounding Box boundaries 时,这似乎不一致。有没有解决这个问题?
 2. getFontSizeInPts():此方法似乎受边界框的影响。我这么认为是对的吗?(因为Pt中的字体大小显示为50)  3.获得FontSize的方法是什么?

我需要字体大小,因为我有一个任务是使用不同的字体重新创建pdf。

此处还有一个正确的pdf,但字体大小显示为16而不是最初使用的12。

对于具有适当边界框的类似pdf,以下是详细信息: -

DrawPrintTextLocations的输出

enter image description here

以下是" T"的细节。在文本"测试线。"来自font.getBoundingBox()对象变量TextPosition

text

使用MKL的答案后更新
以下是对我有用的......

72.0605           //text.getXDirAdj()
83.3199           //text.getYDirAdj()
16.0              //text.getFontSize()      :: Why is this showing 16 while my font is 12 in size
16.0              //text.getFontSizeInPt()
12.0101           //text.getXScale()        ::Can I assume this to be the font size 
6.6618            //text.getHeightDir()
2.6447            //text.getWidthOfSpace()
7.1193            //text.getWidthDirAdj()
778.808           //fontDesc.getAscent()    :: There seems to be an issue with the ascent
-222.1680         //fontDesc.getDescent()
[x=72.0605,y=76.6581,w=7.1193,h=6.6618]
                  //Red Box boundaries
[x=72.0605,y=72.6176,w=7.1193,h=13.3237]    //The height of 13.3237 relates to 12 the font size but not sure how?
                  //Blue Bounding Box boundaries

1 个答案:

答案 0 :(得分:1)

  
      
  1. Bounding Box问题:当我致电font.getBoundingBox()时,似乎这种情况并不一致。有解决方法吗?
  2.   

正如评论中已经提到的,我无法完全按照您的描述重现您的观察结果:我也得到第二个PDF的过度扩展的边界框!在这两种情况下,这与PDF中的字体信息一致,字体描述符 FontBBox 值分别为[-1475 -2463 2867 3117]和[-1474.60938 -2463.3789 2867.6758 3116.6992],两者均为非常大,前者似乎是后者的圆润版本。

您提供的第三个PDF(并替换为第二个)使用两种字体。用于实际"测试线的那个。"字符的字体描述符 FontBBox 值为[-19 -218 956 891],其值更正常。因此,DrawPrintTextLocations围绕这些角色绘制的蓝色框架更有意义。第二种字体有一个稍大的 FontBBox 值,[ - 1462 -813 1723 1134],结果是超过蓝色框架的两条蓝线:使用的其他字体中唯一的字符是零宽度空格,所以它们周围的方框也有零宽度......

因此,一切都是一致的。

可能的解决方法是不信任来自字体的PDF表示的信息,而是检查嵌入的字体程序

  
      
  1. getFontSizeInPts():此方法似乎受边界框的影响。我这么认为是对的吗?(因为Pt中的字体大小显示为50)
  2.   

没有。您必须意识到,在PDF中,绘制文本的比例取决于许多项目:

  • 首先是"字体大小"您使用 Tf 指令与字体一起设置;
  • 然后有一个文本矩阵可以向上或向下缩放这个大小;
  • 然后有当前的转换矩阵,它可以再次向上或向下缩放这个大小;
  • 最后还有 UserUnit 页面,可以再次缩放此尺寸。

在您的第一个文档中,您的字体大小为 1 ,文本矩阵会扩展为 50 ,然后当前的转换矩阵会再缩小为 12 UserUnit 默认值保留原样。

在您的第二个和第三个文档中,字体大小为 16 ,文本矩阵按原样保留,当前转换矩阵缩小为 12 ,再次离开正如 UserUnit 默认。

FontSizeInPts是在第二步之后得到的值(好吧,有点,只考虑文本矩阵的左上角)。正如您的文件中的情况所示,它基本上只是一个没有进一步兴趣的中间结果。此外,边界框不在计算中。

  
      
  1. 以点数获取FontSize的方法是什么?
  2.   

IMO你应该采用垂直线,只要字体大小值,应用文本矩阵和当前变换矩阵,取结果线的长度,并乘以页面 UserUnit

TextMatrix的{​​{1}}值已经合并了许多步骤;尽管它的名称是 PDF规范中指定的文本矩阵,但更多,参见其文件:

TextPosition

因此,如果/** * The matrix containing the starting text position and scaling. Despite the name, it is not the * text matrix set by the "Tm" operator, it is really the effective text rendering matrix (which * is dependent on the current transformation matrix (set by the "cm" operator), the text matrix * (set by the "Tm" operator), the font size (set by the "Tf" operator) and the page cropbox). * * @return The Matrix containing the starting text position */ public Matrix getTextMatrix() m,你只需要将它应用于点(0,0)和(0,1),将矩阵应用于它们,测量距离结果点,并将该距离乘以页面 UserUnit 值(通常为Matrix)。