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

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

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

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

ベストアンサー1

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


使用pdftops

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

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

使用fontforge

もう一つの方法は、フリーフォントエディタを使うことですフォントフォージ:

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

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


使用mupdf

次、ムPDFpdfextractこのアプリケーションには、PDF からフォントや画像を抽出できる(Windows の場合: )というユーティリティが付属していますpdfextract.exe。(まだあまり知られていない新しい MuPDF についてご存じない場合:「MuPDF は、ポータブル C で書かれた無料の軽量 PDF ビューアおよびツールキットです。」 Ghostscript を開発した同じ会社である Artifex Software 開発者によって作成されました。
アップデート:MuPDFの新しいバージョンでは、以前の機能は'pdfextract'コマンドに「ミューツールエキス」ここからダウンロードしてください:mupdf.com/ダウンロード

注: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 などが含まれます。画像の名前は次のようになります。画像0412.png画像のPDFオブジェクト番号が412の場合、フォント名は次のようになります。FGETYK+LinLibertineI-0966.ttfフォントの PDF オブジェクト番号が 966 の場合。

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

繰り返しますが、これらのフォントファイルのほとんどは、サブセット文字の一部であり、完全な書体を表さない場合があります。

アップデート:(2013 年 7 月) の最新バージョンmupdfでは、バイナリの内部的な入れ替えと名前の変更が 1 回だけでなく、数回行われています。メイン ユーティリティは、以前は (busybox にヒントを得た名前?) と呼ばれる「スイス ナイフ」に似たバイナリでしたが、最近mubusyに名前が変更されましたmutool。これらは、サブコマンドinfo、、、およびをサポートしています。残念ながら、これらのツールの公式ドキュメントは (まだ) 最新ではありません。Mac で 'MacPorts' を使用している場合: ユーティリティは、同じ名前を使用する他のユーティリティとの名前の衝突を避けるために名前が変更されたため、 を使用する必要があります。cleanextractpostershowmupdfextract

mutool以前のツールとほぼ同等の結果を得るにはpdfextract、 を実行するだけですmubusy extract ...。*

したがって、フォントと画像を抽出するには、次のいずれかのコマンドラインを実行する必要があります。

c:\>  mutool.exe extract filename.pdf      # (on Windows)
$>    mutool     extract filename.pdf      # (on Linux, Unix, Mac OS X)

ダウンロードはこちら:mupdf.com/ダウンロード


gs(Ghostscript)の使用

それから、ゴーストスクリプトPDFから直接フォントを抽出することもできます。ただし、特別なユーティリティプログラムの助けが必要です。extractFonts.psはPostScript言語で書かれており、Ghostscript ソースコードリポジトリ

これを使用するには、このファイルと PDF ファイルの両方を実行する必要がありますextractFonts.ps。 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 スクリプトです。また、オブジェクトから任意のストリームを解凍して抽出することもできるため、埋め込まれたフォント ファイルも抽出できます。

しかし、何を探すべきかを知る必要があります。例を見てみましょう。大きい.pdf最初のステップとして、-sPDF内でキーワードの出現を検索するパラメータフォントファイル(pdf-parser.py大文字と小文字を区別した検索は必要ありません):

pdf-parser.py -s fontfile big.pdf

私の場合、ビッグ1.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内には2つのインスタンスがありFontFile2、それぞれPDFオブジェクト15と16にあることがわかります。オブジェクト15には/FontFile2フォントが含まれています。/ArialMTオブジェクト番号16には/FontFile2フォントが格納されている/Arial-太字MT

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

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「ストリーム辞書のサブタイプエントリでフォーマットが指定されているフォントプログラムを含むストリーム」{したがって、タイプ1Cまたは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 でエンコード ( == "圧縮") され、標準フィルターを使用してデコード ( == "圧縮解除" または "フィルター処理") する必要があるストリーム (直接は表示されない) が含まれていることを示しています/ASCIIHexDecode

オブジェクトから任意のストリームをダンプするにはpdf-parser.py-d dumpnameパラメータ。やってみましょう:

pdf-parser.py -o 15 -d dumped-data.ext big1.pdf

抽出されたデータダンプは、次の名前のファイルに保存されます。ダンプされたデータ.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 オブジェクト番号 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 のほとんどは、完全なフォントを埋め込んでおらず、サブセットのみが埋め込まれています。フォントのサブセットの抽出は、非常に限られた範囲でのみ役立ちます。

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

おすすめ記事