【问题标题】:Can I use "old-style" (non-lining) numerals in TCPDF?我可以在 TCPDF 中使用“旧式”(非衬里)数字吗?
【发布时间】:2020-02-18 16:25:11
【问题描述】:

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

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

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

【问题讨论】:

    标签: php fonts tcpdf


    【解决方案1】:

    不幸的是,据我所知,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);
    

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

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

    【讨论】:

    • 为了回答一个由一次性想法引发的问题,您付出了很多努力!谢谢。
    猜你喜欢
    • 1970-01-01
    • 2013-07-11
    • 1970-01-01
    • 1970-01-01
    • 2017-09-15
    • 2015-10-07
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多