使用pypdf时出现pyflakes E语法错误的原因及修复方案
问题描述
参考pypdf官方文档编写添加水印的代码时,stamp函数的第2-4行出现「Syntax error in forward annotation code line (pyflakes E)」语法错误。尝试修改路径的斜杠方向后问题仍存在,完整代码如下:
from pathlib import Path from typing import Union, Literal, List from pypdf import Transformation from pypdf import PdfWriter, PdfReader def stamp( content_pdf:"C:/Users/capta/spyder-py3/f'row{row}filled.pdf", stamp_pdf: "C:/Users/capta/Pictures/whitesq.png", pdf_result: "C:/Users/capta/spyder-py3/f'row{row}done.pdf", page_indices: Union[Literal["ALL"], List[int]] = "ALL", ): stamp_page = PdfReader(stamp_pdf).pages[0] writer = PdfWriter() reader = PdfReader(content_pdf) if page_indices == "ALL": page_indices = list(range(0, len(reader.pages))) for index in page_indices: content_page = reader.pages[index] content_page.merge_transformed_page( stamp_page, Transformation.translate(5,5), Transformation() ) writer.add_page(content_page) with open(pdf_result, "wb") as fp: writer.write(fp)
错误成因
- 参数类型注解语法错误:函数参数定义时,冒号后应填写类型(如
str),而非直接写字符串路径值。将具体路径放在参数注解位置,违反了Python语法规则。 - 字符串格式化逻辑混乱:
"C:/Users/capta/spyder-py3/f'row{row}filled.pdf"中错误嵌套了f'row{row}',引号混用且不符合f-string规范,Python无法解析该语法。 - 隐藏运行时错误:
PdfReader仅支持读取PDF文件,无法直接加载PNG图片,即使修复语法错误,后续执行也会报错。
修复方法
- 修正参数类型注解:给路径参数添加
str类型注解,具体路径值在调用函数时传入,而非写在函数定义中。 - 修正字符串格式化:使用标准f-string语法动态生成路径,比如
f"C:/Users/capta/spyder-py3/row{row}filled.pdf"。 - 处理图片转PDF:先将PNG图片转换为单页PDF,再作为水印源文件使用。
修复后的完整代码:
from typing import Union, Literal, List from pypdf import Transformation, PdfWriter, PdfReader from PIL import Image def stamp( content_pdf: str, stamp_pdf: str, pdf_result: str, page_indices: Union[Literal["ALL"], List[int]] = "ALL", ): stamp_page = PdfReader(stamp_pdf).pages[0] writer = PdfWriter() reader = PdfReader(content_pdf) if page_indices == "ALL": page_indices = list(range(len(reader.pages))) for index in page_indices: content_page = reader.pages[index] # 合并水印页,通过Transformation参数调整位置 content_page.merge_transformed_page( stamp_page, Transformation.translate(5, 5) ) writer.add_page(content_page) with open(pdf_result, "wb") as fp: writer.write(fp) def image_to_pdf(image_path: str, output_pdf_path: str): # 将PNG图片转为单页PDF,处理透明背景 image = Image.open(image_path) # 创建白色背景,解决透明背景显示问题 with Image.new("RGB", image.size, (255, 255, 255)) as bg: if image.mode == "RGBA": bg.paste(image, mask=image.split()[3]) else: bg.paste(image) bg.save(output_pdf_path, "PDF", resolution=100.0) # 调用示例(需先定义row变量) row = 1 # 转换图片为PDF stamp_pdf_path = "temp_watermark.pdf" image_to_pdf("C:/Users/capta/Pictures/whitesq.png", stamp_pdf_path) # 执行水印添加 stamp( content_pdf=f"C:/Users/capta/spyder-py3/row{row}filled.pdf", stamp_pdf=stamp_pdf_path, pdf_result=f"C:/Users/capta/spyder-py3/row{row}done.pdf" )
内容的提问来源于stack exchange,提问作者Evan Hyde
相关产品推荐
相关产品推荐

