1

是否可以使用某些实用程序或脚本将嵌入在 PDF 文件中的字体提取到外部 ttf 文件?

  1. 如果系统中存在嵌入(或未嵌入)到 PDF 文件的字体。使用 swftools 中的 pdf2swf 和 swfextract 工具,我能够确定 PDF 文件中使用的字体的名称。然后我可以在运行时编译相应的系统字体,然后加载到我的 AIR 应用程序中。

  2. 但是如果系统中没有 PDF 中使用的字体,则有两种可能性:

    2.1。如果 PDF 文件中也没有它们(未嵌入),我们只能根据字体名称使用类似的系统字体。

    2.2. 如果它们嵌入在 PDF 文件中,那么我想知道是否可以将它们提取到外部 ttf 文件中,以便我可以在运行时将它们中的每一个编译为单独的 swf 文件?

4

5 回答 5

7

我知道你问这个问题已经有一段时间了,但我想我也许能帮上忙。

我不知道是否有任何实用程序可以让您提取字体文件,但您可以手动完成。

基本上,PDF 文件是具有不同对象的文本文件。您可以使用任何文本编辑器打开它并查找字体。

字体在 FontDescriptor 对象中指定,例如:

<</Type/FontDescriptor/FontName/ABCDEE+Algerian ... /FontFile2 24 0 R>>

这基本上是说,在对象 24 上指定了一个名为 Algerian 的字体。您可以使用“24 0 obj”行在文档中搜索对象 24,在此行之后,它会显示带有字体文件的流的属性并且在“stream”关键字之后开始(它的长度在obj之后的行中定义)。

此流包含压缩的 ttf 文件,要对其进行解压缩,您可以使用以下方法:

  private static byte[] DecodeFlateDecodeData(byte[] data)
  {
     MemoryStream outputStream;
     using (outputStream = new MemoryStream())
     {
        using (var compressedDataStream = new MemoryStream(data))
        {
           // Remove the first two bytes to skip the header (it isn't recognized by the DeflateStream class)
           compressedDataStream.ReadByte();
           compressedDataStream.ReadByte();

           var deflateStream = new DeflateStream(compressedDataStream, CompressionMode.Decompress, true);

           var decompressedBuffer = new byte[1024];
           int read;
           while ((read = deflateStream.Read(decompressedBuffer, 0, decompressedBuffer.Length)) != 0)
           {
              outputStream.Write(decompressedBuffer, 0, read);
           }
           outputStream.Flush();
           compressedDataStream.Close();
        }
        return GetStreamBytes(outputStream);
     }
  }

我希望这可以帮助你......或帮助其他人

于 2010-02-09T06:32:12.463 回答
2

这是一个迟到的答案,但我找到了一种使用免费提供的 Windows 程序的方法。不需要脚本或编译或 cygwin。这是几个步骤,但并不像看起来那么糟糕。

  1. 安装 mupdf 链接 - http://mupdf.googlecode.com/files/mupdf-0.8.15-windows.zip 并将您的 pdf 复制到 mupdf 的安装文件夹。假设它被称为whatever.pdf。

  2. 打开一个dos/命令提示符。导航到您的 mupdf 安装文件夹。例如:cd C:\Program Files\mupdf ...如果一切顺利,您的提示现在应该如下所示:C:\Program Files\mupdf> 现在输入以下命令: pdfextract whatever.pdf

之后,在 mupdf 程序文件夹中,您将拥有一个或多个字体文件。它们的名称将类似于 ABCDEF+Fontname-12.cff ...现在它们处于无法使用的 .cff 格式,但我们会解决这个问题。我建议将其重命名为不那么尴尬的名称......例如whatever.cff

  1. 更多 DOS,对不起。您需要一个名为 cfftot1.exe 的工具。这是一个链接: ftp: //tug.org/texlive/Contents/live/bin/win32/cfftot1.exe ...将其复制到您的 mupdf 文件夹。然后输入: cfftot1 不管什么.cff 不管是什么.pfb

  2. 您现在有一个几乎可用的字体文件,名为whatever.pfb。我说“几乎”是因为通常 PFB 字体文件还附带第二个文件,即包含间距信息的 PFM 文件。如果没有此文件,字体将无法安装,并且间距将被搞砸。但字体仍会在 fontlab 等字体编辑器中打开。您可以将字体从那里保存到 TTF 或 OTF。您也可以尝试自己修复间距。

如果你没有字体编辑器,你可以使用 crossfont。Crossfont 可以获取 PFB 并生成必要的 PFM 文件,因此您至少可以安装和使用该字体。链接 - http://crossfont.en.softonic.com/

就是这样。

于 2011-04-07T04:33:38.740 回答
2

几年前我设计了一种特殊的字体。我上下班花了大约一年的时间。有一天,我的 Maxtor HDD 死了,我无法恢复我的工作。但是我为我的客户在一些 PDF 文件中嵌入了字体。然后我有了从这些文件中提取字体的想法。在网上寻找答案一年左右后,我整理了一种从 PDF 中提取字体的方法。我已经在我的博客http://pdffontextract.blogspot.com上介绍了这种方法。自从我提出这个解决方案以来,出现了许多替代方案,但多样性并没有错。我发表这篇文章是为了帮助其他需要恢复他们失去的工作的人。玩得开心,如果您需要任何帮助,请随时与我联系。

于 2011-06-22T06:20:25.350 回答
2

获取 cfftot1.exe 的链接已更改为ftp://tug.org/texlive/Contents/live/bin/i386-linux/

于 2011-08-29T06:35:55.230 回答
2

次要更新 - 一些 PDF 包含嵌入另一种独特格式的字体,如 .CID 文件。这种格式适用于支持大量字符的字体(例如亚洲语言字体),并且不会以典型方式将字形映射到字母。

您仍然可以从 .CID 文件中获取可用字体,您只需在我上面的答案中添加一个步骤。通过名为 PStill (GPStill) 的程序运行您的 PDF。该网站在这里: http: //www.wizards.de/~frank/pstill.html

选择输入时,将下拉菜单从 Postscript File 更改为 PDF File。您的输出 PDF 将附加 _new。如果您需要解锁 PDF,可以使用 Elcomsoft 的 Advanced PDF Password Recovery。

此步骤的作用是将 PDF 中嵌入的 CID 字体转换为 PFA 类型 1 字体。因此,在运行 PDFextract 之后,您拥有的不是一堆无用的 .CID 文件,而是可以导入 Fontlab 和可能的 Crossfont 的 .PFA 文件。请注意,字母可能无法正确映射,因此您真的希望 Fontlab 之类的东西可以移动它们,以便例如在键盘上键入 A 不会导致字母 R。

与往常一样,如果字体仅作为子集嵌入,您将不会获得整个字体,而只会获得一组有限的字母。

于 2011-09-28T16:37:15.673 回答