2015-10-13 2 views
0

Я хочу создать таблицу PDF из строки HTML. Я могу создать эту таблицу, но вместо Text я получаю вопросительные знаки. Вот мой код:Создать таблицу PDF из HTML-строки с UTF-8 encofing

public class ExportReportsToPdf implements StreamSource { 
private static final long serialVersionUID = 1L; 

private ByteArrayOutputStream byteArrayOutputStream; 

public static final String FILE_LOC = "C:/Users/KiKo/CasesWorkspace/case/Export.pdf"; 

private static final String CSS = "" 
     + "table {text-align:center; margin-top:20px; border-collapse:collapse; border-spacing:0; border-width:1px;}" 
     + "th {font-size:14px; font-weight:normal; padding:10px; border-style:solid; overflow:hidden; word-break:normal;}" 
     + "td {padding:10px; border-style:solid; overflow:hidden; word-break:normal;}" 
     + "table-header {font-weight:bold; background-color:#EAEAEA; color:#000000;}"; 

public void createReportPdf(String tableHtml, Integer type) throws IOException, DocumentException { 

    // step 1 
    Document document = new Document(PageSize.A4, 20, 20, 50, 20); 

    // step 2 
    PdfWriter.getInstance(document, new FileOutputStream(FILE_LOC)); 

    // step 3 
    byteArrayOutputStream = new ByteArrayOutputStream(); 
    PdfWriter writer = PdfWriter.getInstance(document, byteArrayOutputStream); 
    if (type != null) { 
     writer.setPageEvent(new Watermark()); 
    } 

    // step 4 
    document.open(); 

    // step 5 
    document.add(getTable(tableHtml)); 

    // step 6 
    document.close(); 
} 

private PdfPTable getTable(String tableHtml) throws IOException { 

    // CSS 
    CSSResolver cssResolver = new StyleAttrCSSResolver(); 
    CssFile cssFile = XMLWorkerHelper.getCSS(new ByteArrayInputStream(CSS.getBytes())); 
    cssResolver.addCss(cssFile); 

    // HTML 
    HtmlPipelineContext htmlContext = new HtmlPipelineContext(null); 
    htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory()); 

    // Pipelines 
    ElementList elements = new ElementList(); 
    ElementHandlerPipeline pdf = new ElementHandlerPipeline(elements, null); 
    HtmlPipeline html = new HtmlPipeline(htmlContext, pdf); 
    CssResolverPipeline css = new CssResolverPipeline(cssResolver, html); 

    // XML Worker 
    XMLWorker worker = new XMLWorker(css, true); 
    XMLParser parser = new XMLParser(worker); 

    InputStream inputStream = new byteArrayInputStream(tableHtml.getBytes()); 
    parser.parse(inputStream); 

    return (PdfPTable) elements.get(0); 
} 

private static class Watermark extends PdfPageEventHelper { 

    @Override 
    public void onEndPage(PdfWriter writer, Document document) { 
     try { 
      URL url = Thread.currentThread().getContextClassLoader().getResource("/images/memotemp.jpg"); 
      Image background = Image.getInstance(url); 
      float width = document.getPageSize().getWidth(); 
      float height = document.getPageSize().getHeight(); 
      writer.getDirectContentUnder().addImage(background, width, 0, 0, height, 0, 0); 
     } catch (DocumentException | IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

@Override 
public InputStream getStream() { 
    return new ByteArrayInputStream(byteArrayOutputStream.toByteArray()); 
} 

}

Этот код работает, и я получаю это: Not Good

Я пытаюсь добавить UTF-8,

InputStream inputStream = new byteArrayInputStream(tableHtml.getBytes("UTF-8")); 

, но я получаю это: Not good(utf8)

Я хочу, чтобы получить что-то вроде этого:

Good

Я думаю, что проблема с кодировкой, но я не знаю, как решить эту ошибку. Какие-либо предложения...?

ответ

0

Чтобы получить байты из строки (Unicode) в некоторой кодировке, укажите ее , в противном случае используется системная кодировка по умолчанию.

tableHtml.getBytes(StandardCharsets.UTF_8) 

В вашем случае, однако «Windows-1251», кажется, лучший матч, как PDF, кажется, не использовать UTF-8.

Возможно, оригинальная таблицаHTML String была прочитана с неправильной кодировкой. Возможно, это произойдет из файла или базы данных.

+0

Преобразование байтов в память не поможет выход. – markbernard

+0

Я видел, что он уже пробовал. Хотя это тоже нужно сделать. –

0

Необходимо указать iText, какую кодировку использовать, создав экземпляр класса BaseFont. Затем в вашем document.add(getTable(tableHtml)); вы можете добавить звонок к шрифту. Пример: http://itextpdf.com/examples/iia.php?id=199.

Я не могу сказать, как вы создаете таблицу, но класс PdfPTable имеет метод addCell(PdfCell) и один конструктор PdfCell принимает Phrase. Phrase может быть сконструирован с помощью String и Font. Класс font принимает значение BaseFont как аргумент конструктора.

Если вы посмотрите вокруг Javadoc for iText, вы увидите, что различные классы принимают шрифт как аргумент конструктора.

+0

Хммм Я тебя не понимаю. Можете ли вы изменить код и помочь мне? – KiKo

+0

Я обновляю свой ответ. – markbernard

Смежные вопросы