
本文详细探讨了在Python `borb`库中处理西里尔字母的挑战与解决方案,特别是针对需要精细字符控制和高性能的场景。文章首先介绍了使用`Paragraph`和`Rectangle`的高层API方法,指出了其在处理大量字符时的性能瓶颈。随后,深入分析了基于低层PDF内容流操作的优化方案,并重点阐述了如何正确集成自定义TrueType字体以支持西里尔字母,同时解决了字符编码问题,最终实现了显著的性能提升。
在borb库中处理非拉丁字符集,如西里尔字母,常常会遇到字体支持问题。borb默认的字体可能不包含西里尔字母的字形,导致字符无法正确显示。对于需要精确控制每个字符位置的应用场景,如PDF文档的字符级修改,问题会变得更加复杂。本文将介绍两种在borb中实现西里尔字母渲染的方法:一种是易于理解但效率较低的高层API方法,另一种是性能优越但需要深入理解PDF底层机制的低层内容流方法。我们将重点解决如何在低层方法中正确集成自定义TrueType字体并处理西里尔字母编码。
borb提供了一套高层API,通过Paragraph和Rectangle对象可以相对直观地在PDF页面上放置文本。这种方法允许用户指定自定义字体,从而解决西里尔字母的显示问题。
首先,需要加载一个支持西里尔字母的TrueType字体(.ttf文件)。然后,对于每个要渲染的字符,创建一个Paragraph实例,并指定其字体、大小和内容。最后,使用paint方法将其绘制到指定Rectangle区域内的页面上。
以下是实现此方法的示例代码:
from pathlib import Path
from decimal import Decimal
from borb.pdf.canvas.layout.text.paragraph import Paragraph
from borb.pdf.canvas.layout.shape.rectangle import Rectangle
from borb.pdf.canvas.font.true_type_font import TrueTypeFont
from borb.pdf.canvas.font.font import Font
from borb.pdf.page.page import Page
# 假设 symb_arr 是一个包含 Symbol 对象的数组
# class Symbol:
# def __init__(self, s, x, y, w, h, f):
# self.sym = s # character
# self.x_coord = x
# self.y_coord = y
# self.width = w
# self.height = h
# self.font_size = f
# 1. 加载自定义TrueType字体
font_path: Path = Path(__file__).parent / "TimesNewRomanRegular.ttf"
custom_font: Font = TrueTypeFont.true_type_font_from_file(font_path)
# 假设 page 是一个 borb.pdf.page.page.Page 对象
# 假设 symb_arr 是 Symbol 对象的列表
# 假设 font_size 已经定义
for i, s in enumerate(symb_arr):
r: Rectangle = Rectangle(
Decimal(s.x_coord),
Decimal(s.y_coord),
Decimal(s.width + 2),
Decimal(s.height + 2),
)
Paragraph(s.sym, font_size=Decimal(s.font_size), font=custom_font).paint(page, r)为了实现更高的性能,可以直接操作PDF的内容流(Content Stream)。PDF内容流使用一系列操作符来描述页面内容,例如设置字体、定位文本和显示文本等。这种方法提供了对PDF渲染过程的精细控制,但需要更深入地理解PDF规范。
PDF内容流是一系列指令的序列,这些指令被压缩并存储在页面对象的Contents字典中。通过构建这些指令,可以直接控制文本的渲染。
以下是使用低层语法渲染文本的示例代码:
import zlib
from decimal import Decimal
from borb.pdf.canvas.layout.text.paragraph import Paragraph
from borb.pdf.canvas.layout.shape.rectangle import Rectangle
from borb.pdf.canvas.font.true_type_font import TrueTypeFont
from borb.pdf.canvas.font.font import Font
from borb.pdf.page.page import Page
from borb.pdf.document.document import Document
from borb.pdf.canvas.geometry.rectangle import Rectangle as BorbRectangle
from borb.pdf.primitive.name import Name
from borb.pdf.primitive.stream import Stream
from borb.pdf.primitive.dictionary import Dictionary
from borb.pdf.primitive.string import String
# 假设 page 是一个 borb.pdf.page.page.Page 对象
# 假设 symb_arr 是 Symbol 对象的列表
# 假设 doc 是 borb.pdf.document.document.Document 对象
# 1. 创建内容流
content_stream = Stream()
content = b""""""
for s in symb_arr:
# 注意:这里的 (%b) Tj 格式化字符串和编码是问题的关键
# 后面会详细讨论如何正确处理西里尔字母编码
content += b"""
q
BT
/F1 %b Tf
%b %b Td
(%b) Tj
ET
Q
""" % (bytes(format(s.font_size, '.4f'), 'utf-8'),
bytes(format(s.x_coord, '.4f'), 'utf-8'),
bytes(format(s.y_coord, '.4f'), 'utf-8'),
bytes(str(s.sym), 'utf-8')) # 原始问题中的编码方式
content_stream[Name("DecodedBytes")] = content
content_stream[Name("Bytes")] = zlib.compress(content_stream["DecodedBytes"], 9)
content_stream[Name("Filter")] = Name("FlateDecode")
content_stream[Name("Length")] = Decimal(len(content_stream["Bytes"]))
# 2. 设置页面内容
page[Name("Contents")] = content_stream
# 3. 设置字体资源 (原始问题中的尝试)
page[Name("Resources")] = Dictionary()
# 原始问题尝试从现有页面复制字体资源,但这不适用于自定义字体
# page[Name("Resources")] = doc.get_page以上就是在borb中高效使用西里尔字母:自定义TrueType字体与低层PDF操作的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号