【发布时间】:2016-10-22 12:55:56
【问题描述】:
有没有办法使用 Imagemagick 或 GhostScript 等库将我的 pdf 中的斜体字体、粗体字体转换为普通字体?
【问题讨论】:
标签: pdf fonts imagemagick ghostscript
有没有办法使用 Imagemagick 或 GhostScript 等库将我的 pdf 中的斜体字体、粗体字体转换为普通字体?
【问题讨论】:
标签: pdf fonts imagemagick ghostscript
尽管其中有几个级别的警告,但基本上答案是否定的。
PDF 文件最常见的情况是它包含嵌入字体,并且该字体是子集。在这种情况下,字体将使用自定义编码,因此当您在显示器上看到“Hello”时,实际的字符代码可能是“Axtte”或类似的乱码。 如果该字体还包含一个 ToUnicode 表,从技术上讲,您可以从与粗体或斜体相同的系列中创建常规字体的嵌入子集并将其嵌入,这样就可以了。这将是一项巨大的工作。
如果字体不是子集,则它可能不包含自定义编码,这将使该任务更容易,因为您不必重新编码替换。
如果字体没有嵌入,那么您只需更改 Font 对象中的字体名称,因为 PDF 使用者无论如何都必须找到替代字体。
请注意,由于 PDF 是一种二进制格式,其索引 (xref) 包含文件中每个对象的偏移量,因此任何更改都意味着必须重新构建外部参照表,这也是一项艰巨的任务。
我不知道有什么工具可以自动为您完成这些工作,您必须自己编写,尽管有些事情可以自动完成。例如,MuPDF 将为您“修复”具有不正确外部参照表的 PDF 文件。
即便如此,斜体或粗体字体的间距仍可能与常规字体相比有所不同,如果您将它们替换为常规字体,它们看起来会很奇怪。
所以,从根本上说,不会。
【讨论】:
在低级 PDF 中,您可以在文本流前面应用一些渲染标志。就像“渲染模式”Tr 操作一样。例如,在这种情况下,您可以使用命令序列0.4 w 2 Tr 包括文本轮廓的呈现并增加轮廓绘图宽度,这将导致普通文本变得更加“粗体”(还有其他更好的方法可以使用字体描述来完成此操作字典)。但是,也可以采用这种策略,通过剪裁较粗的轮廓来缩小粗体文本,但这可能并不理想。
至于斜体,大多数字体都包含一个指示其斜体角度的度量,您可以使用它通过cm 操作使用剪切 CTM 转换矩阵添加一个假斜体。再一次,这可能会更好地添加斜体剪切,但也可能会成功删除它。
请参阅PDF Reference。
这将需要一个具有较低级别 PDF 构建的库,并且您必须手动执行此操作,但在技术上是可行的。
【讨论】: