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

Python PDF加水印脚本单独运行正常,封装为函数后报错如何解决?

问题原因

你在函数内部重写覆盖了参数变量page的原始值:

  • 函数入参page原本是PDF文件路径的字符串类型
  • 执行到page = first_page.getPage(0)这一行时,page被赋值为PyPDF2的PageObject对象
  • 后续执行open(page, 'wb')时传入的已经是页面对象,自然触发类型错误

独立脚本没有报错的原因是你输出时用的是新文件名f'{name}_stamped.pdf',没有用到被覆盖后的page变量,所以没有触发这个隐藏问题。

修复方案

只要修改页面对象的变量名,避免覆盖原始路径参数即可,修复后的函数代码如下:

def coverize(page: str, name: str):
    from PyPDF2 import PdfFileWriter, PdfFileReader
    import io
    from reportlab.pdfgen import canvas
    from reportlab.lib.pagesizes import A4

    # Create new file (stamp)
    packet = io.BytesIO()
    can = canvas.Canvas(packet, pagesize=A4)
    can.setFillColorRGB(0, 0, 0)
    can.setFont('Helvetica', 8)
    pageWidth, pageHeight = A4
    can.drawString(pageWidth - 35, pageHeight - 20, f'{name}')
    can.save()

    # Move to the begin of StringIO buffer
    packet.seek(0)
    new_pdf = PdfFileReader(packet)

    # Reading first page
    first_page = PdfFileReader(open(page, 'rb'), strict=False)
    output = PdfFileWriter()

    # 修改变量名,避免覆盖路径参数page
    pdf_page = first_page.getPage(0)
    pdf_page.mergePage(new_pdf.getPage(0))
    output.addPage(pdf_page)

    with open(page, 'wb') as outputStream:
        output.write(outputStream)

额外注意:直接覆盖原PDF文件前建议提前备份原文件,避免写入过程中程序异常导致原文件损坏。

内容的提问来源于stack exchange,提问作者Francesco Anastasio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 10:12:01