如何在PDF内容流中正确使用字形前进量与位移值定位多语言文字
多语言PDF渲染:组合字形定位问题
我需要用C++生成包含多语言文字的PDF,已获取输入字符串的Unicode值、字形ID(glyph id)、前进量(advance,ax/ay)和位移值(displacement,dx/dy)。单个字形渲染正常,但泰米尔语、印地语这类包含基础字形+从属字形的组合字符,始终无法正确定位,即便已经使用FreeType/HarfBuzz输出的前进量和位移值。
我只想知道如何在PDF内容流中正确使用这些输出值,渲染出可读的完整文字。
测试示例
目标是渲染泰米尔语组合字符+印地语组合字符的正确效果,但目前输出的组合字形间距异常。
泰米尔语组合字符
- 基础字形:வ = U+0BB5 TAMIL LETTER VA
- 从属字形:ா = U+0BBE TAMIL VOWEL SIGN AA
HarfBuzz命令:
hb-shape.exe -O json -u u+0bb5,u+0bbe --no-glyph-names "C:\\Windows\\Fonts\\Nirmala.ttf"
字形输出(JSON):
[{"g":2953,"cl":0,"dx":0,"dy":0,"ax":2111,"ay":0},{"g":2959,"cl":0,"dx":0,"dy":0,"ax":1453,"ay":0}]
印地语组合字符
- 基础字形:म = U+092E DEVANAGARI LETTER MA
- 从属字形:ि = U+093F DEVANAGARI VOWEL SIGN I
HarfBuzz命令:
hb-shape.exe -O json -u u+092e,u+093f --no-glyph-names "C:\\Windows\\Fonts\\Nirmala.ttf"
字形输出(JSON):
[{"g":302,"cl":0,"dx":0,"dy":0,"ax":532,"ay":0},{"g":273,"cl":0,"dx":0,"dy":0,"ax":1379,"ay":0}]
当前实现与问题
我将HarfBuzz输出的前进量转换为tx值,代入PDF文档的公式计算(假设除宽度和前进量外其他变量为1,宽度值通过FreeType获取),四个字形的tx值依次为:
tx = 1769 tx = 1132 tx = 1586 tx = 1448
然后按如下格式写入PDF内容流:
<glyph id 1> tx 1 <glyph id 2> tx 2 <glyph id 3> tx 3 <glyph id 4> tx 4
内容流示例:
/OC /oc2 BDC q BT /FXF1 1 Tf 70.866142 0.000000 0.000000 70.866142 28.346457 141.732285 Tm[<0B89>-1769<0B8F>-1132<0111>-1586<012E>-1448]TJ ET Q EMC
现在存在的疑问:
- PDF文档说明前进量为正值会使文本向左移动,实际是否相反?或是需要计算前进量的差值?
- 有分析认为需要为每个字形使用单独的变换矩阵或
Td操作,但是否真的需要这么复杂?如果确实需要,该如何计算对应的参数?
目前无论仅用前进量还是计算后的tx值,组合字形的水平/垂直间距都异常,还会影响后续字形的间距,无法实现通用的多语言文字渲染。
内容的提问来源于stack exchange,提问作者WIN
相关产品推荐
相关产品推荐

