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には、フォント置換と呼ばれる追加機能があり、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は実際にはPostscript名ComicSansを持っている可能性があり、ComicSansの非埋め込みテキストはこれを使用します。
ファイル内に見つかった完全なファミリー名を使用します。したがって、フォントファイルmyFile.ttfは実際にはファミリー名ComicSansを持っている可能性があり、ComicSansの非埋め込みテキストはこれを使用します。
ファイル内に見つかったPostscript名が一意である限り、それを使用します。したがって、フォントファイルmyFile.ttfは実際にはPostscript名「arial」とファミリー名「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"});
