如何向文件输出非ASCII字符?PyPDF中ANSI转义序列无法实现文本加粗的解决方案
解决PyPDF行内加粗及文件格式/非ASCII输出问题
首先得明确一个核心点:ANSI转义序列(比如\033[1m)是给终端模拟器设计的,PDF、CSV、TXT这类文件有自己的格式规范,根本不识别这些控制码,所以直接写入只会显示字面内容,这就是你遇到的问题根源。
下面分场景给你具体解决方案:
一、PyPDF实现行内文本加粗
PyPDF本身对行内混合格式的支持确实需要手动处理字体切换,步骤如下:
- 准备字体文件:你需要有常规和加粗版本的字体文件(比如
Arial.ttf和Arial Bold.ttf,可以从系统字体目录复制)。 - 加载字体并切换绘制:通过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
相关产品推荐
相关产品推荐

