Java 使用UTF-8编码从HTML字符串创建PDF表格

Java 使用UTF-8编码从HTML字符串创建PDF表格,java,utf-8,itextpdf,Java,Utf 8,Itextpdf,我想从HTML字符串创建PDF表格。我可以创建那个表格,但不是文本,而是问号。这是我的密码: public class ExportReportsToPdf implements StreamSource { private static final long serialVersionUID = 1L; private ByteArrayOutputStream byteArrayOutputStream; public static final String FILE_LOC = "C:

我想从HTML字符串创建PDF表格。我可以创建那个表格,但不是文本,而是问号。这是我的密码:

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());
}
}

这段代码正在运行,我得到了:

我尝试添加UTF-8

InputStream inputStream = new byteArrayInputStream(tableHtml.getBytes("UTF-8"));
但我得到的是:

我想得到这样的东西:

我认为问题在于编码,但我不知道如何解决这个错误。任何建议…?

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

tableHtml.getBytes(StandardCharsets.UTF_8)
然而,在您的情况下,“Windows-1251”似乎更适合,因为PDF似乎没有使用UTF-8


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

您需要通过创建类的实例来告诉iText使用什么编码。然后在
文档中添加(getTable(tableHtml))您可以向字体添加调用。例如

我不知道如何创建表,但是类
PdfPTable
有一个方法
addCell(PdfCell)
,并且
PdfCell
的一个构造函数使用一个
短语。
短语
可以用
字符串
字体
构造。font类将
BaseFont
作为构造函数参数


如果您环顾一下,您会看到各种类都将字体作为构造函数参数。

在内存中转换字节无助于输出。嗯,我不理解您的意思。你能修改我的代码并帮助我吗?