不幸的是,据我所知,TCPDF 不支持 OpenType 变体。例如,查看freesans 的字体声明文件,pnum 变体字形甚至不包含在字符宽度数组中。
但是,您可以使用 font forge 将变体字形复制到 Unicode 范围内,并将字符映射到您想要使用它们的上下文中。例如,如果您不使用下标数字字形,它们是很好的候选,因为搜索似乎仍然可以在我测试的几个 PDF 阅读器中找到它们。
为了测试一些东西,我运行了一个类似的场景:使用 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);
结果仍然是可搜索的,虽然复制粘贴有点奇怪。 [注:这个是关闭的,因为我想看看我是否可以调整字形定位。]
回到您的具体情况,如果您愿意放宽“相同字体”要求,另一种选择是创建一个单独的衍生字体,其中变体字形覆盖标准数字并在您需要的情况下切换到它们.我没有搜索过,但可能有预先存在的工具可以自动为您执行此操作。内容将完全保留其语义含义,并且代码可能更简洁一些,但代价是有效地嵌入了相同字体的两个副本。