You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 14:27:02