Как экспортировать вьетнамский текст в PDF, используя iText

Я столкнулся с проблемой при попытке экспортировать вьетнамский документ в формате PDF с помощью iText. Я положил вьетнамские слова в XML-файл, как это

<td fontfamily="Helvetica" fontstyle="0" fontsize="9" align="0" colspan="48" lineoccupied="1">T\u1ED5 ch\u1EE9c tham gia</td>

затем с помощью Java получить фразы из XML-файла и преобразовать его в Unicode, используя этот метод:

    public String convertToUnicode(String s) {
        int i = 0, len = s.length();
        char c;
        StringBuffer sb = new StringBuffer(len);
        try {
            while (i < len) {
                c = s.charAt(i++);
                if (c == '\\') {
                    if (i < len) {
                        c = s.charAt(i++);
                        if (c == 'u') {
                            if (Character.digit(s.charAt(i), 16) != -1
                                    && Character.digit(s.charAt(i + 1), 16) != -1
                                    && Character.digit(s.charAt(i + 2), 16) != -1
                                    && Character.digit(s.charAt(i + 3), 16) != -1) {
                                if (s.substring(i).length() >= 4) {
                                    c = (char) Integer.parseInt(s.substring(i, i + 4), 16);
                                    i += 4;
                                } else {
                                    sb.append('\\');
                                }
                            } else {
                                sb.append('\\');
                            }
                        } // add other cases here as desired...
                    }
                } // fall through: \ escapes itself, quotes any character but u
                sb.append(c);
            }
        } catch (Exception e) {
            System.out.println("Error Generate PDF :: " + e.getStackTrace().toString());
            return s;
        }
        return sb.toString();
    }

После этого экспортируем String в PDF - кодировку UTF-8. Но программе не удалось отобразить вьетнамские символы "\u1ED5" и "\u1EE9". В результате получается "T chc tham gia". Не могли бы вы показать мне, как решить эту проблему? Спасибо:)

2 ответа

Решение

На официальном веб-сайте iText есть 3 примера XML Worker с азиатскими языками. Они анализируют файл XHTML, содержащий китайские иероглифы, но их легко адаптировать к вьетнамским примерам.

Вы можете найти HTML-файлы, которые собирались проанализировать здесь:

Оба файла содержат следующий текст:

長空 (Сломанный меч), ​​秦王殘劍 (Летающий снег), 飛雪 (Луна), 如月 (Король) и 秦王 (Небо).

В первом случае шрифт определяется с помощью CSS:

<span style="font-size:12.0pt; font-family:MS Mincho">長空</span>

Во втором случае конкретный шрифт не определен:

<body><p>長空 (Broken Sword), 秦王殘劍 (Flying Snow), 飛雪 (Moon), 如月 (the King), and 秦王 (Sky).</p></body>

Эти файлы содержат символы UTF-8, поэтому мы собираемся проанализировать их следующим образом:

XMLWorkerHelper.getInstance().parseXHtml(writer, document,
            new FileInputStream(HTML), Charset.forName("UTF-8"));

Первое, что вам нужно, это шрифт, который поддерживает вьетнамские символы. Это то, что iText не может вам помочь. В своем HTML-файле вы определили Helvetica, но это стандартный шрифт Type1, который никогда не внедряется при использовании iText и который не знает, как рисовать вьетнамские глифы. Это никогда не сработает.

В первом примере D07_ParseHtmlAsian будет автоматически искать шрифт с именем MS Mincho, Если он находит этот шрифт (например, потому что у вас есть msmincho.ttc в вашем каталоге шрифтов Windows), шрифт будет отображаться в вашем PDF. Смотрите hero.pdf. Если он не найдет шрифт с таким именем, то глифы не будут видны, потому что вы не предоставили никакой программы шрифтов для этих символов.

Второй пример D07bis_ParseHtmlAsian предлагает обходной путь, если у вас нет MS Mincho в любом месте. В этом случае вы должны использовать XMLWorkerFontProvider и зарегистрировать шрифт, который можно использовать вместо MS Mincho, Например: мы используем шрифт, хранящийся в файле cfmingeb.ttf и назначьте псевдоним MS Mincho:

XMLWorkerFontProvider fontProvider = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
fontProvider.register("resources/fonts/cfmingeb.ttf", "MS Mincho");

Полученный файл asian.pdf немного отличается от того, что мы ожидаем, но теперь мы можем по крайней мере увидеть китайские глифы.

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

CSSResolver cssResolver = new StyleAttrCSSResolver();
CssFile cssFile = XMLWorkerHelper.getCSS(new ByteArrayInputStream("body {font-family:tsc fming s tt}".getBytes()));
cssResolver.addCss(cssFile);

Теперь весь текст в теле будет использовать шрифт TSC FMing S TT (хранится в файле cfmingeb.ttf). Вы можете увидеть разницу в полученном PDF asian2.pdf.

Я думаю, что вам нужна кодировка UTF-8 для вашего HTML и используйте & # xUNUM; для шестнадцатеричного или & # NUM; для обычного кода для встраивания ваших специальных символов. Не уверен, где, но где-то в вашей программе, поскольку она не отображается, но ваш окончательный HTML должен быть:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML LEVEL 1//EN">
<HTML>
  <HEAD>
    <TITLE>Your Page Title</TITLE>
    <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
  </HEAD>
  <BODY>
    <!-- YOUR CONTENT HERE -->

     <td fontfamily="Helvetica" fontstyle="0" fontsize="9" 
         align="0" colspan="48" 
        lineoccupied="1">T&#x1ED5; ch&#x1EE9;c tham gia</td>

  </BODY>
</HTML>

Вы можете вырезать и вставить вышеупомянутое в файл HTML и просмотреть результат. Больше удовольствия от чтения здесь Unicode и HTML

Другие вопросы по тегам