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

