如何使用某些库将 pdf 中的斜体字体转换为普通字体?
How to convert italic font to normal font in pdf using some library?
有什么方法可以使用 Imagemagick 或 GhostScript 等库将我的 pdf 中的斜体、粗体字体转换为普通字体吗?
基本上答案是 'no',尽管其中有几个级别的警告。
PDF 文件最常见的情况是它包含嵌入字体,并且该字体是子集。在这种情况下,字体将使用自定义编码,因此当您在显示器上看到 'Hello' 时,实际字符代码可能是 'Axtte' 或类似的乱码。 如果 字体也包含 ToUnicode table 从技术上讲,您可以从与粗体或斜体相同的家族中创建常规字体的嵌入子集并嵌入它,然后它会工作。这将是一项巨大的工作量。
如果字体不是子集,那么它可能不包含自定义编码,这将使该任务更容易,因为您不必重新编码替换。
如果字体未嵌入,则您只需更改 Font 对象中的字体名称,因为 PDF 用户无论如何都必须找到替代品。
请注意,由于 PDF 是二进制格式,索引 (xref) 包含文件中每个对象的偏移量,任何更改都意味着必须重建外部参照 table,再次相当大的任务。
我不知道有什么工具可以自动为您完成这些工作,您必须自己编写,尽管有些事情可以自动完成。例如,MuPDF 将为您 'fix' 一个具有不正确外部参照 table 的 PDF 文件。
即便如此,与常规字体相比,斜体或粗体字体的间距也可能会有所不同,如果用常规字体替换它们,它们看起来会很奇怪。
所以,从根本上说,没有。
在低级 PDF 中,您可以在文本流前面应用一些呈现标志。比如"Rendering Mode"Tr
操作。例如,在这种情况下,您可以使用命令序列 0.4 w 2 Tr
包含文本轮廓的呈现并增加轮廓绘图宽度,这将导致普通文本变得更多 "bold"(还有其他更好的方法可以实现此目的使用字体描述字典)。然而,也可以采用这种策略,使用剪裁较粗的轮廓来缩小粗体文本,但这可能并不理想。
至于斜体,大多数字体都包含一个指示其斜体角度的度量,您可以使用它通过 cm
操作使用剪切 CTM 转换矩阵来添加人造斜体。再一次,这可能更适合添加斜体剪切,但也可能会成功地移除它。
这将需要一个具有较低级别 PDF 构建的库,您将不得不手动完成,但在技术上是可行的。
有什么方法可以使用 Imagemagick 或 GhostScript 等库将我的 pdf 中的斜体、粗体字体转换为普通字体吗?
基本上答案是 'no',尽管其中有几个级别的警告。
PDF 文件最常见的情况是它包含嵌入字体,并且该字体是子集。在这种情况下,字体将使用自定义编码,因此当您在显示器上看到 'Hello' 时,实际字符代码可能是 'Axtte' 或类似的乱码。 如果 字体也包含 ToUnicode table 从技术上讲,您可以从与粗体或斜体相同的家族中创建常规字体的嵌入子集并嵌入它,然后它会工作。这将是一项巨大的工作量。
如果字体不是子集,那么它可能不包含自定义编码,这将使该任务更容易,因为您不必重新编码替换。
如果字体未嵌入,则您只需更改 Font 对象中的字体名称,因为 PDF 用户无论如何都必须找到替代品。
请注意,由于 PDF 是二进制格式,索引 (xref) 包含文件中每个对象的偏移量,任何更改都意味着必须重建外部参照 table,再次相当大的任务。
我不知道有什么工具可以自动为您完成这些工作,您必须自己编写,尽管有些事情可以自动完成。例如,MuPDF 将为您 'fix' 一个具有不正确外部参照 table 的 PDF 文件。
即便如此,与常规字体相比,斜体或粗体字体的间距也可能会有所不同,如果用常规字体替换它们,它们看起来会很奇怪。
所以,从根本上说,没有。
在低级 PDF 中,您可以在文本流前面应用一些呈现标志。比如"Rendering Mode"Tr
操作。例如,在这种情况下,您可以使用命令序列 0.4 w 2 Tr
包含文本轮廓的呈现并增加轮廓绘图宽度,这将导致普通文本变得更多 "bold"(还有其他更好的方法可以实现此目的使用字体描述字典)。然而,也可以采用这种策略,使用剪裁较粗的轮廓来缩小粗体文本,但这可能并不理想。
至于斜体,大多数字体都包含一个指示其斜体角度的度量,您可以使用它通过 cm
操作使用剪切 CTM 转换矩阵来添加人造斜体。再一次,这可能更适合添加斜体剪切,但也可能会成功地移除它。
这将需要一个具有较低级别 PDF 构建的库,您将不得不手动完成,但在技术上是可行的。