Python合并PDF后添加文本报错‘cannot save with zero pages’求助
问题:合并PDF后添加题号报错“cannot save with zero pages”
我正在编写Python代码,从Excel工作簿中获取PDF文件路径并合并,再给合并后的文档每页添加题号。目前单独执行合并PDF和给PDF添加文本的操作都可行,但无法一次性完成整套流程,反复出现“cannot save with zero pages”错误。我能正常保存合并后的文件,且将其他PDF路径传入自定义函数也能成功添加文本,附上代码如下:
from pypdf import PdfMerger def insert_qu_numbers(document): qu_numbers = fitz.open(document) counter = 0 for page in qu_numbers: page.clean_contents() counter += 1 text = f"Question {counter}" text_length = fitz.get_text_length(text, fontname= "times-roman") print(text_length) rect_x0 = 70 rect_y0 = 50 rect_x1 = rect_x0 + text_length + 35 rect_y1 = rect_y0 + 40 rect = fitz.Rect(rect_x0, rect_y0, rect_x1, rect_y1) page.insert_textbox(rect, text, fontsize = 16, fontname = "times-roman", align = 0) qu_numbers.write() # opens the workbook and gets the file paths. wbxl = xw.Book('demo.xlsm') get_links = wbxl.sheets['Sheet1'].range('C2:C5').value # gets rid of any blank cells in range and makes a list of all the file paths called filenames filenames = [] for file in get_links: if file is not None: filenames.append(file) # gets each file path from filename list and adds it to merged pdf where it will be merged merged_pdf = PdfMerger() for i in range(len(filenames)): merged_pdf.append(filenames[i], 'rb') # merges separate file paths into one pdf and names it the output name in the given cell output_name = wbxl.sheets['Sheet1'].range('C7').value final = merged_pdf.write(output_name + ".pdf") insert_qu_numbers(final)
解决方案
问题根源
PdfMerger.write()返回值错误:该方法返回的是写入文件的字节数,不是PDF文件路径或对象。你把这个数值传给insert_qu_numbers函数,fitz.open()会将其识别为无效路径,从而创建一个空PDF,触发“zero pages”错误。insert_qu_numbers函数未正确保存修改:qu_numbers.write()未指定保存路径,无法将修改后的内容写入文件;同时未关闭文档对象,可能导致资源泄漏。- 未关闭
PdfMerger对象:合并完成后未释放文件资源,可能导致后续无法修改生成的PDF。
修复后的完整代码
from pypdf import PdfMerger import fitz # PyMuPDF import xw # xlwings库 def insert_qu_numbers(document_path): qu_numbers = fitz.open(document_path) counter = 0 for page in qu_numbers: page.clean_contents() counter += 1 text = f"Question {counter}" text_length = fitz.get_text_length(text, fontname="times-roman") rect_x0 = 70 rect_y0 = 50 rect_x1 = rect_x0 + text_length + 35 rect_y1 = rect_y0 + 40 rect = fitz.Rect(rect_x0, rect_y0, rect_x1, rect_y1) page.insert_textbox(rect, text, fontsize=16, fontname="times-roman", align=0) # 将修改后的内容写入原文件,也可指定新路径另存 qu_numbers.write(document_path) qu_numbers.close() # 读取Excel中的PDF路径 wbxl = xw.Book('demo.xlsm') get_links = wbxl.sheets['Sheet1'].range('C2:C5').value # 过滤空值,生成有效文件路径列表 filenames = [file for file in get_links if file is not None] # 合并PDF文件 merged_pdf = PdfMerger() for file_path in filenames: merged_pdf.append(file_path) # 获取输出文件名并保存合并后的PDF output_name = wbxl.sheets['Sheet1'].range('C7').value output_path = f"{output_name}.pdf" merged_pdf.write(output_path) merged_pdf.close() # 关闭合并器,释放文件资源 # 给合并后的PDF添加题号 insert_qu_numbers(output_path)
关键修改点
- 直接将合并后的PDF文件路径传给
insert_qu_numbers,而非write()的返回值。 insert_qu_numbers函数中明确指定保存路径,完成修改后关闭文档对象。- 合并完成后调用
merged_pdf.close(),避免文件被锁定无法编辑。 - 用列表推导式简化有效文件路径的过滤逻辑,代码更简洁。
内容的提问来源于stack exchange,提问作者Jon Percival
相关产品推荐
相关产品推荐

