web-dev-qa-db-ja.com

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

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

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

148
simplybest55

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


pdftopsを使用する

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

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

fontforgeを使用する

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

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

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


mupdfを使用する

次に、 MuPDF このアプリケーションには、PDFからフォントと画像を抽出できるpdfextract(Windowsの場合:pdfextract.exe)というユーティリティが付属しています。 (まだあまり知られていない新しいMuPuについて知らない場合: "MuPDFは無料の軽量PDFビューアーおよびポータブルCで書かれたツールキットです。"、Ghostscriptを提供した同じ会社のArtifex Software開発者によって作成されました。)
更新: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のようになります。フォントのPDFオブジェクト番号が966の場合、フォント名はFGETYK + LinLibertineI-0966.ttfのようになります。

CFF(Compact Font Format)ファイルは、さまざまなオペレーティングシステムで使用するためのさまざまなコンバーターを介して他の形式に変換できる認識された形式です。

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

更新:(2013年7月)mupdfの最近のバージョンでは、バイナリの内部的なシャッフルと名前変更が1回だけでなく数回行われています。メインユーティリティは、以前はmubusy(busyboxに触発された名前?)と呼ばれる「スイスナイフ」のようなバイナリでしたが、最近ではmutoolに名前が変更されました。これらは、サブコマンドinfocleanextractposter、およびshowをサポートしています。残念ながら、これらのツールの公式ドキュメントは最新ではありません(まだ)。 「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 は、PDFから直接フォントを抽出することもできます。ただし、 extractFonts.ps という名前の特別なユーティリティプログラムの助けが必要です。 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、Mac OS Xの場合:

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

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


pdf-parser.pyを使用する

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

しかし、何を探すべきかを知る必要があります。例を見てみましょう。 big.pdfという名前のファイルがあります。最初のステップとして、-sパラメーターを使用して、PDFでキーワードFontFilepdf-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
  >>   

PDF内にはFontFile2のインスタンスが2つあり、これらはPDFオブジェクトにあります。 15といいえ。 16、それぞれ。オブジェクト番号15は、フォント/ ArialMT、オブジェクト番号の/FontFile2を保持します。 16は、フォント/ Arial-BoldMT/FontFile2を保持します。

これをより明確に示すには:

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または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でエンコード(== "compressed")され、デコードする必要がある(== "de -compressed」または「filtered」)標準の/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 packageの一部です)がっかりします最初は:

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オブジェクト番号にも保存されていました。キー/Length1の値としての15の辞書...

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バイト)を考えると、このフォントはPDFに完全に埋め込まれているようです...

名前をarial-regular.ttfに変更し、そのままインストールして、喜んで利用することができます。


警告:

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

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

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

371
Kurt Pfeifle

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

22
igo

最終的に FontForge Windowsインストーラーパッケージ が見つかり、インストールされたプログラムを介してPDFを開きました。とても喜んで働いた。

5
Dapizz

http://www.verypdf.com/app/pdf-font-extractor/pdf-font-extracting-tool.html フォントを抽出するIMOの最も簡単な方法(Windows)。

4
l00k

PDF2SVG バージョン6.0から PDFTron は妥当な仕事をします。デフォルトでOpenType(.otf)フォントを生成します。 --preserve_fontnamesを使用して、「ソースファイルから取得したフォント/フォントファミリの命名スキーム」を保持します。

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

2
Sean Leather

Pdfフォントを抽出するために現在利用できる最高のオンラインツールの1つは http://www.pdfconvertonline.com/extract-pdf-fonts-online.html です

1

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

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

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

  1. フォルダー/usr/share/fontsにコピーします(ルートとして)
  2. fc-cache -f /usr/share/fonts/の実行(ルートとして)
0
Mad Physicist