fpdf“UnicodeEncodeError:'latin-1'编解码器无法在位置88中编码字符'\u2013':序数不在范围内(256)”

4
我试图在Python中将文本文件转换为PDF,但是出现错误。发生了什么,我该如何解决?
以下是我的代码:
import fpdf
from fpdf import FPDF

pdf = FPDF()
pdf.add_page()
pdf.set_font("Arial", size=15)
f = open("textfile.txt", "r")
for i in f:
    pdf.cell(200, 10, txt=i, ln = 1, align = 'C')
pdf.output("Output.pdf")

输出:错误

    p = self.pages[n].encode("latin1") if PY3K else self.pages[n] 
UnicodeEncodeError: 'latin-1' codec can't encode character '\u2013' in position 88: ordinal not in range(256)

你正在尝试将Unicode字符编码为Latin-1 - 这是不可能的。你必须先替换它。 - fredrik
3个回答

1

在fpdf中,所有标准字体都使用latin-1编码。如果您想要写入不在latin-1字符集中的字符,则需要使用set_font指定外部字体。

Reference: https://pyfpdf.readthedocs.io/en/latest/reference/set_font/index.html

否则,您将需要将字符串转换为 latin-1(使用 encode 方法),并指定忽略或替换错误的字符(即在 latin-1 中不存在的字符)。

我的文本文件包含这种类型的内容。[{'id': 0, 'title': 'VOF-Verfahren – Ingenieurdienstleistungen für Technische Ausrüstung ELT (Anlagengruppe 4, 5, 6) gem § 53 HOAI, in Verbindung mit § 55 HOAI Leistungsphase 1-9 für den Neubau der Realschule Freising mit 2-fach Schulsporthalle.'}, {'id': 27, 'title': 'VOF-Verfahren – Ingenieurdienstleistungen für Technische Ausrüstung ELT (Anlagengruppe 4, 5, 6) gem § 53 HOAI, in Verbindung mit § 55 HOAI Leistungsphase 1-9 für den Neubau der Realschule Freising mit 2-fach Schulsporthalle.'}] - Mr X

0
我建议你将代码修改如下,因为这个方法对我来说非常好用:
for i in f:
    pdf.cell(200, 10, txt=i.encode('utf-8').decode('latin-1'), ln = 1, align = 'C')

-1

这是因为pyfpdf的默认字体是latin-1编码。

您需要下载一个utf-8编码的字体,比如Arial(https://www.freefontspro.com/14454/arial.ttf),将其放置在与Python文件相同的目录中,并使用以下代码添加该字体:

fpdf.add_font("Arial", "", "arial.ttf", uni=True)

当你设置字体时,请使用“Arial”


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接