不幸的是,据我所知,TCPDF 不支持 OpenType 变体。查看字体声明文件freesans
例如,pnum
变体字形甚至不包含在字符宽度数组中。
但是,您可以做的是使用 font forge 将变体字形复制到 Unicode 范围,并将字符映射到您想要使用它们的上下文中。例如,如果您不使用下标数字字形,它们是很好的候选者,因为搜索似乎仍然可以在我测试的几个 PDF 阅读器中找到它们。
为了让我可以测试一些东西,我运行了similar场景:使用 Free Sans,但想在某些具有相同字体文件的地方使用比例数字。我用 FontForge 打开 Free Sans 字体,查看字形信息以查看哪些变体可用于零字形,用它来查找一组pnum
字形,然后将它们复制到下标数字上。 (u2080 - u2089) 范围是任意的,因此如果您使用这些字形,则存在例如私有使用范围,尽管这会破坏可搜索性而无需一些额外的步骤。
然后在 TCPDF 中,只需对我想要影响的字母数字字符串运行字符串替换。
$pdf->writeHTMLCell(0, 0, '', '', '<span style="font-family: freesansmod">H90173A8301X5</span>', 0, 1, 0, true, '', true);
//I feel like there's a shorter way to write this...
$special_numbers = str_replace(['0','1','2','3','4','5','6','7','8','9'],
["\u{2080}", "\u{2081}", "\u{2082}", "\u{2083}",
"\u{2084}", "\u{2085}", "\u{2086}", "\u{2087}",
"\u{2088}", "\u{2089}"], 'H90173A8301X5');
$pdf->writeHTMLCell(0, 0, '', '', '<span style="font-family: freesansmod">'.$special_numbers.'</span>', 0, 1, 0, true, '', true);
结果仍然是可搜索的,尽管复制粘贴有点奇怪。 [注:该功能已关闭,因为我想看看是否可以调整字形定位。]
回到您的具体情况,如果您愿意放宽“相同字体”要求,另一种选择是创建一个单独的衍生字体,其中变体字形覆盖标准数字,并在您需要的情况下切换到它。我没有搜索过,但可能有预先存在的工具可以自动为您执行此操作。内容将完全保留其语义,并且代码可能会更干净一些,但代价是有效嵌入相同字体的两个副本。