Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> iText парсинг html, Не отображает русские буквы 
V
    Опции темы
Dreamtraveler
Дата 17.12.2010, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 23.11.2009

Репутация: нет
Всего: нет



Здравствуйте.

Опишу задачу:

Необходимо из шаблона (FreeMarker) сгенерировать сначало html текст, а затем pdf документ.
С первой часть задачи справились. Теперь для генерации pdf отчета использую iText.

Подсовываю в iText ту часть html текста которую хочу преобразовать в pdf парсю и вывожу в поток для сохранения на машине клиента:
Код

userTemplate.process(root, out);
StringReader input = new StringReader(out.toString());
Document document = new Document(PageSize.A4, 30, 20, 10, 10);
StyleSheet st = new StyleSheet();
st.loadTagStyle("body", "leading", "8,0");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfWriter.getInstance(document,baos);
document.open();
ArrayList p = HTMLWorker.parseToList(input, st);
for (int k = 0; k < p.size(); ++k){
        document.add((Element)p.get(k));
}            
}    
document.close();    



Вот такая простая схема.

Проблемма в том что русский текст в pdf не отображается.
Посмотрел google и нашёл там такое решение:

Код

BaseFont bfArea = BaseFont.createFont(fontPath, "Cp1251", BaseFont.NOT_EMBEDDED);
Font font1 = new Font(bfArea,8);
Paragraph par = new Paragraph("",font1);


Теперь отображает текст на русском если его обернуть в параграф par, а затем добавить в документ. Но если парсер возвращает класс PdfPTable ни какое оборачивание в параграф не помагает. Методов установки шрифта в уже созданной таблице я не нашёл. 

Подскажите как можно установить шрифт в уже созданой таблице.

В книге по iText для парсинга html предлогают использовать библиотеки старонних производителей (ICEbrowser) например.
но добавление еще одной библиотеки в проект придется обосновывать. 


PM MAIL   Вверх
Skipy
Дата 17.12.2010, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 487
Регистрация: 24.8.2006
Где: Москва, Россия

Репутация: 2
Всего: 16



А невозможность работы с русским текстом в таблицах - недостаточное обоснование?


--------------------
С уважением,
Евгений aka Skipy
www.skipy.ru
PM MAIL WWW ICQ   Вверх
Dreamtraveler
Дата 20.12.2010, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 23.11.2009

Репутация: нет
Всего: нет



https://xhtmlrenderer.dev.java.net/  - а вот интересно этот адрес живой или нет?

PM MAIL   Вверх
Dreamtraveler
Дата 24.12.2010, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 23.11.2009

Репутация: нет
Всего: нет



И так ресурс ожил...  https://xhtmlrenderer.dev.java.net/  

Для осуществеления задуманного нужно использлвать связку: jTidy + xhtmlrenderer(R8) + iText.
Причем нужна бибилиотека iText 2.0.8 в другом случае может не сработать.
Вот легкий пример:
Код

String fontPath = (new StringBuffer(realPath).append("FONTS\\arial.ttf")).toString();
ByteArrayOutputStream baosOut = new ByteArrayOutputStream();
ByteArrayOutputStream baosAllOut = new ByteArrayOutputStream();
ByteArrayOutputStream os = new ByteArrayOutputStream();
ByteArrayInputStream bais = new ByteArrayInputStream("Строка с вашим html кодом(Нпример)".getBytes("cp1251")); 
Tidy tidy = new Tidy();
tidy.setInputEncoding("Cp1251");
tidy.setOutputEncoding("Cp1251");
//tidy.setInputEncoding("UTF-8");
//tidy.setOutputEncoding("UTF-8");
tidy.setDocType("omit"); //опустить док тайп.
tidy.setXHTML(true);
//tidy.setXHTML(false);
tidy.setTidyMark(false);
tidy.setMakeClean(true);
tidy.parse(bais, os);
bais.close();
ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray());       
os.close();

DocumentBuilder builder;
ITextRenderer renderer = new ITextRenderer(); 
try {
     builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
     org.w3c.dom.Document doc = builder.parse(is);
     renderer.getFontResolver().addFont(fontPath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
     renderer.setDocument(doc, null);
     renderer.layout();
     renderer.createPDF(baosOut);
} catch (ParserConfigurationException e) {
    e.printStackTrace();
} catch (FactoryConfigurationError e) {
    e.printStackTrace();
} catch (SAXException e) {
    e.printStackTrace();
}
return baosOut;


Вот так.

Спасибо за внимание.


Да забыл добавить что :
должна присутствовать строка: <?xml version="1.0" encoding="Cp1251"?> в html если хотите Cp1251.
должен быть определен стиль, например так <body style = "font-family: Arial;"> чтоб русский текст отобразить.


Это сообщение отредактировал(а) Dreamtraveler - 24.12.2010, 08:55
PM MAIL   Вверх
uzer3d
Дата 7.1.2011, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 8.1.2008

Репутация: нет
Всего: нет



Я использовал xhtmlrenderer.
Что бы работало под  iText 5.0 (например если у вас в проекте уже используеться iText выше второй версии) необходимо скачать xhtmlrenderer source и поменять название пакетов, собрать джарик, не забыть добавить resource. И все будет работать.
Код

    public void addHtmlText(String htmlText) throws PrintException {
        ITextRenderer renderer = new ITextRenderer();
        renderer.setDocumentFromString(normalizeHtml(htmlText));
        renderer.layout();
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        try {
            renderer.createPDF(baos);
            mergePdfs(baos.toByteArray());
        } catch (DocumentException e) {
            throw new PrintException(e);
        }
    }

Код

    /**
     * Merge pdf into current pdf document
     * 
     * @param pdf pdf document, which will be added
     * @throws PrintException
     */
    private void mergePdfs(byte[] pdf) throws PrintException {
        try {
            // Copying pages from existing PDF documents
            PdfReader reader = new PdfReader(pdf);
            PdfContentByte canvas = _writer.getDirectContent();
            for (int i = 1; i <= reader.getNumberOfPages(); i++) {
                PdfImportedPage page = _writer.getImportedPage(reader, i);
                canvas.addTemplate(page, 1f, 0, 0, 1, 0, 0);
                if (i != reader.getNumberOfPages()) {
                    _document.newPage();
                }
            }
        } catch (Exception e) {
            throw new PrintException(e);
        }
    }


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0916 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.