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

问题描述 投票:146回答:7

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

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

pdf fonts ghostscript true-type-fonts embedded-fonts
7个回答
374
投票

你有几个选择。所有这些方法都适用于Linux以及Windows或Mac OS X.但是,请注意,大多数PDF在嵌入字体时不包括完整,完整的字体。大多数情况下,它们只包含文档中使用的字形子集。


Using pdftops

在* nix系统上执行此操作的最常用方法之一包括以下步骤:

  1. 将PDF转换为PostScript,例如使用XPDF的pdftops(在Windows上:pdftops.exe帮助程序)。
  2. 现在字体将嵌入.pfa(PostScript)格式+您可以使用文本编辑器提取它们。
  3. 您可能需要使用.pfa.pfb将qazxsw poi(ASCII)转换为qazxsw poi(二进制)文件。
  4. 在PDF中,从不嵌入t1utilspfa2pfb文件(字体度量文件)(因为PDF查看器具有关于这些的内部知识)。没有这些,字体文件几乎不能以视觉上令人愉悦的方式使用。

Using .pfm

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

  1. 使用打开文件时使用的“打开字体”对话框。
  2. 然后在对话框的过滤器部分中选择“从PDF中提取”。
  3. 选择包含要提取的字体的PDF文件。
  4. 将打开“选择字体”对话框 - 选择要打开的字体。

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


Using 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。这些支持子命令mubusymutoolinfocleanextract。不幸的是,这些工具的官方文档还不是最新的。如果你使用'MacPorts'在Mac上:然后重命名该实用程序以避免与使用相同名称的其他实用程序发生名称冲突,并且您可能需要使用poster

为了获得(大致)相同的结果,show作为mupdfextract之前的工具,只需运行mutool。*

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

pdfextract

下载地点:mubusy extract ...


Using 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)就好了。我不知道是否还会提取其他字体类型,如果是,则以可重用的方式提取。我不知道该实用程序是否阻止提取标记为受保护的字体。


Using 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并安装它,并愉快地使用它。


注意事项:

  • 在任何情况下,您都需要遵循适用于该字体的许可证。某些字体许可证不允许免费使用和/或分发。盗版字体就像盗版任何软件或其他受版权保护的材料一样。
  • 大多数PDF文件都没有嵌入完整的字体,但只有子集。提取字体的子集仅在非常有限的范围内有用(如果有的话)。

请阅读以下有关字体提取工作的优点和(更多)缺点:

  • 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上看到

22
投票

使用在线服务http://typophile.com/node/34377。无需安装任何东西。


5
投票

最终找到https://web.archive.org/web/20110717120241/typophile.com/node/34377并通过已安装的程序打开PDF。工作了一个享受,很开心。


4
投票

http://www.extractpdf.com IMO最简单的提取字体的方法(Windows)。


2
投票

来自the FontForge Windows installer packagehttp://www.verypdf.com/app/pdf-font-extractor/pdf-font-extracting-tool.html 6.0版做得很合理。它默认生成OpenType(PDF2SVG)字体。使用PDFTron保留“从源文件中获取的字体/字体系列命名方案”。

PDF2SVG是商业产品,但您可以下载免费的演示可执行文件(其中包括SVG输出上的水印,但不限制使用)。可能还有其他PDFTron产品也会提取字体,但我最近才发现了PDF2SVG。


1
投票

目前可用于提取pdf字体的最佳在线工具之一是.otf


0
投票

这是--preserve_fontnameshttp://www.pdfconvertonline.com/extract-pdf-fonts-online.html部分的后续内容,专门针对Red Hat(以及可能的其他Linux发行版)。

  1. 打开PDF并选择所需的字体后,您需要选择“文件 - >生成字体...”选项。
  2. 如果文件中存在错误,您可以选择忽略它们或保存文件并进行编辑。如果单击“修复”足够的次数,大多数错误都可以自动修复。
  3. 单击“元素 - >字体信息...”,“字体名称”,“姓氏”和“人类名称”都设置为您喜欢的值。如果没有,请修改它们并将文件保存在某处。这些名称将决定您的字体在系统中的显示方式。
  4. 选择您的文件名,然后单击“保存...”

获得TTF文件后,您可以将其安装在您的系统上

  1. 将其复制到文件夹font-forge(以root身份)
  2. 运行@Kurt Pfeifle's answer(以root身份)
© www.soinside.com 2019 - 2024. All rights reserved.