解析 unstructured pdfminer_utils.py rect_to_bbox 坐标转换函数
- 1. 函数定义
- 2. 函数说明
- 3. 函数实现
- 举例说明
- 总结
今天,我们来学习一个有趣的Python函数。这个函数可以帮助我们转换PDF文档中的坐标。虽然听起来很复杂,但是我们可以通过一个简单的例子来理解它。
1. 函数定义
def rect_to_bbox(rect: Tuple[float, float, float, float],height: float,
) -> Tuple[float, float, float, float]:
这行代码定义了一个名为rect_to_bbox
的函数。它需要两个参数:
rect
: 这是一个包含4个小数的元组,代表PDF中一个矩形的坐标。height
: 这是一个小数,表示PDF页面的高度。
函数会返回一个新的包含4个小数的元组,这个元组代表转换后的坐标。
2. 函数说明
"""
Converts a PDF rectangle coordinates (x1, y1, x2, y2) to a bounding box in the specified
coordinate system where the vertical axis is measured from the top of the page.
"""
这段注释解释了函数的作用:它把PDF中的矩形坐标转换成一个新的坐标系统。在新的系统中,我们从页面的顶部开始测量竖直方向的距离。
3. 函数实现
x1, y2, x2, y1 = rect
y1 = height - y1
y2 = height - y2
return (x1, y1, x2, y2)
这是函数的主要部分。让我们一步步来看:
x1, y2, x2, y1 = rect
: 这行代码把rect
中的4个数字分别赋值给x1
,y2
,x2
,y1
。y1 = height - y1
: 这行代码计算新的y1
值。y2 = height - y2
: 这行代码计算新的y2
值。return (x1, y1, x2, y2)
: 最后,函数返回新的坐标。
举例说明
想象你有一张很大的纸(这就是我们的PDF页面),纸的高度是100厘米。
在这张纸上,有一个小方框,它的坐标是(10, 20, 30, 40)。这里:
- 10 是左边缘到纸左边的距离
- 20 是下边缘到纸底部的距离
- 30 是右边缘到纸左边的距离
- 40 是上边缘到纸底部的距离
但是,我们想要改变测量方式。我们想从纸的顶部开始测量,而不是从底部。
这时,我们就可以使用rect_to_bbox
函数:
new_coordinates = rect_to_bbox((10, 20, 30, 40), 100)
函数会这样计算:
- x1 还是 10 (左边缘到纸左边的距离不变)
- 新的y1 = 100 - 40 = 60 (从顶部到上边缘的距离)
- x2 还是 30 (右边缘到纸左边的距离不变)
- 新的y2 = 100 - 20 = 80 (从顶部到下边缘的距离)
所以,new_coordinates
的值会是(10, 60, 30, 80)。
这就像我们把纸翻了个个,从上面开始量尺寸,而不是从下面开始。但是左右的距离保持不变。
通过这种方式,我们就可以更方便地处理PDF中的坐标了!
总结
这个函数虽然看起来复杂,但它其实就是在帮我们"翻转"坐标系。它让我们可以更容易地理解和使用PDF中的位置信息。