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

将.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 16:45:31