iText - китайский символ не отображается - PullRequest
0 голосов
/ 11 мая 2018

У меня следующая проблема, есть база данных с кодировкой utf8 и китайскими символами. я получаю эти данные в строку, а затем передаю их в ячейки библиотеки, все хорошо, за исключением того, что когда я использую китайские символы, они не отображаются, я попробовал это:

public String testEncoding(String str) {
    String result = "";
    for(char ch : str.toCharArray())
        result +=  "\\u" + Integer.toHexString(ch | 0x10000).substring(1);        
    return result;
}

, а также использовать notosans и arial uni шрифты, которые преобразуют строки в Unicode, и когда я печатаю, он показывает мне Unicode в pdf \ u6b98 \ u528d, не китайские символы, но когда я вставляю это в строку

String text = "\u6b98\u528d";

и передайте его в клетку фараграфа, он показывает отлично! Вот код, который я использую для этого:

final String PATH_FONT_ARIALUNI = "src/main/resources/fonts/NotoSansCJKsc-Regular.otf";        

     // FOR Chinese
     BaseFont baseFont = null;
    try {
        baseFont = BaseFont.createFont(PATH_FONT_ARIALUNI, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
    } catch (DocumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
     Font font = new Font(baseFont, 6.8f);

     Font fontNormal = new Font(FontFamily.HELVETICA, 10, Font.NORMAL, BaseColor.RED);



     char[] aa = title.toCharArray();
     boolean isLastChineseChar = false;


     for (int j = 0; j < title.length(); j++) {

         if((Character.UnicodeBlock.of(aa[j]) == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS)){


             isLastChineseChar = true;
             /*System.out.println("Is CHINESE: " + aa[j]);*/
         } 
     }

     Phrase phrase = null;

     if(isLastChineseChar){

         phrase = new Phrase(title, font);
//also passing testEncoding(title) but as i say it shows unicode in the printed pdf

         PdfPCell cell = new PdfPCell(phrase);
         cell.setVerticalAlignment(Element.ALIGN_CENTER);

         if (align == 2) {
             cell.setHorizontalAlignment(Element.ALIGN_CENTER);
         }
         return cell;

     } else {
         phrase = new Phrase(title, fontNormal);

         PdfPCell cell = new PdfPCell(phrase);
         cell.setVerticalAlignment(Element.ALIGN_CENTER);
         if (align == 2) {
             cell.setHorizontalAlignment(Element.ALIGN_CENTER);
         }
         return cell;

     } 

Есть идеи? что я делаю не так? Я вижу много примеров здесь, но есть чтение текстовых файлов и передача строк Unicode напрямую, не как в моем примере.

1 Ответ

0 голосов
/ 17 мая 2018

Мой код уже работает нормально, у вас есть проблемы на рабочих серверах, когда символы не показывают решение, это следующее:

в вашем классе добавить это

 @Value("classpath:fonts/NotoSansCJKsc-Regular.otf")
private Resource res; 

и вы импортируете так:

        baseFont = BaseFont.createFont(res.getURI().getPath(), BaseFont.IDENTITY_H, BaseFont.EMBEDDED);

и все будет работать нормально!

Resource - это класс Spring Framework, который выполняет эту работу за вас

...