当前位置: 首页 > 知识库问答 >
问题:

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

宣星光
2023-03-14

下面是一个简单的冒犯性pdf。

当我运行DrawPrintTextLocations时,下面是我看到的。。

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

如果pdf阅读器能够计算出高亮显示的灰色区域,就应该能够计算出相同的灰色区域,从而得到字体大小(?)。这个问题适合任何人给我指出正确的方向。

以下是文本“测试线”中“T”的详细信息从其TextPosition对象变量text

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

问题:
1.边界框问题:当我调用font.getBoundingBox()时,似乎这是不一致的。有解决这个问题的方法吗?
2. getFontSizeInPts():这种方法似乎受到边界框的影响。我这么想对吗?(因为Pt中的字体大小显示为50)
3.用点来获取字体大小的方法是什么?

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

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

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

DrawPrintTextLocations的输出为

以下是文本“测试线”中“T”的详细信息从其TextPosition对象变量text

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

在使用MKL的答案后进行了更新
以下内容对我有效。。。

//Make Line
Line2D.Float line = new Line2D.Float(0,0,0,1f);
LOG.debug("Line<Before Transform>:" + line.getBounds2D());
s=myTextMatrix.createAffineTransform().createTransformedShape(line);
LOG.debug("Line after AT:"+s.getBounds2D());
s=pageFlipAffineTransform.createTransformedShape(s);
s=pageRotateAffineTransform.createTransformedShape(s);
rect2 = s.getBounds2D();
LOG.debug("Line<After Transform>:" + rect2);
//Font Size
double wi=rect2.getWidth();
double he=rect2.getHeight();
double total=Math.sqrt(wi*wi+he*he);//This is done in case of rotation
long fntSizeinPt = Math.round(total);
LOG.debug("deciphered Font Size is:" + fntSizeinPt);            

共有1个答案

孔棋
2023-03-14
  1. 边界框问题:当我调用font时,这似乎不一致。getBoundingBox()。有没有解决办法

正如在评论中已经提到的,我不能准确地再现你所描述的观察结果:我也得到了第二个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表示形式中的信息,而是检查嵌入的字体程序

不可以。您必须知道,在PDF中,绘制文本的比例取决于多个项目:

  • 首先是使用Tf指令设置的字体大小
  • 然后是文本矩阵,它可以放大或缩小这个大小
  • 然后是电流变换矩阵,它再次可以放大或缩小这个尺寸
  • 最后是页面UserUnit值,它可以再次放大这个大小

在您的第一个文档中,字体大小为1,文本矩阵将放大到50,当前转换矩阵将再次缩小到12,用户单位默认值保持不变。

在第二个和第三个文档中,字体大小为16,文本矩阵保持原样,当前转换矩阵缩小为12,再次保持UserUnit默认值的原样。

FontSizeInPts是第二步之后得到的值(嗯,有点像,只考虑文本矩阵左上角的条目)。正如你们文件中的情况所示,这本质上只是一个中间结果,没有进一步的兴趣。此外,边界框未参与其计算。

IMO您应该取一条与字体大小值一样长的垂直线,应用文本矩阵和当前转换矩阵,取结果行的长度,并将其乘以页面UserUnit值。

TextPositionTextMatrix值已经结合了许多这些步骤;尽管名称不同,但它不是PDF规范中规定的文本矩阵,而是更多,参见其文档:

/**
 * 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),将矩阵应用于点,测量结果点的距离,并将该距离乘以页面用户单位值(通常为1)。

 类似资料:
  • 给定一个Geopandas GeoDataFrame,我想提取GeoDataFrame的总边界,由单元缓冲。 通过,我可以访问整个DataFrame中组合几何的非缓冲边界。我想到的一种方法是取这些边界,将它们转换为Shapely多边形,然后缓冲它。

  • 问题内容: 我正在使用python-tesseract从图像中提取单词。这是tesseract的python包装器,它是一个OCR代码。 我正在使用以下代码来获取单词: 这仅返回单词,而不返回它们在图像中的位置/大小/方向(或换句话说,包含它们的边界框)。我想知道是否还有办法 问题答案: 采用 在返回的数据中: 是从边界框的左上角到图像左边界的距离。 是从边界框的左上角到图像顶部的距离。 和是边框

  • 我需要将matplotlib图形保存到pdf。我遵循Matplotlib howto上的说明,只是不显示结果,而是将其保存为pdf。奇怪的是,pdf画布不受画布大小的影响。相反,保存为png可以在放大的画布上正常工作。 pdf图像的截屏 更新 对标题和轴标记执行此操作,但如果图例位于框架外部,则忽略图例,如下图所示。请注意,我将图例放置在图形的右侧。

  • 主要内容:分配算法,回收算法本节介绍一种解决系统中内存碎片过多而无法使用的方法—— 边界标识法。 在使用边界标识法的系统管理内存时,可利用空间表中的结点的构成如图 1: 图 1 结构构成 每个结点中包含 3 个区域, head 域、 foot 域 和  space 域: space 域表示为该内存块的大小,它的大小通过 head 域中的 size 值表示。 head 域中包含有 4 部分:llink 和 rlink 分别表示

  • 在前面的一些章节中,我们介绍了诸多用于图像分类的模型。在图像分类任务里,我们假设图像里只有一个主体目标,并关注如何识别该目标的类别。然而,很多时候图像里有多个我们感兴趣的目标,我们不仅想知道它们的类别,还想得到它们在图像中的具体位置。在计算机视觉里,我们将这类任务称为目标检测(object detection)或物体检测。 目标检测在多个领域中被广泛使用。例如,在无人驾驶里,我们需要通过识别拍摄到

  • 我正在为学校写一个充当收银机的程序。我要求输入项目的价格,并将它们播放到一个正在进行的ArrayList中,直到用户输入-1或0。0是在错误的情况下重新输入以前的价格,-1终止循环。 我得到了 我在Eclipse中运行Java11。 在不使用该方法的情况下,代码运行良好,因为我减少了计数器,并且在循环的下一次迭代中,无论是否删除了以前的数组位置,都将覆盖它。方法本身被设置为删除ArrayList.