2017-11-06 21 views
3

私のPDFBoxの実装では、さまざまなフォントをテストして複数の言語で文字列を書き込むメソッドを作成しました。PDFBox - サロゲートペアで構成される文字列をエンコードできない

PDFont currentFont = PDType0Font.load(pdfDocument, new File("path/to/font/font.ttf")); 
for (int offset = 0; offset < sValue.length();) { 
    int iCodePoint = sValue.codePointAt(offset); 
    boolean isEncodable = isCodePointEncodable(currentFont, iCodePoint); 
    //-Further logic here, etc. 

    offset += Character.charCount(iCodePoint); 
} 

private boolean isCodePointEncodable (PDFont currentFont, int iCodePoint) throws IOException { 
    StringBuilder st = new StringBuilder(); 
    st.appendCodePoint(iCodePoint); 
    try { 
     currentFont.encode(st.toString()); 
     return true; 
    } catch (IllegalArgumentException iae) { 
     return false; 
    } 
} 

これは基本多言語面(BMP)、BMPを超えたユニコードが動作しません必要とするものでは何のため正常に動作している間。私は関連フォントをグリフチャートで広範囲にダウンロードして見て、各コードを記録しました。たとえば、U + 1F681(または10進数128641)のエンコードを試みると、ロギングが検出され、NotoEmoji-Regular.ttfにこの文字をエンコードしようとしましたが、実際にはこの文字があります。残念ながら、それはまだfalseを返しました。

は具体的には、私のロギングサーバはこれを返さ:

Code Point 128641() cannot be encoded in font NotoEmoji 

は、このための回避策や解決策はありますか?ありがとうございました。

答えて

1

問題PDFBOX-3997を作成して解決しました。原因は、可能な限り最良のcmapサブテーブルを使用していないことでした。

回避策はありませんが、バージョン2.0.9では数ヶ月で修正される予定です。しかし、あなたは長く待つ必要はありません。snapshot buildでテストできます。

関連する問題