使用某个实用程序或脚本将嵌入的PDF字体提取到外部ttf文件

时间:2009-12-17 15:42:58

标签: pdf fonts scripting flash extract

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

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

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

    2.1。如果它们在PDF文件中也不存在(非嵌入式),我们只能使用基于字体名称的类似系统字体。

    2.2。如果它们嵌入在PDF文件中,那么我想知道它是否可以将它们提取到外部ttf文件,以便我可以在运行时编译它们以分离swf文件?

5 个答案:

答案 0 :(得分:6)

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

我不知道是否有任何实用程序可以让你解压缩Font文件,但你可以手动完成。

基本上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);
     }
  }

我希望这可以帮助你......或者帮助别人

答案 1 :(得分: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&gt; 现在输入以下命令: pdfextract whatever.pdf

  3. 然后,在mupdf程序文件夹中,您将拥有一个或多个字体文件。他们的名字会像ABCDEF + Fontname-12.cff ......现在它们处于无法使用的.cff格式,但我们会解决这个问题。我建议将其重命名为不那么笨拙的东西......比如whatever.cff

    1. 更多DOS,抱歉。你需要一个名为cfftot1.exe的工具。这是一个链接: ftp://tug.org/texlive/Contents/live/bin/win32/cfftot1.exe ...将其复制到您的mupdf文件夹。然后键入: cfftot1 whatever.cff whatever.pfb

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

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

      就是这样。

答案 2 :(得分:2)

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

答案 3 :(得分:2)

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

答案 4 :(得分:2)

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

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

选择输入时,将Postscript文件的下拉列表更改为PDF文件。 您的输出PDF将附加_new。 如果您需要解锁PDF,可以使用Elcomsoft的高级PDF密码恢复。

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

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