在borb中高效使用西里尔字母:自定义TrueType字体与低层PDF操作

DDD
发布: 2025-11-07 11:33:01
原创
507人浏览过

在borb中高效使用西里尔字母:自定义truetype字体与低层pdf操作

本文详细探讨了在Python `borb`库中处理西里尔字母的挑战与解决方案,特别是针对需要精细字符控制和高性能的场景。文章首先介绍了使用`Paragraph`和`Rectangle`的高层API方法,指出了其在处理大量字符时的性能瓶颈。随后,深入分析了基于低层PDF内容流操作的优化方案,并重点阐述了如何正确集成自定义TrueType字体以支持西里尔字母,同时解决了字符编码问题,最终实现了显著的性能提升。

引言:在borb中处理西里尔字母的挑战

在borb库中处理非拉丁字符集,如西里尔字母,常常会遇到字体支持问题。borb默认的字体可能不包含西里尔字母的字形,导致字符无法正确显示。对于需要精确控制每个字符位置的应用场景,如PDF文档的字符级修改,问题会变得更加复杂。本文将介绍两种在borb中实现西里尔字母渲染的方法:一种是易于理解但效率较低的高层API方法,另一种是性能优越但需要深入理解PDF底层机制的低层内容流方法。我们将重点解决如何在低层方法中正确集成自定义TrueType字体并处理西里尔字母编码。

方法一:使用高层API(Paragraph和Rectangle)

borb提供了一套高层API,通过Paragraph和Rectangle对象可以相对直观地在PDF页面上放置文本。这种方法允许用户指定自定义字体,从而解决西里尔字母的显示问题。

实现细节

首先,需要加载一个支持西里尔字母的TrueType字体(.ttf文件)。然后,对于每个要渲染的字符,创建一个Paragraph实例,并指定其字体、大小和内容。最后,使用paint方法将其绘制到指定Rectangle区域内的页面上。

以下是实现此方法的示例代码:

阿里云-虚拟数字人
阿里云-虚拟数字人

阿里云-虚拟数字人是什么? ...

阿里云-虚拟数字人 2
查看详情 阿里云-虚拟数字人
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)
登录后复制

优点与局限性

  • 优点: 代码直观,易于理解和实现。borb内部会处理字体嵌入和字符编码的复杂性。
  • 局限性: 对于需要处理大量字符或进行频繁修改的场景,这种方法效率低下。每次调用Paragraph.paint都会涉及较多的内部操作,导致性能瓶颈。例如,处理两段PDF文档可能需要数秒。

方法二:使用低层PDF内容流操作实现高性能渲染

为了实现更高的性能,可以直接操作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中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号