使用pypdf提取PDF文本时部分文档坐标异常的问题求助
问题:PDF表单文本提取的坐标系异常问题
我有两份近乎相同的PDF表单,第一份通过610 < y < 628的坐标范围提取字段效果良好,但另一份提取失败,得到的y坐标≈332。我猜测是Crop Box未对齐(坐标基于Crop Box),于是将Crop Box设为与Media Box一致的坐标,重置原点,并打印尺寸确认未旋转。
重置原点的代码
def reset_origin(input_pdf: Path): pdf_file = open(input_pdf, 'rb') pdf_reader = PdfReader(pdf_file) pdf_writer = PdfWriter() for page_num, p in enumerate(pdf_reader.pages): page_obj = pdf_reader.pages[page_num] page_obj.cropbox.upper_right = (page_obj.mediabox.upper_right) page_obj.cropbox.lower_left = (page_obj.mediabox.lower_left) page_obj.cropbox.lower_left = (0, 0) print(f"upper_right media box is {page_obj.mediabox.upper_right} ") print(f"upper_right crop box is {page_obj.cropbox.upper_right}") pdf_writer.add_page(page_obj) pdf_file.close() pdf_output_file = open(input_pdf, 'wb') pdf_writer.write(pdf_output_file) pdf_output_file.close()
打印输出
upper_right media box is (612, 792) upper_right crop box is (612, 792)
两份PDF的上述输出一致。
设置提取范围为0 < y < 792时,仅能捕获以下区域内的文本:
upper_right = (610, 792) lower_left = (0, 200)
y < 200的文本丢失。
字段提取代码
def visitor(text, cm, tm, font_dict, font_size): ''' text = input text cm = transformation matrix tm = text matrix font_dict : unused font_size: unused ''' length = 792 x = tm[4] y=tm[5] if 0 < y < length: parts.append(text) parts = [] page = reader.pages[0] my_text=page.extract_text(visitor_text=visitor) my_text = "".join(parts) print(f"my text: {my_text}")
但将条件改为0 < y < length + 1000时,就能获取整页文本,包括y < 200的内容。
疑问与补充信息
- 无法理解:是否页面被旋转导致原点位于右上角?但为何文本的y坐标会超出Media Box的792?
- 版本信息:正常PDF为v1.3版本,由Ghostscript 8.51生成;异常PDF为v1.7版本,由Microsoft PDF Print生成。经过pypdf处理后,所有PDF均显示由pypdf生成。
提问
请问有什么方法可以修正该PDF的坐标系?比如重置旋转?
内容的提问来源于stack exchange,提问作者Steve Scott
相关产品推荐
相关产品推荐

