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

如何用FPDF将FEN棋局生成的SVG直接插入PDF 无需保存中间文件

报错原因

你使用的旧版PyFPDF库的image方法仅支持传入字符串类型的文件路径,方法内部会调用路径的rfind方法提取文件后缀判断图片格式,而BytesIO对象没有该方法,因此触发属性错误。

修正后可全程内存运行的代码

首先安装依赖包:

pip install chess svglib reportlab fpdf2

完整代码:

from fpdf import FPDF
import chess
import chess.svg
import io
from svglib.svglib import svg2rlg
from reportlab.graphics import renderPM

FEN = "8/8/8/8/4N3/8/8/8 w - - 0 1"
# 生成棋盘SVG
board = chess.Board(FEN)
boardsvg = chess.svg.board(board, size=600)
# SVG字符串转StringIO对象供svglib读取
svg_io = io.StringIO(boardsvg)
drawing = svg2rlg(svg_io)
# 将SVG渲染为PNG写入BytesIO,不存本地
png_io = io.BytesIO()
renderPM.drawToFile(drawing, png_io, fmt='PNG')
# 指针回到BytesIO开头,避免读取为空
png_io.seek(0)

Margin = 25
ImageSize = 74

pdf = FPDF()
pdf.add_page()
# fpdf2原生支持BytesIO作为图片输入
pdf.image(png_io, Margin, Margin, w=ImageSize, h=ImageSize)
pdf.output('FPDFTestPage.pdf', 'F')
如果你不想替换旧版PyFPDF

可以给BytesIO对象手动添加带.png后缀的name属性,绕过格式检测逻辑,只要在pdf.image调用前加一行即可:

png_io.name = "temp.png"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 06:06:05