Javaで、指定フォントで表現できるかどうかチェックする処理を作りたいと思っています。
java.awt.Font.canDisplayUpTo(String str)
上記関数を利用してできそうだと思っていたんですが、落とし穴がありました。
タブ(\t、U+0009)をチェックしようとした際に、チェックはすり抜けてしまったのですが、
フォントとしては対応していないという事象が発生しました。
タブの場合、文字列としては、「\t」で処理されますが、実際には、空白があく表現になります。
canDisplayUpToを使ったチェック時には、「\t」としてチェックされるので、そのまますり抜けますが、
実際にフォントで表現する際、空白表現が正しくできないという状態になっています。
「\t」とかだけであれば、ピンポイントでチェック条件を追加してしまえばいいのんですが、ほかにも同様の
文字があった場合に、都度追加をしなくてはいけないのは少し手間に感じます。
実際の表現ベースでフォントとして表現できる・できないをチェックする効率のいい手段はありますでしょうか?
代替の手順としては、何かしらの画像に実際に出力して、出力できる・できないを確認する方法も考えていますが、
チェック処理が増えると、画像変換が無駄処理に思えてきて、ほかのいい方法を探しています。
宜しくお願いします。
すみません。追記いたします。
チェックはすり抜けてしまった
該当関数の戻り値としては、
戻り値: このFontが表示できないstr内の最初の文字を指すstrへのオフセット、またはこのFontがstr内のすべての文字を表示できる場合は-1。
となっているため、期待値としては、問題の文字のオフセットが戻ることですが、タブの場合は、「-1」が戻ってきている状態となります。
フォントとしては対応していないという事象
というのは、「不可」だったということになります。
「不可」なので、当然、実際にフォントでの表現ができない状態となります。
今回の「タブ」のように、実際にフォントで表現できない文字が含まれているかどうか、正確にチェックしたいです。
表現できる・できないを、実際に変換してからエラーとして処理するのではなく、事前にチェックをして、表現できないのであれば、変換処理を行わないような処理にしたいです。
再度追記致します。
「フォントで表現できない」という部分ですが、最終的には、PDPageContentStreamを利用してPDF出力しようとしています。
java
1PDFont font = PDType0Font.load(doc, new File("TTFファイルパス")); 2 3PDPage page = new PDPage(rectangle); 4PDDocument doc = new PDDocument(); 5doc.addPage(page); 6 7PDPageContentStream contents = new PDPageContentStream(doc, page) 8contents.beginText(); 9contents.setFont(font, 12); 10contents.showText("文字列");
この処理をした際、指定したフォントファイル(TTFファイル)で対応できないと、例外エラーが発生してしまうため、そのような文字列ではないことの確認を事前にやりたいという流れになります。
java.lang.IllegalArgumentException: No glyph for U+0009 in font IPAPGothic at org.apache.pdfbox.pdmodel.font.PDCIDFontType2.encode(PDCIDFontType2.java:363) at org.apache.pdfbox.pdmodel.font.PDType0Font.encode(PDType0Font.java:398) at org.apache.pdfbox.pdmodel.font.PDFont.encode(PDFont.java:324) at org.apache.pdfbox.pdmodel.PDPageContentStream.showTextInternal(PDPageContentStream.java:509) at org.apache.pdfbox.pdmodel.PDPageContentStream.showText(PDPageContentStream.java:471)
回答1件
あなたの回答
tips
プレビュー