使用PHP mPDF实现希伯来语/阿拉伯语RTL文本固定位置写入问题
问题描述
我正在开发一个基于动态数据签署PDF的功能:通过PDF截图让用户点击指定区域,将点击的百分比坐标转换为PDF坐标,使用WriteFixedPosHTML方法写入内容,当前功能运行正常,但需要实现从右到左(RTL)的文本写入。目前我通过以下代码实现:
$mpdf->WriteFixedPosHTML($content, $x_in_mm - $content_length, $y_in_mm, $content_length, $font_size);
其中$content_length = $content_length * 0.2645833333;用于将像素单位转换为毫米,但因精度问题存在困扰。请问是否存在无需计算$x_in_mm - $content_length的RTL文本写入方法?
解决方案
直接在HTML内容中声明RTL方向,利用mPDF原生排版支持
给要写入的内容外层包裹带dir="rtl"属性的容器,让mPDF自动处理RTL排版逻辑:<div dir="rtl" style="width: {$content_length_mm}mm; font-size: {$font_size}pt;">{$content}</div>调用
WriteFixedPosHTML时直接传入原始的$x_in_mm作为X坐标即可,mPDF会自动从该位置向左渲染文本,无需手动计算$x_in_mm - $content_length:$mpdf->WriteFixedPosHTML($content, $x_in_mm, $y_in_mm, $content_length_mm, $font_size);用mPDF内置方法精确计算文本宽度,规避像素转毫米的精度问题
放弃手动像素转毫米,改用GetStringWidth方法获取文本在指定字体大小下的宽度(单位为pt),再转换为毫米:// 获取文本宽度(pt单位) $content_width_pt = $mpdf->GetStringWidth($content); // 转换为毫米(1pt = 0.352778mm) $content_length_mm = $content_width_pt * 0.352778;这个方法直接基于mPDF的字体渲染逻辑计算,精度比手动像素转换高得多。
全局启用RTL模式(适用于多RTL内容场景)
如果你的PDF文档大部分内容都是RTL方向,可以在初始化mPDF时直接设置全局方向:$mpdf = new \Mpdf\Mpdf(['mode' => 'utf-8', 'direction' => 'rtl']);之后使用
WriteFixedPosHTML时,默认就会按RTL方向排版,进一步简化坐标处理流程。
内容的提问来源于stack exchange,提问作者user29027808

