【问题标题】:Accessing font files within PDF访问 PDF 中的字体文件
【发布时间】:2012-02-04 05:48:22
【问题描述】:

我们目前正在与一些出版商合作,从他们的 PDF 生成在线图书。我们的旧版应用程序使用 flex,因此我们使用 PDF2SWF by SWFTools 将 PDF 转换为 SWF 文件。

我们遇到的问题是当用户执行搜索时,我们的 flex 阅读器没有突出显示 SWF 文档中的文本。经过快速调查,我们发现在提取文本时,我们需要嵌入 PDF 文档使用的字体:

http://wiki.swftools.org/wiki/How_do_I_highlight_text_in_the_SWF%3F

pdf2swf -F $YOUR_FONTS_DIR$ -f input.pdf -o output.swf

从上面的代码中可以看出,我们需要一个字体目录的路径,该目录包含在该 PDF 中找到的字体。

由于我们将转换大量的 PDF,是否可以直接通过 PDF 访问字体文件,而不是在我们的应用程序中存储大量字体?

附加信息

我们的应用是用 Java 编写的。

我们目前在应用程序中使用 PDFBox 和 Ghostscript,因此如果有任何解决方案使用这些库,那将是首选,但我们对所有想法持开放态度。

【问题讨论】:

标签: java pdf fonts extract pdfbox


【解决方案1】:

PDF 文件不包含字体“文件”,它们甚至可能根本不包含任何字体,尽管这种情况很少见。嵌入的字体数据可以是各种令人眼花缭乱的格式:

  • type 1 PostScript 字体
  • 类型 3 PostScript
  • 字体 TrueType 字体
  • PostScript CFF 字体
  • 具有 1 类 PostScript 轮廓的 CIDFonts
  • 具有 3 类 PostScript 轮廓的 CIDFonts
  • 带有 TrueType 轮廓的 CIDFonts
  • 带有 CFF 轮廓的 CIDFonts
  • 带有位图图像的 CIDFonts

您的应用程序是否能够读取所有这些字体格式?如果您想使用它们,那么您必须使用嵌入在 PDF 文件中的字体,因为这些字体通常是子集字体,并提供自定义编码,这意味着即使您拥有原始字体,不能使用,因为编码不正确。

当然可能是这些PDF文件都是以一致的方式创建的,没有使用嵌入的字体,但我有疑问......

【讨论】:

  • 请注意,CIDFonts 通常不映射到 Unicode 字符代码,因此如果您的 PDF 包含这些,您将难以将文档字符映射到 Unicode 字符以进行搜索。
  • @KenS - 感谢您的回答。您的疑问是正确的,PDF 使用的是嵌入的子集字体。我认为您没有来源支持您的答案?
  • @Rup - 感谢您指出这一点。我们将支持多种语言,但不支持任何脚本风格的语言(日语、韩语等)
  • 不确定您想要我答案的哪一部分? PDF 参考列出了所有支持的字体类型。为了跟进 Rup 的回答,任何嵌入的子集字体都将使用不对应于 ASCII 或 Unicode 代码点的字符代码。事实上,大多数 PDF 文档都包含不使用 Unicode 的文本。当我维护用于从 PDF 中提取可用文本的 Ghostscript txtwrite 设备时,我可以肯定地说这是一项艰巨的任务,虽然它可能获得超过 80% 的可靠性,但不可能从所有 PDF 文件中提取文本。 NB CIDFonts 也用于拉丁语。
  • 谢谢。抱歉,当我问我正在寻找支持您答案第一部分的来源时,即可以嵌入字体的各种格式。再次感谢您的出色回答,+1
猜你喜欢
  • 2011-11-15
  • 1970-01-01
  • 2013-10-02
  • 2017-09-09
  • 2019-11-21
  • 2011-10-08
  • 2015-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多