2021年11月16日 星期二

iTEXT罕字處理

 

中文字博大精深尤其是姓名的使用,為了命好而擇用特殊的文字組合或筆劃值也不算罕見,不過系統列印要處理這類就狀況百出。幾個步驟備忘來留念下
1. 編碼:不管是大五碼還是簡字總之先轉碼成UNICODE為先。
2.字型:大概率要找免費的比較好,全字庫是可以考慮的範圍,底下是拿細明體+細明體ExtB來做範例,因為全字庫的罕字分三層,感覺卡麻煩。

部分罕字/特殊字的字碼會在65535使用4byte來儲存,故判斷上就不能只取3Byte不然會對不上字元,另外罕字不可能單純出現在最前或最後也可能藏在中間或單字以上,故處理上得一字字處理,底下的Method送入inStr 原始Unicode字串回傳Paragraph餵給iText來顯示....

private Paragraph getExtName(String inStr) {
Paragraph simplePara = new Paragraph();
BaseFont bf_name = null;
int i_char = 0;
try {
bf_name = BaseFont.createFont("c:\\windows\\fonts\\mingliu.ttc,1", "Identity-H", BaseFont.NOT_EMBEDDED);

int getCode;
int start=0;
int end=0;
String getstr = "";
for(int j=0;j<inStr.length();j++) 
{
getCode = inStr.codePointAt(j);
start=j;
end=start+1;
if(getCode > 65535) {
   j++;
   end=start+2;
}
getstr = inStr.substring(start, end);
boolean tmpc  = bf_name.charExists(getCode);
if(tmpc) {
Chunk Chunkid0 = new Chunk(getstr, font12_name);
simplePara.add(Chunkid0);
i_char++;
} else {
tmpc  = bf_name_ext.charExists(getCode);
if(tmpc) {
Chunk Chunkid1 = new Chunk(getstr, font12_name_ext);
simplePara.add(Chunkid1);
i_char++;
}
}
}
        } catch (Exception ex) {
        i_char = 0;
        log.error(ex.toString());
        }

if (i_char == 0) {
Phrase simplePhr1 = new Phrase(inStr, font12_name);
simplePara.add(simplePhr1);
}
return simplePara;
}

沒有留言: