将.txt转为.pdf时输出失败,报UnicodeEncodeError错误求助
解决fpdf库生成PDF时的UnicodeEncodeError问题
错误原因
你遇到的UnicodeEncodeError是因为旧版fpdf库默认使用latin-1编码处理页面内容,而你的文本文件中包含了latin-1编码范围外的字符(比如中文、特殊符号等),导致编码失败。
解决方案
1. 升级到支持UTF-8的fpdf2库
旧版fpdf对UTF-8支持不佳,推荐使用其升级维护版本fpdf2,它原生支持UTF-8编码,且API与旧版兼容。
在Replit终端执行以下命令替换库:
pip uninstall fpdf pip install fpdf2
修改后的代码示例(兼容中英文):
from fpdf import FPDF pdf = FPDF() pdf.add_page() # 如果文本包含中文,需加载支持中文的字体(上传字体文件到Replit项目根目录) # 示例:上传NotoSansSC.ttf后加载字体 pdf.add_font("NotoSansSC", "", "NotoSansSC.ttf", uni=True) pdf.set_font("NotoSansSC", size=15) # 仅英文文本的话,直接用Arial即可(fpdf2中Arial已支持UTF-8) # pdf.set_font("Arial", size=15) # 读取文件时指定utf-8编码 with open("text-file-name.txt", "r", encoding="utf-8") as f: for line in f: # 去除换行符避免多余空行 pdf.cell(200, 10, txt=line.strip(), ln=1, align='C') pdf.output("completed.pdf")
2. 旧版fpdf的临时兼容方案(不推荐)
如果不想更换库,可以在读取文本时对字符进行转义处理,但会丢失或替换特殊字符:
from fpdf import FPDF pdf = FPDF() pdf.add_page() pdf.set_font("Arial", size=15) with open("text-file-name.txt", "r", encoding="utf-8") as f: for line in f: # 将无法用latin-1编码的字符替换为? processed_line = line.encode("latin-1", errors="replace").decode("latin-1") pdf.cell(200, 10, txt=processed_line, ln=1, align='C') pdf.output("completed.pdf")
3. 确保文本文件编码正确
确认你的text-file-name.txt文件本身是UTF-8编码,避免读取时出现乱码。在Replit中可以通过右键文件→"Encoding"选项查看和切换编码。
内容的提问来源于stack exchange,提问作者TheOriginal TwoSides
相关产品推荐
相关产品推荐

