You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 04:05:27