【问题标题】:fpdf "UnicodeEncodeError: 'latin-1' codec can't encode character '\u2013' in position 88: ordinal not in range(256)"fpdf“UnicodeEncodeError:'latin-1'编解码器无法在位置 88 编码字符'\u2013':序数不在范围内(256)”
【发布时间】:2021-04-16 18:35:24
【问题描述】:

我正在尝试在 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 - 这是无法完成的。您必须先更换它。

标签: python pyfpdf


【解决方案1】:

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

参考: 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.'}]
【解决方案2】:

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

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

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

当你设置字体时使用'Arial'

【讨论】:

    猜你喜欢
    • 2016-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    相关资源
    最近更新 更多