Как экспортировать вьетнамский текст в 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ổ chức tham gia</td>
</BODY>
</HTML>
Вы можете вырезать и вставить вышеупомянутое в файл HTML и просмотреть результат. Больше удовольствия от чтения здесь Unicode и HTML