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

使用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图片,即使修复语法错误,后续执行也会报错。
修复方法
  1. 修正参数类型注解:给路径参数添加str类型注解,具体路径值在调用函数时传入,而非写在函数定义中。
  2. 修正字符串格式化:使用标准f-string语法动态生成路径,比如f"C:/Users/capta/spyder-py3/row{row}filled.pdf"。
  3. 处理图片转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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 05:07:02