如何从PDF中提取嵌入式字体作为有效的字体文件?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (300)

我知道pdftk.exe实用工具,它可以指示PDF使用哪些字体,以及它们是否嵌入。

现在的问题是:如果我有带有嵌入式字体的PDF文件--我如何提取这些字体,使它们作为常规字体文件可重用?是否有(最好是免费的)工具可以做到这一点?另外:这可以用编程的方式来完成吗,比如说,iText?

提问于
用户回答回答于

所有这些方法都可以在Linux以及Windows或MacOSX上工作。但是,当大多数PDF都有字体嵌入时,它们并不包括完整的字体。大多数情况下,它们只包括子集文档中使用的符号。

使用pdftops

最常用的方法之一是在*Nix系统包括以下步骤:

  1. 将PDF转换为PostScript。
  2. 现在字体将嵌入到.pfa(PostScript)格式+可以使用文本编辑器
  3. 可能需要将.pfa(ASCII)至.pfb(二进制)文件使用t1utilspfa2pfb
  4. 在PDF中.pfm.afm嵌入的文件(字体度量文件)(因为PDF查看器有关于这些文件的内部知识)。
  5. 使用fontforge

另一种方法是使用免费字体编辑器:

  1. 使用“开放式字体”打开文件时使用的对话框。
  2. 然后选择“PDF摘录”在对话框的筛选部分。
  3. 选择要提取字体的PDF文件。
  4. “挑字体”对话框打开--在这里选择要打开的字体。

检查FentForge手册。您可能需要遵循一些不一定简单的特定步骤,以便将提取的字体数据保存为一个可重用的文件。

使用mupdf

这个应用程序附带了一个名为pdfextract(在Windows上:pdfextract.exe)可以从PDF中提取字体和图像。(如果不了解MuPDF,它仍然是相对未知和新的:MuPDF是一个用便携C编写的免费轻量级PDF查看器和工具包。由Artifex软件开发人员编写,也是给我们Ghostscript的同一家公司编写的。)

注:pdfextract.exe是命令行程序。要使用它,请执行以下操作:

c:\>  pdfextract.exe  c:\path\to\filename.pdf         # (on Windows)
$>    pdfextract  /path/tofilename.pdf                # (on Linux, Unix, Mac OS X)

此命令将从引用到当前目录的pdf文件中转储所有可提取的文件。通常,会看到各种各样的文件:图像以及字体。包括巴布亚新几内亚、TTF、CFF、CID等。图像名就像IMG-0412.png如果图像的PDF对象号为412。字体名就像FGETYK+LinLibertineI-0966.ttf,如果字体的PDF对象号为966。

CFF(紧凑字体格式)文件是一种可识别的格式,可以通过各种转换器转换成其他格式,以便在不同的操作系统上使用。

再次:请注意,大多数这些字体文件可能只有一个子集的字符,不能代表完整的字体。

最新情况:(2013年7月)mupdf已经看到了他们的二进制文件的内部重组和重命名,不仅仅是一次,而是几次。主要的实用工具过去是一个类似于瑞士刀的二进制文件,名为“瑞士刀”。mubusy(名字受busybox启发?),最近改名为mutool。这些支持子命令。infocleanextractpostersho。不幸的是,这些工具的官方文档还没有更新。如果您在Mac上使用“MacPorts”:那么该实用程序被重命名,以避免与其他使用相同名称的实用程序名称冲突,您可能需要使用mupdfextract

实现(大致)等效的结果mutool作为以前的工具pdfextract是的,只是跑mubusy extract ...

因此,要提取字体和图像,可能需要运行以下命令行之一:

c:\>  mutool.exe extract filename.pdf      # (on Windows)
$>    mutool     extract filename.pdf      # (on Linux, Unix, Mac OS X)

使用gs(鬼脚本)

然后,鬼脚本也可以直接从PDF中提取字体。但是,它需要一个名为extractFonts.ps,以PostScript语言编写,可从Ghostscript源代码库

现在使用它,需要运行这两个文件,这个文件extractFonts.ps还有你的PDF文件。然后Ghostscript将使用PostScript程序的指令从PDF中提取字体。在Windows上,它看起来是这样的(是的,Ghostscript将“正斜杠”理解为路径分隔符,在Windows上也是如此!:

gswin32c.exe                  ^
  -q -dNODISPLAY              ^
   c:/path/to/extractFonts.ps ^
  -c "(c:/path/to/your/PDFFile.pdf) extractFonts quit"

或者在Linux、Unix或MacOSX上:

gs                          \
  -q -dNODISPLAY            \
   /path/to/extractFonts.ps \
  -c "(/path/to/your/PDFFile.pdf) extractFonts quit"

几年前我已经测试了Ghostscript方法。当时它确实提取了*.ttf(TrueType)很好。

使用pdf-parser.py

这个可能不容易使用,因为需要了解一些内部PDF结构的技术。pdf-parser.py是一个Python脚本,它也可以做很多其他事情。它还可以从对象中解压缩和提取任意流,因此也可以提取嵌入式字体文件。

但你得知道该找什么。让我们举个例子来看看。我有一个文件big.pdf。作为第一步,我使用-s参数以搜索PDF是否出现关键字。FendFile(pdf-parser.py不需要区分大小写的搜索:

pdf-parser.py -s fontfile big.pdf

在我的情况下,为了我big1.pdf,我得到这个结果:

obj 9 0
 Type: /FontDescriptor
 Referencing: 15 0 R
  <<   
    /Ascent 728
    /CapHeight 716
    /Descent -210 
    /Flags 32
    /FontBBox [ -665 -325 2000 1006 ]
    /FontFile2 15 0 R
    /FontName /ArialMT
    /ItalicAngle 0
    /StemV 87
    /Type /FontDescriptor
    /XHeight 519
  >>   

obj 11 0 
 Type: /FontDescriptor
 Referencing: 16 0 R
  <<   
    /Ascent 728
    /CapHeight 716
    /Descent -210 
    /Flags 262176
    /FontBBox [ -628 -376 2000 1018 ]
    /FontFile2 16 0 R
    /FontName /Arial-BoldMT
    /ItalicAngle 0
    /StemV 165
    /Type /FontDescriptor
    /XHeight 519
  >>   

它告诉我有两个实例FontFile2在PDF内部,这些分别在PDF对象中第15号和第16号。对象15持有/FontFile2字体/ArialMT,对象16持有/FontFile2字体/Arial-BoldMT...

为了更清楚地表明这一点:

pdf-parser.py -s fontfile big1.pdf | grep -i fontfile
  /FontFile2 15 0 R
  /FontFile2 16 0 R

快速查看PDF规范就会发现关键字/FontFile2包含TrueType字体程序的流(/FontFile将与“包含类型1字体程序的流”/FontFile3将与“流包含一个字体程序,其格式由流字典中的子类型条目指定”{因此要么是一个Type1C或者是CIDFentType0C))

专门查看PDF对象15号(它保存字体)/ArialMT),则可以使用-o 15参数:

pdf-parser.py -o 15 big1.pdf

 obj 15 0
  Type: 
  Referencing: 
  Contains stream
   <<
     /Length1 778552
     /Length 1581435
     /Filter /ASCIIHexDecode
   >>

pdf-parser.py输出告诉我们,这个对象包含一个流(它不会直接显示),它的长度为1.581.435字节,并使用ASCIIHexEncode编码(==“压缩”),需要在标准的帮助下解码(==“反压缩”或“筛选”)。/ASCIIHexDecode过滤器。

要从对象中转储任何流,pdf-parser.py可以用-d dumpname参数。让我们开始吧:

pdf-parser.py -o 15 -d dumped-data.ext big1.pdf

我们提取的数据转储将位于名为倾销-数据。让我们看看它有多大:

ls -l dumped-data.ext
  -rw-r--r--  1 kurtpfeifle  staff  1581435 Apr 11 00:29 dumped-data.ext

otfinfo -i dumped-data.ext
  otfinfo: dumped-data.ext: not an OpenType font (bad magic number)

好吧,这是因为我们还没有pdf-parser.py利用它的全部魔力:转储一个过滤的,解码的流。为此,我们必须添加-f参数:

pdf-parser.py -o 15 -f -d dumped-data-decoded.ext big1.pdf

这个新文件的大小是多少?

ls -l dumped-data-decoded.ext
  -rw-r--r--  1 kurtpfeifle  staff  778552 Apr 11 00:39 dumped-data-decoded.ext

什么file你觉得是吗?

file dumped-data-decoded.ext
  dumped-data-decoded.ext: TrueType font data

什么otfinfo跟我们说说?

otfinfo -i dumped-data-decoded.ext
  Family:              Arial
  Subfamily:           Regular
  Full name:           Arial
  PostScript name:     ArialMT
  Version:             Version 5.10
  Unique ID:           Monotype:Arial Regular:Version 5.10 (Microsoft)
  Designer:            Monotype Type Drawing Office - Robin Nicholas, Patricia Saunders 1982
  Manufacturer:        The Monotype Corporation
  Trademark:           Arial is a trademark of The Monotype Corporation.
  Copyright:           © 2011 The Monotype Corporation. All Rights Reserved.
  License Description: You may use this font to display and print content as permitted by
                       the license terms for the product in which this font is included.
                       You may only (i) embed this font in content as permitted by the 
                       embedding restrictions included in this font; and (ii) temporarily 
                       download this font to a printer or other output device to help
                       print content.
  Vendor ID:           TMC

用户回答回答于

扫码关注云+社区