使用UTF-8加密从HTML字符串创建PDF表

时间:2015-10-13 15:19:56

标签: java utf-8 itextpdf

我想从HTML字符串创建PDF表格。我可以创建那个表,但是我没有Text,我得到了问号。这是我的代码:

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

我认为问题在于编码,但我不知道如何解决这个问题。有什么建议......?

2 个答案:

答案 0 :(得分:0)

要从某个编码中的(Unicode)字符串中获取字节,请指定它, 否则使用默认的系统编码。

tableHtml.getBytes(StandardCharsets.UTF_8)

然而,在你的情况下" Windows-1251"似乎更好的匹配,因为PDF似乎不使用UTF-8。

可能原始的tableHTML String是用错误的编码读取的。如果它来自文件或数据库,可能会检查它。

答案 1 :(得分:0)

您需要通过创建BaseFont类的实例来告诉iText要使用的编码。然后在document.add(getTable(tableHtml));中,您可以添加对字体的调用。 http://itextpdf.com/examples/iia.php?id=199上的示例。

我无法告诉你如何创建一个表,但是类PdfPTable有一个方法addCell(PdfCell)PdfCell的一个构造函数需要一个PhrasePhrase可以使用StringFont构建。 font类将BaseFont作为构造函数参数。

如果查看Javadoc for iText,您会看到各种类将Font作为构造函数参数。