PDFから埋め込みフォントを有効なフォントファイルとして抽出するにはどうすればよいですか?


161

私は知っています pdftk.exePDFで使用されているフォント、およびそれらが埋め込まれているかどうかを示すユーティリティをいます。

さて、問題:フォントが埋め込まれたPDFファイルがある場合、それらのフォントを通常のフォントファイルとして再利用できるようにするにはどうすればよいですか?それができる(できれば無料の)ツールはありますか?また、これは、たとえばiTextを使用してプログラムで実行できますか?

回答:


405

いくつかのオプションがあります。これらの方法はすべて、LinuxとWindowsまたはMac OS Xで機能します。ただし、フォントが埋め込まれている場合、ほとんどのPDFには完全で完全なフォントフェイスが含まれていないことに注意してください。ほとんどの場合、ドキュメントで使用されているグリフのサブセットのみが含まれています。


使用する pdftops

* nixシステムでこれを行うために最も頻繁に使用される方法の1つは、以下のステップで構成されます。

  1. たとえばXPDFを使用してPDFをPostScriptに変換pdftopsします(Windowsの場合:pdftops.exeヘルパープログラム)。
  2. フォントは.pfa(PostScript)形式で埋め込まれます+ テキストエディターを使用してフォントを抽出できます。。
  3. and を使用して.pfa(ASCII)を.pfb(バイナリ)ファイルに変換する必要がある場合があります。t1utilspfa2pfb
  4. PDFには、.pfmまたは.afmファイル(フォントメトリックファイル)が埋め込まれることはありません(PDFビューアがこれらに関する内部知識を持っているため)。これらがないと、フォントファイルは視覚的に満足できる方法ではほとんど使用できません。

使用する fontforge

もう1つの方法は、フリーフォントエディターFontForgeを使用することです。

  1. 「フォントを開く」を使用しますダイアログボックスがファイルを開くときに使用されます。
  2. 次に、「PDFから抽出」を選択します、ダイアログのフィルターセクションで[。
  3. フォントを抽出するPDFファイルを選択します。
  4. 「フォント選び」ダイアログボックスが開きます-開くためにどのフォントここで選択しました。

FontForgeのマニュアルを確認してください。抽出されたフォントデータを再利用可能なファイルとして保存するために、必ずしも簡単ではないいくつかの特定の手順に従う必要がある場合があります。


使用する mupdf

次に、MuPDFです。このアプリケーションには、pdfextract(Windowsではpdfextract.exe)というユーティリティが付属しており、PDFからフォントや画像を抽出できます。(まだまだ知られていない新しい新しいMuPDFについて知らない場合:「MuPDFは、 Ghostscriptを提供したのと同じ会社であるArtifex Software開発者によって書かれた、ポータブルCで書かれた無料の軽量PDFビューアおよびツールキットです。」
更新: MuPDFの新しいバージョンでは、「pdfextract」の以前の機能がコマンド「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(Compact Font Format)ファイルは、さまざまなオペレーティングシステムで使用するためにさまざまなコンバーターを介して他の形式に変換できる認識された形式です。

繰り返しますが、これらのフォントファイルのほとんどは文字のサブセットのみを含み、完全な書体を表さない場合があることに注意してください。

更新:(2013年7月)最近のバージョンでmupdfは、バイナリの内部的な変更と名前の変更が1回だけでなく数回行われました。主なユーティリティは、「スイスナイフ」のようなバイナリmubusy(busyboxに触発された名前?)でしたが、最近ではに名前が変更されましたmutool。これらは、サブコマンドをサポートしinfocleanextractpostershow。残念ながら、これらのツールの公式ドキュメントは最新のものではありません。「MacPorts」を使用してMacを使用している場合:同じ名前を使用する他のユーティリティとの名前の競合を回避するために、ユーティリティの名前が変更されましたmupdfextract

mutool以前のツールとほぼ同じ結果を得るにpdfextractは、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から直接フォントを抽出することもできます。ただし、GhostscriptソースコードリポジトリextractFonts.psから入手できるPostScript言語で記述されたという特別なユーティリティプログラムの助けが必要です

これを使用して、このファイル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、Mac OS Xの場合:

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

私はGhostscriptメソッドを数年前にテストしました。当時は* .ttf(TrueType)を問題なく抽出していました。他のフォントタイプもまったく抽出されるかどうか、もしそうであれば、再利用可能な方法で私は知りません。ユーティリティが保護されているとマークされているフォントの抽出をブロックするかどうかはわかりません。


使用する pdf-parser.py

最後に、Didier Stevensのpdf-parser.py:内部のPDF構造に関するいくつかのノウハウが必要なため、これはおそらくそれほど簡単に使用できません。pdf-parser.py他にも多くのことができるPythonスクリプトです。また、オブジェクトから任意のストリームを解凍および抽出できるため、埋め込みフォントファイルも抽出できます。

しかし、何を探すべきかを知る必要があります。例で見てみましょう。big.pdfという名前のファイルがあります。最初のステップとして、-sパラメーターを使用してPDFを検索し、キーワードFontFileの出現を探します(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内に2つのインスタンスがあり、これらは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に関連するであろう「Type 1フォントプログラムを含むストリーム」/FontFile3に関連するであろう形式であるフォントプログラムを含む「ストリームストリームディクショナリのサブタイプエントリで指定されている(したがって、Type1CまたはCIDFontType0Cサブタイプのいずれかである})。

特に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でエンコード(== "圧縮")されており、デコード(== "de-圧縮された」または「フィルター処理された」)標準/ASCIIHexDecodeフィルターの助けを借りて。

オブジェクトからストリームをダンプするにpdf-parser.pyは、-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バイトです。前のコマンドの出力でこの図を確認しました。このファイルをテキストエディタで開くと、その内容がASCIIの16進エンコードデータであることを確認できます。

otfinfo(これはlcdf-typetoolsパッケージの一部です)のようなフォント読み取りツールでファイルを開くと、最初は少しがっかりします。

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

OK、これは(まだ)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

ああ、見てください。その正確な数は、PDFオブジェクトnoにもすでに格納されています。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

だからビンゴ!、私たちは勝者を持っています:pdf-parser.py確かに私たちのために有効なフォントファイルを抽出しました。このファイルのサイズ(778.552バイト)を考えると、このフォントはPDFに完全に埋め込まれているように見えます...

名前をarial-regular.ttfに変更できますインストールすることで、楽しく利用できます。


警告:

  • いずれの場合も、フォントに適用されるライセンスに従う必要があります。一部のフォントライセンスでは、自由に使用したり配布したりすることはできません。フォントの海賊版は、ソフトウェアやその他の著作権のある素材の海賊版に似ています。

  • 世の中に出回っているほとんどのPDFは、とにかく完全なフォントを埋め込まず、サブセットのみを埋め込みます。フォントのサブセットを抽出することは、非常に限られた範囲でのみ有効です。

フォント抽出の取り組みに関する長所と短所については、以下もお読みください。


3
@ kizzx2:他の[PDF]または[Ghostscript]の回答に賛成または反対の投票を自由にしてください:-)
Kurt Pfeifle

Macを使用していて、ポートから(またはおそらくバイナリからも)mupdfをインストールする場合、抽出もmupdfextractと呼ばれます。パス内にある限り、ターミナルから実行できます。
Orwellophile

@Orwellophile:ヒントをありがとう。私はこれを、私のに関するいくつかのヒントを更新する機会と捉えましたmupdfこれも参照してください...
Kurt Pfeifle

それらをチェックします。そして、これは無意味なコメントではありません。あなたのプロセスは驚くほどうまくいきました... 残念ながら、私のフォントにはまだ大文字の「X」がありません...確率は何ですか:p
Orwellophile

1
@Chris:はい、これらは2つの異なるサブセットです(大きな部分でも重複する場合があります)。自動的にマージするオプションはありません。
カートファイファイ

26

オンラインサービスhttp://www.extractpdf.comを使用します。何もインストールする必要はありません。


私の場合、TrueTypeではなくType 1フォントしか抽出できませんでした
koppor

このサイトを使用してフォントを抽出し、でコピーしまし~/.fontsた。コピーと貼り付けは機能していました。
Eduardo Santana



3

この質問は10年前のものですが、それでも有効であり、テクノロジーの変化に応じて有効な回答も変わります。

現在の回答を検索したところ、どれもWOFF(Web Open Font Format)(W3C)(Wikipedia)であることに気づきませんでした。これを使用して、個々の文字(グリフ)を再作成し、Webページに正確に表示できます。

IDR Solutionsによる無料のオンラインWebページ、PDF to HTML5(link)を使用して、PDFをzipファイルに変換します。結果のzipには、woffファイルタイプのフォントディレクトリが含まれます。現在のインターネットブラウザーは、知らない場合はwoffファイルをサポートしています。(参照)これらは、オンラインサイトFontDropで調べることができます!(リンク)。

WOFFファイルは、WOFFer – WOFFフォントコンバーターでOTFまたはTTFとの間で変換できます。

また、PDFからHTML5へのzipファイルには、インターネットブラウザーで開くことができるPDFの各ページのHTMLファイルが含まれます。これは、私が見つけた、または見た中で最も優れた最も正確なPDF翻訳の1つです。

私はWOFFファイルの使用方法を学習しているだけですが、これは渡す価値があります。楽しい。

PS、おそらくwoffファイルタイプの使用についてさらに学習するにつれて、より多くの情報で更新する予定ですが、これはクリエイティブコモンズであるため、渡す価値のあるものがあれば、この回答を自由に編集してください。


ありがとうございました!このソリューションは(有効なTTFの作成と同様に)私には有効ですが、私が試した他のソリューションでは機能しません。WOFFが不完全なフォントをより適切に処理するためですか?
大安

@大安わからIs it because WOFF handles incomplete fonts better?ない あなたの推測は私のものと同じくらい良いでしょう。私が指摘したように、私は自分自身でWOFFについて学んでいるだけです。
Guy Coder

@DaanおそらくIs it because WOFF handles incomplete fonts better?、新しいSO質問として投稿する必要があります。そうすれば、より知識のある他の人が見て、できれば有意義な回答を提供してくれるでしょう。
Guy Coder

私はそうするかもしれません。ありがとう。
大安

2

PDF2SVGのからバージョン6.0 PDFTronは、合理的な仕事をしていません。.otfデフォルトでOpenType()フォントを生成します。--preserve_fontnames「ソースファイルから取得したfont / font-family命名スキーム」を保持するために使用します。

PDF2SVGは商用製品ですが、無料のデモ実行可能ファイルをダウンロードできます(SVG出力に透かしが含まれていますが、使用方法を制限していません)。フォントを抽出する他のPDFTron製品もあるかもしれませんが、私は最近PDF2SVGを自分で発見しました。


残念ながら--preserve_fontnames、部分的なフォントが重複している場合は機能しません。たとえば、MSCIYGin などの接頭辞が含まれていないように見えるMSCIYG+Ge'ez-1ため、以前の部分的なフォントが上書きされます。
クリス


0

これは@Kurt Pfeifleの回答のfont-forgeセクションのフォローアップであり、Red Hat(およびその他のLinuxディストリビューション)に固有のものです。

  1. PDFを開いて必要なフォントを選択したら、[ファイル]-> [フォントの生成...]オプションを選択します。
  2. ファイルにエラーがある場合は、それらを無視するか、ファイルを保存して編集するかを選択できます。[修正]を何度かクリックすると、ほとんどのエラーは自動的に修正されます。
  3. 「要素->フォント情報...」をクリックすると、「フォント名」、「ファミリ名」、「人間の名前」がすべて好きな値に設定されます。そうでない場合は、それらを変更してファイルをどこかに保存します。これらの名前により、システムでのフォントの表示方法が決まります。
  4. ファイル名を選択し、[保存...]をクリックします

TTFファイルを取得したら、次の方法でシステムにインストールできます。

  1. フォルダに/usr/share/fonts(ルートとして)コピーする
  2. 実行中fc-cache -f /usr/share/fonts/(rootとして)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.