如何在PDF内部结构中添加基线偏移(下标/上标)信息及处理SVG tspan属性?
手动构建PDF内部结构时实现文本基线偏移(上标/下标)的方案
一、PDF原生实现基线偏移的两种方式
PDF没有专门的字典条目存储基线偏移(类似/fontdescriptor存储字体信息),而是通过文本操作符在内容流中动态调整文本位置或状态:
1. 临时调整文本位置(Td/TD操作符)
通过Td操作符移动当前文本位置,输出偏移文本后再移回原位置,适合局部上标/下标:
- 语法:
Tx Ty Td(Tx为水平偏移,Ty为垂直偏移,正值向上,负值向下) - 示例(输出H₂O,字体大小12pt):
BT /F1 12 Tf % 加载字体F1,设置字号12pt 100 700 Td % 初始文本位置(x=100, y=700) (H) Tj % 输出正常文本"H" 0 -3 Td % 向下偏移3pt(下标) (2) Tj % 输出下标"2" 0 3 Td % 移回原基线位置 (O) Tj % 输出正常文本"O" ET
2. 设置文本状态偏移(Ts操作符)
Ts操作符直接定义全局文本基线偏移,后续所有文本都会应用该偏移,直到被重置:
- 语法:
value Ts(value为偏移量,正值上标,负值下标) - 示例:
BT /F1 12 Tf 100 700 Td (H) Tj -3 Ts % 设置下标偏移-3pt (2) Tj 0 Ts % 重置偏移为0 (O) Tj ET
二、SVG tspan的baseline-shift属性转换方案
SVG的baseline-shift支持关键字、百分比、长度三种值,需先转换为PDF的用户空间单位,再通过上述操作符实现:
1. 属性值转换规则
- 关键字:
sub(下标)对应字体大小的-1/3左右;super(上标)对应字体大小的1/3左右(可根据视觉效果微调)。 - 百分比:基于当前字体大小计算,如
20%→ 字体大小 × 0.2,-15%→ 字体大小 × (-0.15)。 - 长度单位:
em直接乘以字体大小(如0.3em→ 12pt × 0.3 = 3.6pt);px默认映射为1用户单位(若有SVG视图缩放需同步调整)。
2. 缓冲区实现示例
假设SVG中有:
<text x="10" y="50" font-size="12">H<tspan baseline-shift="sub">2</tspan>O</text>
对应的PDF内容流缓冲区片段:
BT /F1 12 Tf 10 50 Td (H) Tj 0 -4 Td % 12pt的1/3为4pt,向下偏移实现下标 (2) Tj 0 4 Td (O) Tj ET
内容的提问来源于stack exchange,提问作者user369287
相关产品推荐
相关产品推荐

