我正在尝试在 Java 应用程序中使用一些嵌入在 PDF 文件中的字体。显然,Java 能够加载 Type1 和 TrueType 字体。根据几个网站的说法,PDF 中的 Type1c 字体基本上是 CFF 或 Type2 字体。Java 7 的一个新特性是加载 CFF 字体,但 Font.createFont() 这样不起作用。
那么我哪里错了?Type1c 字体真的是 CFF/OpenType 字体吗?是否需要任何转换?
字体是子集的吗?(在这种情况下,它将只包含一些字符而不是整个字体)。
一般来说,嵌入在 PDF 中的 CFF 字体可能需要大量的转换工作才能使其普遍可用 - 如果您一直在我们的博客 (http://blog.idrsolutions.com) 上关注我们的 PDF 到 HTML5 转换器的开发,您将看过很多关于字体各种问题的帖子。
google (http://code.google.com/p/sfntly/) 有一个有趣的 Java 字体工具,如果您正在研究字体操作,fontforge 很有用。
恐怕你必须弄清楚你到底想打什么仗。不要相信有关字体的网站,请阅读 PDF 规范: http: //www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/PDF32000_2008.pdf
具体来说,您正在寻找第 9.6 章 - 简单字体和 9.7 - 复合字体。
总而言之,PDF 文件中的字体可以是多种类型: - Type 0 - Type 1 - Type 3 - TrueType
Type 1 和 TrueType 是最简单的,您很可能在 PDF 文件中遇到它们。Type 3 是一种字体类型,您可以在其中使用图形来绘制字符。不是很常见。
Type 0 是一种更复杂的字体类型,最初设计用于允许您使用大型字符集(想想日文/中文),但现在它也由许多专业设计和布局应用程序常规生成。这种 Type 0 字体类型有两个子类型: - SubType 0,它是 Type 1 字体,被按摩到 Type 0 夹克中,以及 - SubType 2,它是 TrueType 字体被按摩到 Type 0 夹克中
在所有情况下,系统上的“真实”字体与嵌入在 PDF 文件中的相同字体之间存在显着差异。
首先查看包含您要使用的字体的 PDF 文件。使用 callas (http://www.callassoftware.com/callas/doku.php/en:download) 的 pdfToolbox 或 Enfocus (http://www.enfocus.com/en/products/browser) 的 Browser 等工具. 这两个工具都允许您研究 PDF 文件的低级结构,包括查看实际的页面描述代码和查看字体字典。pdfToolbox 特别擅长深入研究 PDF 文件中的字体,包括查看实际形状和用于绘制这些形状的说明。
FontVerter 是我不久前编写的一个开源 Java 库,它可以将来自 PDF 的裸 CFF* 和 Type0/复合字体转换为 OTF/TTF 和 WOFF1/2。它还可以尝试修复和规范化在浏览器中无法正常工作的 OTF/TTF 字体,我发现嵌入在 PDF 中的开放式字体通常存在各种问题,例如缺少表格,这会阻止 chrome 正确呈现它们。
(*bare CFF = type1c 我相信?,已经有点过了,我忘记了哪个类型是哪个)