我知道pdftk.exe
实用程序可以指示PDF使用哪些字体,以及它们是否嵌入。
现在的问题是:鉴于我有带嵌入字体的PDF文件 - 如何以可重复使用的常规字体文件的形式提取这些字体?是否有(最好是免费的)工具可以做到这一点?另外:这可以用iText以编程方式完成吗?
你有几个选择。所有这些方法都适用于Linux以及Windows或Mac OS X.但是,请注意,大多数PDF在嵌入字体时不包括完整,完整的字体。大多数情况下,它们只包含文档中使用的字形子集。
pdftops
在* nix系统上执行此操作的最常用方法之一包括以下步骤:
pdftops
(在Windows上:pdftops.exe
帮助程序)。.pfa
(PostScript)格式+您可以使用文本编辑器提取它们。.pfa
和.pfb
将qazxsw poi(ASCII)转换为qazxsw poi(二进制)文件。t1utils
或pfa2pfb
文件(字体度量文件)(因为PDF查看器具有关于这些的内部知识)。没有这些,字体文件几乎不能以视觉上令人愉悦的方式使用。.pfm
另一种方法是使用免费字体编辑器.afm
:
检查FontForge手册。您可能需要遵循一些不一定简单的特定步骤,以便将提取的字体数据保存为可重复使用的文件。
fontforge
接下来,FontForge。此应用程序附带了一个名为mupdf
的实用程序(在Windows上:MuPDF),它可以从PDF中提取字体和图像。 (如果您不了解MuPDF,它仍然是相对未知和新的:“MuPDF是一个免费的轻量级PDF查看器和工具包,用便携式C编写。”,由Artifex软件开发人员编写,同一家公司给了我们Ghostscript。 )
(更新:更新版本的MuPDF已将'pdfextract'的前一功能移至命令'mutool extract'。在此处下载:pdfextract
)
注意:pdfextract.exe
是一个命令行程序。要使用它,请执行以下操作:
mupdf.com/downloads
此命令将从引用到当前目录的pdf文件中转储所有可提取文件。通常,您会看到各种文件:图像和字体。这些包括PNG,TTF,CFF,CID等。如果图像的PDF对象编号为412,图像名称将类似于img-0412.png。字体名称将类似于FGETYK + LinLibertineI-0966.ttf,如果字体是PDF对象编号为966。
CFF(压缩字体格式)文件是一种公认的格式,可以通过各种转换器转换为其他格式,以便在不同的操作系统上使用。
再次:请注意,大多数这些字体文件可能只有一个字符子集,可能不代表完整的字体。
更新:(2013年7月)最近版本的pdfextract.exe
已经看到了他们的二进制文件的内部重组和重命名,不仅仅是一次,而是多次。主要的实用程序曾经是一个名为c:\> pdfextract.exe c:\path\to\filename.pdf # (on Windows)
$> pdfextract /path/tofilename.pdf # (on Linux, Unix, Mac OS X)
(名称灵感来自busybox?)的'瑞士刀'相似的二进制文件,最近更名为mupdf
。这些支持子命令mubusy
,mutool
,info
,clean
和extract
。不幸的是,这些工具的官方文档还不是最新的。如果你使用'MacPorts'在Mac上:然后重命名该实用程序以避免与使用相同名称的其他实用程序发生名称冲突,并且您可能需要使用poster
。
为了获得(大致)相同的结果,show
作为mupdfextract
之前的工具,只需运行mutool
。*
因此,要提取字体和图像,您可能需要运行以下命令行之一:
pdfextract
下载地点:mubusy extract ...
c:\> mutool.exe extract filename.pdf # (on Windows)
$> mutool extract filename.pdf # (on Linux, Unix, Mac OS X)
(Ghostscript)然后,mupdf.com/downloads还可以直接从PDF中提取字体。但是,它需要一个名为gs
的特殊实用程序的帮助,该程序用PostScript语言编写,可以从Ghostscript获得。
现在使用它,你需要同时运行这个文件extractFonts.ps
和你的PDF文件。然后Ghostscript将使用PostScript程序中的指令从PDF中提取字体。在Windows上看起来像这样(是的,Ghostscript在Windows上也理解'正斜杠',/作为路径分隔符!):
Ghostscript source code repository
或者在Linux,Unix或Mac OS X上:
extractFonts.ps
几年前我测试了Ghostscript方法。当时它确实提取* .ttf(TrueType)就好了。我不知道是否还会提取其他字体类型,如果是,则以可重用的方式提取。我不知道该实用程序是否阻止提取标记为受保护的字体。
gswin32c.exe ^
-q -dNODISPLAY ^
c:/path/to/extractFonts.ps ^
-c "(c:/path/to/your/PDFFile.pdf) extractFonts quit"
最后,Didier Stevens的gs \
-q -dNODISPLAY \
/path/to/extractFonts.ps \
-c "(/path/to/your/PDFFile.pdf) extractFonts quit"
:这个可能不那么容易使用,因为你需要对内部PDF结构有一些了解。 pdf-parser.py
是一个Python脚本,它也可以做很多其他事情。它还可以从对象中解压缩和提取任意流,因此它也可以提取嵌入的字体文件。
但你需要知道要寻找什么。让我们看一个例子吧。我有一个名为big.pdf的文件。作为第一步,我使用pdf-parser.py参数搜索PDF以查找关键字FontFile的任何出现(pdf-parser.py
不需要区分大小写的搜索):
-s
就我而言,对于我的big1.pdf,我得到了这个结果:
pdf-parser.py
它告诉我PDF中有两个pdf-parser.py -s fontfile big.pdf
实例,这些实例都是PDF对象。 15而没有。分别为16。对象号15持有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
>>
for font / ArialMT,对象号。 16持有FontFile2
for font / Arial-BoldMT。
为了更清楚地表明这一点:
/FontFile2
快速查看PDF规范可以发现关键字/FontFile2
与'包含TrueType字体程序的流'有关(pdf-parser.py -s fontfile big1.pdf | grep -i fontfile
/FontFile2 15 0 R
/FontFile2 16 0 R
与'包含Type 1字体程序的流'有关,/FontFile2
与'包含字体程序的流有关)其格式由流字典中的子类型条目'{因此是Type1C或CIDFontType0C子类型}指定。)
具体看PDF对象没有。 15(其中包含字体/ ArialMT),可以使用/FontFile
参数:
/FontFile3
这个-o 15
输出告诉我们这个对象包含一个流(它不会直接显示),其长度为1.581.435字节,并使用ASCIIHexEncode进行编码(==“压缩”),需要进行解码(==“de - 在标准pdf-parser.py -o 15 big1.pdf
obj 15 0
Type:
Referencing:
Contains stream
<<
/Length1 778552
/Length 1581435
/Filter /ASCIIHexDecode
>>
过滤器的帮助下压缩“或”过滤“)。
要从对象转储任何流,可以使用pdf-parser.py
参数调用/ASCIIHexDecode
。我们开始做吧:
pdf-parser.py
我们提取的数据转储将位于名为dumped-data.ext的文件中。让我们看看它有多大:
-d dumpname
哦,看,它是1.581.435字节。我们在上一个命令的输出中看到了这个数字。使用文本编辑器打开此文件可确认其内容是ASCII十六进制编码数据。
使用像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
好吧,这是因为我们还没有(还)让lcdf-typetools
package充分利用它的全部魔力:转储过滤后的解码流。为此,我们必须添加otfinfo -i dumped-data.ext
otfinfo: dumped-data.ext: not an OpenType font (bad magic number)
参数:
pdf-parser.py
这个新文件的大小是多少?
-f
哦,看:确切的数字也已存储在PDF对象中。 15字典作为关键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
认为它是什么?
/Length1
file
告诉我们什么呢?
file dumped-data-decoded.ext
dumped-data-decoded.ext: TrueType font data
所以Bingo!,我们有一个胜利者:otfinfo
确实为我们提取了一个有效的字体文件。鉴于此文件的大小(778.552字节),看起来这个字体甚至完全嵌入PDF中...
我们可以将它重命名为arial-regular.ttf并安装它,并愉快地使用它。
请阅读以下有关字体提取工作的优点和(更多)缺点:
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
- 不再可用,但可以在pdf-parser.py
的Wayback Machine上看到使用在线服务http://typophile.com/node/34377。无需安装任何东西。
最终找到https://web.archive.org/web/20110717120241/typophile.com/node/34377并通过已安装的程序打开PDF。工作了一个享受,很开心。
http://www.extractpdf.com IMO最简单的提取字体的方法(Windows)。
来自the FontForge Windows installer package的http://www.verypdf.com/app/pdf-font-extractor/pdf-font-extracting-tool.html 6.0版做得很合理。它默认生成OpenType(PDF2SVG)字体。使用PDFTron保留“从源文件中获取的字体/字体系列命名方案”。
PDF2SVG是商业产品,但您可以下载免费的演示可执行文件(其中包括SVG输出上的水印,但不限制使用)。可能还有其他PDFTron产品也会提取字体,但我最近才发现了PDF2SVG。
目前可用于提取pdf字体的最佳在线工具之一是.otf
这是--preserve_fontnames
的http://www.pdfconvertonline.com/extract-pdf-fonts-online.html部分的后续内容,专门针对Red Hat(以及可能的其他Linux发行版)。
获得TTF文件后,您可以将其安装在您的系统上
font-forge
(以root身份)