我可以在 TCPDF 中使用 "old-style"(非衬里)数字吗?

Can I use "old-style" (non-lining) numerals in TCPDF?

Unicode 不区分衬里数字(与大写字母的比例相同,在表格中很有用,但在 运行 文本中突出)和非衬里数字,看起来更像小写字母,带有升序和降序,因为它认为它们是彼此的变体。但是,许多字体都有两组数字,并提供了一种在它们之间进行选择的方法。有什么办法可以在 TCPDF 中实现这一点?

理想情况下,我希望编号列表使用衬里数字,运行 文本中的数字使用非衬里,邮政编码(英国和爱尔兰邮政编码是字母数字)使用非衬里数字和小号块大写字母。这可以在 LaTeX 中通过 \oldstylenums{1234567890}.

实现

我能找到的唯一类似问题是关于 tweaking font metrics in TCPDF to make non-lining figures look lining。理想情况下,我希望同时使用相同的字体和同一文档。 TCPDF 是否允许访问 OpenType 字符变体? (公平警告:我在这里有点力不从心。)

不幸的是,据我所知,TCPDF 不支持 OpenType 变体。例如,查看 freesans 的字体声明文件,pnum 变体字形甚至不包含在字符宽度数组中。

但是,您可以使用 font forge 将变体字形复制到 Unicode 运行ge 中,然后将字符映射到您要使用它们的上下文中。例如,如果您不使用下标数字字形,它们就是很好的候选者,因为搜索似乎仍然可以在我测试的几个 PDF 阅读器中找到它们。

为了让我有东西可以测试,我 运行 一个 类似的 场景:使用 Free Sans 但想在某些地方使用相同字体的比例数字文件。我用 FontForge 打开 Free Sans 字体,查看字形信息以查看哪些变体可用于零字形,使用它来查找 pnum 字形集,然后将它们复制到下标数字上。 (u2080 - u2089) 运行ge 是任意的,所以如果你使用这些字形,有私人使用 运行ge 例如,尽管这会破坏可搜索性而无需一些额外的步骤。

然后在 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);

结果仍然可以搜索,虽然复制粘贴有点奇怪。 [注:关掉了,因为我想看看我是否可以对字形定位进行调整。]

回到您的具体情况,如果您愿意放宽 "same font" 要求,另一种选择是创建一个单独的衍生字体,其中变体字形覆盖标准数字并在案例中切换到它你想要他们。我没有搜索过,但可能有一些预先存在的工具可以自动为您执行此操作。内容将完全保留其语义,代码可能会更简洁一些,但代价是有效嵌入相同字体的两个副本。