我怎样才能从PDF提取embedded的字体作为有效的字体文件?
我知道pdftk.exe
实用程序可以指示哪些字体由PDF使用,而且它们是否embedded。
现在的问题是:由于我的PDF文件中embedded了字体 – 我怎样才能提取这些字体的方式,他们是可重用的常规字体文件? 有没有(最好是免费)的工具可以做到这一点? 另外:这可以用编程方式完成,比如iText?
你有几个select。 所有这些方法都可以在Linux以及Windows或Mac OS X上运行。但是,请注意,大多数PDF在embedded字体时不包含完整的完整字体。 大多数情况下,它们只包括文档中使用的字形的子集 。
使用pdftops
在nix系统上使用最常用的方法之一包括以下步骤:
- 将PDF转换为PostScript,例如使用XPDF的
pdftops
(在Windows上:pdftops.exe
帮助程序。 - 现在,字体将以
.pfa
(PostScript)格式embedded,您可以使用文本编辑器将其提取出来。 - 您可能需要使用
t1utils
和pfa2pfb
将.pfa
(ASCII)转换为.pfb
(二进制)文件。 - 在PDF中,从来没有
.pfm
或.afm
文件(字体度量文件)(因为PDF查看器有关于这些的内部知识)。 没有这些,字体文件几乎不可用于视觉愉悦的方式。
使用fontforge
另一种方法是使用Free字体编辑器FontForge :
- 打开文件时使用“打开字体”对话框。
- 然后在对话框的filter部分select“从PDF中提取” 。
- select要提取字体的PDF文件。
- “Pick a font”对话框打开 – select要打开的字体。
检查FontForge手册。 您可能需要遵循一些不一定简单的特定步骤,以便将提取的字体数据保存为可重用的文件。
使用mupdf
接下来, MuPDF 。 这个应用程序带有一个名为pdfextract
的实用程序(在Windows上: pdfextract.exe
),可以从PDF中提取字体和图像。 (如果您不了解MuPDF,这仍然是一个相对未知和新的: “MuPDF是一个免费的轻便的PDF阅读器和工具包在便携式C编写” ,由Artifex软件开发人员写的,是给我们Ghostscript相同的公司。 )
( 更新:较新版本的MuPDF已经将'pdfextract'的前一个function移动到命令'mutool extract' 。下载: mupdf.com/downloads )
注意: pdfextract.exe
是一个命令行程序。 要使用它,请执行以下操作:
c:\> pdfextract.exe c:\path\to\filename.pdf # (on Windows) $> pdfextract /path/tofilename.pdf # (on Linux, Unix, Mac OS X)
这个命令将把所有可引用的pdf文件转储到当前目录中。 通常你会看到各种文件:图像以及字体。 这些包括PNG,TTF,CFF,CID等。如果图像的PDF对象编号为412,则图像名称将如同img-0412.png。字体名称将像FGETYK + LinLibertineI-0966.ttf ,如果字体PDF对象编号是966。
CFF( 压缩字体格式 )文件是可识别的格式,可以通过各种转换器转换为其他格式,以用于不同的操作系统。
再说一次:请注意,这些字体文件中的大部分可能只有一个字符的子集 ,可能并不代表完整的字体。
更新: (2013年7月)最近版本的mupdf
已经看到他们的二进制文件内部重组和重命名,不只是一次,而是几次。 主要实用程序曾经是一个“瑞士刀”相似的二进制mubusy
(名字由busybox启发?),最近更名为mutool
。 这些支持子命令info
, clean
, extract
, poster
和show
。 不幸的是,这些工具的官方文档尚未更新(尚)。 如果您使用MacPorts在Mac上,则该实用程序已重命名,以避免与使用相同名称的其他实用程序发生名称冲突,并且您可能需要使用mupdfextract
。
为了达到与之前的工具pdfextract
一样的mutool
的(大致)等效结果,只需运行mubusy extract ...
*
所以要提取字体和图像,您可能需要运行以下命令行之一:
c:\> mutool.exe extract filename.pdf # (on Windows) $> mutool extract filename.pdf # (on Linux, Unix, Mac OS X)
下载地址在这里: mupdf.com/downloads
使用gs
(Ghostscript)
然后, Ghostscript也可以直接从PDF中提取字体。 但是,它需要一个名为extractFonts.ps
的特殊实用程序的帮助,该程序使用PostScript语言编写,可以从Ghostscript源代码库获得 。
现在使用它,你需要运行这个文件extractFonts.ps
和你的PDF文件。 Ghostscript将使用PostScript程序中的指令从PDF中提取字体。 它在Windows上看起来像这样(是的,Ghostscript理解“正斜杠”,/,在Windows上也是一个path分隔符):
gswin32c.exe ^ -q -dNODISPLAY ^ c:/path/to/extractFonts.ps ^ -c "(c:/path/to/your/PDFFile.pdf) extractFonts quit"
或在Linux,Unix或Mac OS X上:
gs \ -q -dNODISPLAY \ /path/to/extractFonts.ps \ -c "(/path/to/your/PDFFile.pdf) extractFonts quit"
几年前我testing了Ghostscript方法。 当时它提取* .ttf(TrueType)就好了。 我不知道其他字体types是否也将被提取,如果是的话,以可重用的方式。 我不知道该实用程序是否阻止提取标记为受保护的字体。
使用pdf-parser.py
最后,Didier Stevens的pdf-parser.py :这个可能不太容易使用,因为你需要掌握一些关于内部PDF结构的知识。 pdf-parser.py
是一个Python脚本,可以做很多其他的事情。 它也可以从对象中解压缩和提取任意stream,因此也可以提取embedded的字体文件。
但是你需要知道要寻找什么。 我们来看一个例子。 我有一个名为big.pdf的文件。 作为第一步,我使用-s
参数来searchPDF关键字FontFile的任何出现( pdf-parser.py
不需要区分大小写的search):
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 >>
它告诉我,PDF中有两个FontFile2
实例,这些实例在PDF对象编号中。 15没有。 16,分别。 对象编号 15保存/FontFile2
为font /FontFile2
,对象编号。 16保存font / Arial-BoldMT的/ FontFile2 。
为了更清楚地表明这一点:
pdf-parser.py -s fontfile big1.pdf | grep -i fontfile /FontFile2 15 0 R /FontFile2 16 0 R
对PDF规范的快速浏览揭示了关键字/FontFile2
涉及到一个“包含TrueType字体程序的stream” ( /FontFile
将涉及到“包含Type 1字体程序的stream”,而/FontFile3
涉及到一个包含“一个字体程序,其格式由stream字典' {因此是Type1C或CIDFontType0C子types}中的子types条目指定 。
专门查看PDF对象编号 15(包含font / 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字节的stream(它不会直接显示),用ASCIIHexEncode进行编码(==“压缩”),需要解码( ==“解压缩”或“过滤”)与标准/ASCIIHexDecode
filter的帮助。
要从对象转储任何stream,可以使用-d dumpname
参数调用-d dumpname
。 我们开始做吧:
pdf-parser.py -o 15 -d dumped-data.ext big1.pdf
我们提取的数据转储将位于名为dumped-data.ext的文件中。 让我们看看它有多大:
ls -l dumped-data.ext -rw-r--r-- 1 kurtpfeifle staff 1581435 Apr 11 00:29 dumped-data.ext
哦,看,这是1.581.435字节。 我们在前面的命令输出中看到了这个数字。 用文本编辑器打开这个文件确认它的内容是ASCIIhex编码的数据。
用像otfinfo
这样的字体阅读工具(这是lcdf-typetools
包的一部分)打开文件首先会导致一些失望:
otfinfo -i dumped-data.ext otfinfo: dumped-data.ext: not an OpenType font (bad magic number)
好的,这是因为我们还没有(让) pdf-parser.py
充分利用它的魔力:转储过滤的解码stream。 为此,我们必须添加-f
参数:
pdf-parser.py -o 15 -f -d dumped-data-decoded.ext big1.pdf
这个新文件的大小是多less?
ls -l dumped-data-decoded.ext -rw-r--r-- 1 kurtpfeifle staff 778552 Apr 11 00:39 dumped-data-decoded.ext
哦,看:确切的数字也已经存储在PDF对象编号。 15字典作为键/Length1
的值…
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
所以Bingo !,我们有一个赢家: pdf-parser.py
确实为我们提取了一个有效的字体文件。 鉴于这个文件的大小(778.552字节),它看起来像这个字体已经embedded在PDF甚至完全 …
我们可以将它重命名为arial-regular.ttf ,然后像这样安装它,然后很高兴地使用它。
注意事项:
-
无论如何,您需要遵循适用于字体的许可证。 某些字体许可证不允许免费使用和/或分发。 盗版字体就像盗版任何软件或其他受版权保护的材料一样。
-
大多数在外面的PDF都没有embedded完整的字体,但只有子集。 提取字体的一个子集只在有限的范围内有用,如果有的话。
请阅读以下有关字体提取努力的优点和(更多)缺点:
使用在线服务http://www.extractpdf.com 。 不需要安装任何东西。
最终findFontForge Windows安装程序包,并通过安装的程序打开PDF。 工作过,很高兴。
从PDFTron的 PDF2SVG版本6.0做了一个合理的工作。 它默认生成OpenType( .otf
)字体。 使用--preserve_fontnames
保存“从源文件获得的字体/字体系列命名scheme”。
PDF2SVG是一个商业产品,但您可以下载一个免费的演示可执行文件(其中包括SVG输出上的水印,但不限制使用)。 可能还有其他PDFTron产品也提取字体,但是我最近才发现了PDF2SVG。
http://www.verypdf.com/app/pdf-font-extractor/pdf-font-extracting-tool.html IMO最简单的方法来提取字体(Windows)。
目前提供pdf字体的最好的在线工具之一是http://www.pdfconvertonline.com/extract-pdf-fonts-online.html