是否可以使用某个实用程序或脚本将嵌入在PDF文件中的字体提取到外部ttf文件?
如果系统中存在嵌入(或未嵌入)PDF文件的字体。使用swftools中的pdf2swf和swfextract工具,我可以确定PDF文件中使用的字体的名称。然后我可以在运行时编译各自的系统字体,然后加载到我的AIR应用程序。
但如果系统中缺少PDF中使用的字体,则有两种可能:
2.1。如果它们在PDF文件中也不存在(非嵌入式),我们只能使用基于字体名称的类似系统字体。
2.2。如果它们嵌入在PDF文件中,那么我想知道它是否可以将它们提取到外部ttf文件,以便我可以在运行时编译它们以分离swf文件?
答案 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。这是几个步骤,但没有它看起来那么糟糕。
安装mupdf 链接 - http://mupdf.googlecode.com/files/mupdf-0.8.15-windows.zip 并将您的pdf复制到mupdf的安装文件夹。让我们说它叫做whatever.pdf。
打开dos /命令提示符。导航到您的mupdf安装文件夹。 示例: cd C:\ Program Files \ mupdf ...如果顺利进行,您的提示现在应如下所示: C:\ Program Files \ mupdf&gt; 现在输入以下命令: pdfextract whatever.pdf
然后,在mupdf程序文件夹中,您将拥有一个或多个字体文件。他们的名字会像ABCDEF + Fontname-12.cff ......现在它们处于无法使用的.cff格式,但我们会解决这个问题。我建议将其重命名为不那么笨拙的东西......比如whatever.cff
更多DOS,抱歉。你需要一个名为cfftot1.exe的工具。这是一个链接: ftp://tug.org/texlive/Contents/live/bin/win32/cfftot1.exe ...将其复制到您的mupdf文件夹。然后键入: cfftot1 whatever.cff whatever.pfb
您现在拥有一个名为whatever.pfb的几乎可用的字体文件。我说“差不多”因为通常PFB字体文件还带有第二个文件,一个包含间距信息的PFM文件。如果没有此文件,则不会安装字体,并且间距会被搞砸。但字体仍将在fontlab等字体编辑器中打开。您可以将字体从那里保存到TTF或OTF。您也可以尝试自己修复间距。
如果您没有字体编辑器,可以使用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.
与往常一样,如果字体仅作为子集嵌入,则不会获得整个字体,只是一组有限的字母。