PDF识别中出现位置偏移
在识别PDF中,使用OCR技术或者基于传统技术进行识别,可能会出现一些位置偏移的识别结果。还有一些文本或列表不是水平或者竖直的,存在一些角度偏移,影响识别的结果。因此,我们需要提供一些相应的算法来解决这些问题。
分辨率和PDF坐标单位的转换
PDF中在识别时会根据场景的不同用到不同的数据单位,有些单位是inch,有些单位是pixel.在识别时会有差异,根据不同(DPI)Dots Per Inch,坐标也不一样。OCR过程中使用的DPI与PDF渲染的DPI不同步。同时,如果PDF在不同的设备或应用中以不同的缩放级别显示,坐标也可能不一致。
坐标系转换
在不同坐标系统之间进行转换时(例如从英寸到像素),可能会因为精度问题导致偏移。使用一致的DPI可以解决大部分问题。
DPI和Inch的转换公式和像素坐标的计算
像素坐标=英寸坐标×DPI
PS:常见的DPI值是72、96、150、300
代码的例子如下
# Define the DPI
dpi = 72
# Define the inch coordinates
inch_coords = [(1.9106, 1.4107), (1.977, 1.4105), (1.9741, 1.5094), (1.9075, 1.509)]
# Convert inch coordinates to pixel coordinates
pixel_coords = [(x * dpi, y * dpi) for x, y in inch_coords]
# Print the pixel coordinates
pixel_coords
上面可能会存在精度丢失的问题,造成页面局部位置的偏移
确定DPI的方法
import PyPDF2
pdf_file = open('example.pdf', 'rb')
pdf_reader = PyPDF2.PdfFileReader(pdf_file)
doc_info = pdf_reader.getDocumentInfo()
print(doc_info)
import fitz # PyMuPDF
pdf_document = fitz.open('example.pdf')
# 获取第一页
page = pdf_document[0]
# 获取页面的矩形区域(像素)
pix = page.get_pixmap()
width_in_pixels = pix.width
height_in_pixels = pix.height
# 获取页面的尺寸(英寸)
width_in_inches = page.rect.width / 72 # 默认单位是points,每英寸72points
height_in_inches = page.rect.height / 72
# 计算DPI
dpi_x = width_in_pixels / width_in_inches
dpi_y = height_in_pixels / height_in_inches
# 输出DPI
print(f'DPI X: {dpi_x}, DPI Y: {dpi_y}')
精度问题造成的页面偏移可以通过使用高精度浮点数来减少误差,或者在导入PDF文件是保证DPI的数值是一致的。
确定文本的倾斜角度的方法
- 霍夫变换,Hough变换是一种图像处理技术,用于检测图像中的直线。通过检测文本行的直线并计算它们的角度,可以估计文本的倾斜角度。
- 使用最小二乘法拟合曲线,判断倾斜角度
- 使用投影分析找相应的角度