1. ホーム
  2. pdf

[解決済み] PDFに埋め込まれたフォントを有効なフォントファイルとして取り出すにはどうしたらよいですか?

2022-03-02 18:22:16

質問

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

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

解決方法は?

いくつかの選択肢があります。しかし、ほとんどのPDFは、フォントが埋め込まれている場合、完全なフォントフェースを含んでいないことに注意してください。たいていの場合、フォントが埋め込まれているのは サブセット のグリフが使用されています。


使用方法 pdftops

nixシステムで最もよく使われる方法の1つは、以下の手順で構成されています。

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

使用方法 fontforge

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

  1. を使用します。 フォントを開く" ファイルを開くときに使用されるダイアログボックス。
  2. 次に、以下を選択します。 PDFから抽出します。 をダイアログのフィルターセクションに追加します。
  3. 抽出するフォントのあるPDFファイルを選択します。
  4. A フォントを選ぶ" ダイアログボックスが開きますので、ここで開くフォントを選択してください。

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


使用方法 mupdf

次へ MuPDF . このアプリケーションには、以下のようなユーティリティが付属しています。 pdfextract (Windowsの場合。 pdfextract.exe ) を使用すると、PDFからフォントや画像を抽出することができます。(因みに、MuPDFはまだ比較的知られておらず、新しいものです。 MuPDFは、ポータブルC言語で書かれたフリーの軽量PDFビューアおよびツールキットです。 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などがあります。画像名は次のようなものです。 img-0412.png 画像のPDFオブジェクト番号が412の場合。フォント名は次のようになります。 FGETYK+LinLibertineI-0966.ttf フォントのPDFオブジェクト番号が966の場合。

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

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

更新しました。 (2013年7月) 最近のバージョンでは mupdf は、一度ならず何度も内部でバイナリの入れ替えや名前の変更が行われています。主なユーティリティは、以前は mubusy (busyboxにインスパイアされた名前?)に改名され、最近では mutool . これらは、以下のサブコマンドをサポートしています。 info , clean , extract , postershow . 残念なことに、これらのツールの公式ドキュメントは(まだ)最新ではありません。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 は、PostScript 言語で書かれており、以下のサイトから入手できます。 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 にキーワード フォントファイル ( 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
  >>   

のインスタンスが2つあることを教えてくれます。 FontFile2 の中にあり、これらはPDFオブジェクトNo. 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 を関連付けることになります。 'タイプ1のフォントプログラムを含むストリーム' /FontFile3 を関連付けることになります。 'ストリーム辞書のSubtypeエントリによってフォーマットが指定されているフォントプログラムを含むストリーム' {のどちらかである。 タイプ1C または CIDFontType0C subtype}を使用します)。

具体的には、PDFオブジェクトNo.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 Bytes のストリーム (直接は表示されません) を含んでいて、ASCIIHexEncode でエンコードされており ( == "compressed" )、標準の /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.435Byteです。この数字は、前のコマンドの出力で確認しました。このファイルをテキストエディタで開くと、その内容が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.552Byte)からすると、どうやらこのフォントは すっかり をPDFで表示させることができます。

にリネームすることができました。 arial-regular.ttf としてインストールし、楽しく活用することができます。


注意事項

  • いずれの場合も、そのフォントに適用されるライセンスに従う必要があります。フォントのライセンスによっては、自由な使用や配布を認めないものもあります。フォントを違法に使用することは、ソフトウェアやその他の著作物を違法に使用することと同じです。

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

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