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
相关产品推荐
相关产品推荐

