2009-12-17 458 views
1

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

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

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

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

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

回答

6

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

我不知道是否有任何实用工具可以让您提取字体文件,但您可以手动进行。

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

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

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

这基本上说,与阿尔及利亚在对象24上指定的名称的字体,您可以在文档中搜索对象24与线“24 0 obj”,在这行之后,它显示流的属性和字体文件,并且在它开始的“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); 
    } 
    } 

我希望这有助于你......或者帮助别人

+0

@willw我也对此感兴趣。我在PDF中找到了相关的流(我认为)。不过,我并不真正了解编程。我如何编译和运行这个脚本?它在哪里得到我的输入文件?我是否也可以将流字符复制并粘贴到新的文本文件中以生成有效的输入文件?有没有可以接受此文件并输出解压缩文件的在线解码器?对不起,有10,000个问题。希望你能帮忙。 – CreeDorofl 2011-03-31 03:03:09

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随你。pdf

然后,在mupdf程序文件夹中,您将有一个或多个字体文件。他们将拥有ABCDEF + Fontname-12.cff这样的名称......现在他们处于不可用的.cff格式,但我们会解决该问题。我建议将其重命名为不太笨拙的...例如whatever.cff

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

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

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

就是这样。

2

几年前,我设计了一种特殊的字体。这花了我大约一年的上下班时间。有一天,我的迈拓硬盘驱动器死亡,我无法恢复我的工作。但是我为我的客户在某些PDF文件中嵌入了字体。然后我有了从这些文件中提取字体的ideea。经过一年左右的在线寻找答案,我提出了一种从PDF中提取字体的方法。我在我的博客上提供了此方法,网址为http://pdffontextract.blogspot.com。自从我提出这个解决方案之后,出现了许多相互关联的问题,但多样性没有任何问题。我做了这个帖子来帮助其他需要恢复他们失去的工作的人。玩得开心,如果你需要任何帮助,请不要犹豫与我联系。

+0

链接无法正常工作 – AnilHoney 2013-09-12 13:43:36

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之后,而不是一堆无用的.CID文件,您可以将.PFA文件导入到Fontlab和可能的Crossfont中。请注意,这些字母可能无法正确映射,所以您确实希望Fontlab等移动它们,以便例如在键盘上键入A不会导致字母R.

一如果字体只是作为一个子集嵌入,你将不会得到整个字体,只是一组有限的字母。

相关问题