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

