PDFフォント: その仕組みとJPedalでの表示方法
この記事では、PDFフォントの仕組みと、JPedalでの表示方法について説明します。
PDFファイルには2種類のフォントを含めることができます。埋め込みPDFフォントは、すべてのフォント文字を描画するための実際の詳細情報をすべて含んでいますが、非埋め込みフォントはフォント名のみを含み、システムがフォントの詳細を見つけることを期待しています。フォントを埋め込むと、PDFファイルのサイズが大きくなります。元のPDF仕様では14種類のフォントが許可されていましたが、PDF仕様の後期改訂版(バージョン1.7以降)では、これが5種類のフォントのみに削減されています。これらは以下の通りです:
- Courier
- Courier-Bold
- Courier-BoldOblique
- Courier-Oblique
- Symbol
PDFファイルに埋め込みフォントが含まれているかどうかは、JPedal ViewerまたはAcrobatで開いてフォントのリストを確認することで判別できます。JPedal Java ViewerでPDFファイルを開き、File - Document Properties - Fontタブを選択してください。
フォントがPDFファイルに埋め込まれている場合、JPedalはPDFファイル内のフォント情報を使用して表示します。これは上書きできません。非埋め込みPDFフォントの場合、JPedalはPDFフォント名と一致するフォントをJavaで利用可能なものから見つけようとするか、標準フォントで置き換えてPDFを表示できるようにします。これらのフォントは必ずしも適切に一致するとは限らないため、最良の結果を得るにはフォント置換をお勧めします。フォントがサブセット化されている場合、フォントを置き換えることができない場合があります。
一部のPDFファイルには、非埋め込みのCIDフォントファイルが含まれている場合があります(PDFがAdobe Acrobatで表示され、必要な言語パックがダウンロードされることを前提としています)。この場合、次のようなメッセージが表示されます。フォントをインストールするには、Adobe Acrobatでファイルを開く必要がある場合があります。その後、JPedalはフォントを見つけることができます。この場合、フォント(Adobeによってダウンロードされます)を見つけて、以下で説明する技術を使用してマッピングを試みる必要があります。
JPedalには、不足しているフォント(本来は埋め込まれているべきフォント)をローカルフォントで置き換えることができる、フォント置換という追加操作があります。これは非CIDフォントでのみ機能します。ほとんどのコンピュータには、Javaで利用可能なフォントよりもはるかに多くのフォントがインストールされています。そのため、JPedalはこれらのフォントを表示に使用するオプションも提供しており、PDF内に埋め込まれているかのように扱います。これは、Java PDFビューアの例 内の一般的な例に対してすでに設定されています。FontMappings クラスは、WindowsとMac上の非埋め込みフォント用の一般的なフォント置換をすべて設定します。すべてのコード例には、これを有効にするための以下のJava行が含まれています。
//mappings for non-embedded fonts to use
FontMappings.setFontReplacements();
単一のフォントを手動で再マッピングするには(埋め込まれていない場合):
//replace Century and CenturyGothic with any installed Arial if not embedded
String[] aliases = {"Century","CenturyGothic"}; //(all names are case-insensitive)
FontMappings.setSubstitutedFontAliases("arial", aliases);
Linuxには、JPedalが使用できるフォントを含む明確に定義されたフォントの場所がありません。これを解決する方法については、このページの下部にある項目を参照してください。
フォントマッピングは大文字小文字を区別しないため、Arialとarialは同じフォントです。オプションは、FontMappingsクラスのメソッドpublic static void setFontSubstitutionMode(int mode) を使用して最初に設定する必要があります。ここで、modeはPdfDecoder のSUBSTITUTE_*値です。
これは、サフィックスを除いたフォントファイルの名前を使用してフォントをマッピングします。したがって、フォントファイルarial.ttfは、PDF内の非埋め込みArialテキストを表示するために使用されます。
PDFファイル内で見つかったPostScript名を使用します。したがって、フォントファイルmyFile.ttfは実際にはComicSansというPostScript名を持つ可能性があり、ComicSansの非埋め込みテキストはこれを使用します。
ファイル内で見つかった完全なファミリー名を使用します。したがって、フォントファイルmyFile.ttfは実際にはComicSansというファミリー名を持つ可能性があり、ComicSansの非埋め込みテキストはこれを使用します。
ファイル内で見つかったPostScript名を使用しますが、それが一意である場合に限ります。したがって、フォントファイルmyFile.ttfは実際には「arial」というPostScript名と「arialsup」というファミリー名を持つ可能性があります。「arial」は一意ではないため、「arialsup」が使用されますが、PDF内でフォントが正しく名前付けされている必要があります。重要な注意:TrueTypeフォントコレクションには複数のTrueTypeフォントを含めることができるため、これらを使用する場合、マッピングにはPostScript名を使用する必要があります。これらすべてのオプションを見つけやすくするために、情報ボックスの利用可能タブにこのすべての情報が表示されます。リストプロパティのサンプルコードを表示 してください。
JPedalは、フォント置換のために以下のフォントファイルを使用できます。
- ファイル拡張子が**.ttf**のTrueTypeフォント(例:arial.ttf)
- ファイル拡張子が**.otf**のOpenTypeフォント(例:arial.otf)
- ファイル拡張子が**.ttc**のTrueTypeフォントコレクション(例:arial.ttc)
- .pfbまたは.pfaで終わるType1フォントファイル(バージョン3.76以降)
当社のPDFビューア、PDF印刷、PDFから画像への変換の例では、非埋め込みフォント用の一般的なデフォルトを設定するために、すでにこのコードを呼び出しています。したがって、独自のコードを記述している場合、PdfDecoderのインスタンスを作成した後、コードにこの呼び出しを追加するだけでよい場合があります。//mappings for non-embedded fonts to use FontMappings.setFontReplacements();
JPedalが使用するフォントを含む新しいディレクトリを追加できます。メソッドは繰り返し呼び出して追加のフォントを追加できます。フォント名はキーとして使用されるため、重複するフォント名は以前の設定を上書きします。
JVMフラグを介して新しいフォントディレクトリを追加するには、JVMフラグ**-Dorg.jpedal.fontdirs=dirList**を設定します。ここで、dirListは可能なディレクトリのカンマ区切りリストです。詳細については、JVMオプション を参照してください。
メソッド呼び出しでフォントのディレクトリ全体を追加するには、FontMappingsメソッドsetFontDirs(String[] paths) を使用します。ここで、pathsは可能な場所の配列です。場所はすべてローカルファイルシステム上に存在する必要があります(jar:またはhttp:プロトコルはサポートされていません)、クロスプラットフォーム設定を提供する方法を提供します。
WindowsとMacOSの両方には、フォントの明確に定義された場所があります。Linuxには、JPedalが置換に使用できるフォントを含む明確に定義されたフォントの場所がありません。Linuxボックスでの最良の解決策は、ttf-mscorefonts-installerパッケージをインストールすること(当社のシステムではsudo apt-get install ttf-mscorefonts-installer)です。これによりいくつかのフォントが追加されます。JPedalは、存在する場合、これらのフォントを自動的に使用します。
それ以外の場合は、WindowsマシンからWindowsフォントディレクトリをコピーし、次のコマンドでJPedalにそれを指定します:
FontMappings.setFontDirs(new String[] {"fontsFolder"});
