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

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)
解决方案

问题根源

  1. PdfMerger.write()返回值错误:该方法返回的是写入文件的字节数,不是PDF文件路径或对象。你把这个数值传给insert_qu_numbers函数,fitz.open()会将其识别为无效路径,从而创建一个空PDF,触发“zero pages”错误。
  2. insert_qu_numbers函数未正确保存修改:qu_numbers.write()未指定保存路径,无法将修改后的内容写入文件;同时未关闭文档对象,可能导致资源泄漏。
  3. 未关闭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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:51:56