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

Python双栏A4转A5PDF报错:KeyError未解析正向引用

解决双栏A4转A5 PDF的KeyError问题及实现方案

问题根源

你遇到的KeyError是因为PyPDF2对PDF的正向引用(交叉引用表中的未解析条目)处理存在缺陷,尤其是面对带双栏、复杂章节结构的PDF时,无法正确解析所有引用对象,导致访问不存在的字典键值。

替代实现方案(用PyMuPDF)

PyMuPDF(fitz)对复杂PDF的解析兼容性更强,能稳定处理双栏布局和书签结构,以下是完整实现代码,满足:

  • 将A4双栏的左右栏分别转为A5页面(自动缩放匹配A5宽度)
  • 完整保留原PDF的章节书签
  • A5页数为原A4的2倍(符合要求)
import fitz

def a4_two_col_to_a5(input_pdf_path, output_pdf_path):
    # 定义A4和A5的尺寸(单位:点,1点=1/72英寸)
    A4_WIDTH = 595.28
    A4_HEIGHT = 841.89
    A5_WIDTH = 420.94
    A5_HEIGHT = 595.28
    
    doc = fitz.open(input_pdf_path)
    output_doc = fitz.open()
    
    # 处理每个页面的双栏分割
    for page_num in range(len(doc)):
        page = doc[page_num]
        rect = page.rect
        # 分割为左右两栏
        left_col_rect = fitz.Rect(rect.x0, rect.y0, rect.x0 + rect.width/2, rect.y1)
        right_col_rect = fitz.Rect(rect.x0 + rect.width/2, rect.y0, rect.x1, rect.y1)
        
        # 左栏转A5页面
        a5_page = output_doc.new_page(width=A5_WIDTH, height=A5_HEIGHT)
        scale = A5_WIDTH / (rect.width/2)
        a5_page.show_pdf_page(a5_page.rect, doc, page_num, clip=left_col_rect, scale=scale)
        
        # 右栏转A5页面
        a5_page = output_doc.new_page(width=A5_WIDTH, height=A5_HEIGHT)
        a5_page.show_pdf_page(a5_page.rect, doc, page_num, clip=right_col_rect, scale=scale)
    
    # 复制并调整原PDF的书签(章节)
    original_bookmarks = doc.get_toc()
    adjusted_bookmarks = []
    for bm in original_bookmarks:
        adjusted_bm = bm.copy()
        # 原第N页的书签对应新的第2N页(左栏页面)
        adjusted_bm[2] = bm[2] * 2
        adjusted_bookmarks.append(adjusted_bm)
    
    output_doc.set_toc(adjusted_bookmarks)
    output_doc.save(output_pdf_path)
    output_doc.close()
    doc.close()

# 调用示例
a4_two_col_to_a5("input_a4.pdf", "output_a5.pdf")

代码说明

  • 双栏分割:将每个A4页面按宽度均分,提取左右两个栏的区域
  • 缩放适配:按A5页面宽度与原栏宽度的比例缩放内容,确保栏宽完全匹配A5
  • 书签保留:将原书签的页码映射为新的A5页码,保证章节跳转正确
  • 稳定性:PyMuPDF内置的PDF解析引擎能处理绝大多数复杂引用问题,避免KeyError

原PyPDF2方案报错原因

PyPDF2的交叉引用表解析逻辑不够健壮,当PDF中存在未完全解析的正向引用(比如某些书签或页面资源的延迟加载引用)时,会尝试访问不存在的字典键,从而触发KeyError。PyMuPDF采用了更成熟的解析机制,能自动处理这类引用问题。

内容的提问来源于stack exchange,提问作者Neo-S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 04:12:36