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

如何向文件输出非ASCII字符?PyPDF中ANSI转义序列无法实现文本加粗的解决方案

解决PyPDF行内加粗及文件格式/非ASCII输出问题

首先得明确一个核心点:ANSI转义序列(比如\033[1m)是给终端模拟器设计的,PDF、CSV、TXT这类文件有自己的格式规范,根本不识别这些控制码,所以直接写入只会显示字面内容,这就是你遇到的问题根源。

下面分场景给你具体解决方案:

一、PyPDF实现行内文本加粗

PyPDF本身对行内混合格式的支持确实需要手动处理字体切换,步骤如下:

  1. 准备字体文件:你需要有常规和加粗版本的字体文件(比如Arial.ttf和Arial Bold.ttf,可以从系统字体目录复制)。
  2. 加载字体并切换绘制:通过PyPDF的内容流来切换字体,实现部分文本加粗:
from pypdf import PdfWriter, PageObject

# 创建PDF写入器和空白页
writer = PdfWriter()
page = PageObject.create_blank_page(width=600, height=400)

# 添加常规和加粗字体到PDF
# 注意替换为你实际的字体文件路径
writer.add_font("Arial-Regular", "path/to/Arial.ttf")
writer.add_font("Arial-Bold", "path/to/Arial Bold.ttf")

# 构建内容流,实现行内混合格式
content = [
    "BT",  # 开始文本块
    "/Arial-Regular 12 Tf",  # 设置常规字体,字号12
    "100 350 Td",  # 移动到文本起始位置(x=100, y=350)
    "这是常规文本,接下来是",  # 常规文本内容
    " Tj",  # 绘制文本
    "/Arial-Bold 12 Tf",  # 切换到加粗字体
    "加粗的部分",  # 加粗文本内容
    " Tj",
    "/Arial-Regular 12 Tf",  # 切回常规字体
    ",然后又回到常规。",
    " Tj",
    "ET"  # 结束文本块
]

# 将内容流添加到页面
page.add_content_stream("\n".join(content))

# 保存PDF
writer.add_page(page)
with open("formatted_output.pdf", "wb") as f:
    writer.write(f)

如果你觉得这种方式太繁琐,也可以考虑用PyMuPDF(fitz),它的行内格式处理更直观:

import fitz

doc = fitz.open()
page = doc.new_page()

# 创建文本块,用<b>标签标记加粗内容
text = "这是常规文本,<b>这是加粗文本</b>,回到常规。"
# 在页面指定位置插入富文本
page.insert_textbox(fitz.Rect(50, 50, 550, 350), text, fontsize=12, fontname="helv", color=(0,0,0))

doc.save("mupdf_output.pdf")
doc.close()

二、CSV/TXT文件的格式问题

  • TXT文件:纯文本格式本身不支持任何格式(加粗、颜色等),只能保存纯字符内容。如果需要格式,得改用RTF(富文本格式),可以用Python的python-docx或者rtf库来生成。
  • CSV文件:同样是纯文本表格,不支持单元格内的部分格式。如果需要带格式的表格,建议生成Excel文件(用openpyxl库),它可以实现单元格内的部分文本加粗:
from openpyxl import Workbook
from openpyxl.styles import Font

wb = Workbook()
ws = wb.active

# 创建单元格,设置部分文本加粗
cell = ws["A1"]
cell.value = "常规文本"
# 添加加粗文本
cell.value += " "
run = cell._value.add_run("加粗文本")
run.font = Font(bold=True)
cell.value += " 常规文本"

wb.save("formatted_excel.xlsx")

三、正确输出非ASCII字符到文件

只要在写入文件时指定UTF-8编码,就能正确保存非ASCII字符,避免乱码:

# 写入TXT
with open("non_ascii.txt", "w", encoding="utf-8") as f:
    f.write("包含中文、日文:こんにちは!")

# 写入CSV
import csv
with open("non_ascii.csv", "w", encoding="utf-8", newline="") as f:
    writer = csv.writer(f)
    writer.writerow(["姓名", "年龄"])
    writer.writerow(["张三", 25])

内容的提问来源于stack exchange,提问作者TTT2

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 16:42:45