下载(导出)pdf模板文件(比如:审批单),报错:Invalid nested tag *** found, expected closing tag ***

  • 前言,接着上一篇(下载(导出)pdf模板文件(比如:审批单));
  • 报错原因:html格式有误,结束标签丢失(可能根据实际情况,确认html也是正确的,但是还是会报这个错);
  • 解决思路:在拿到html内容时,通过jsoup格式化html内容;
  1. pom引入jsoup包
<dependency>
    <groupId>org.jsoupgroupId>
    <artifactId>jsoupartifactId>
    <version>1.14.3version>
dependency>
  1. 在java代码中实现html格式化
/**
 * 将html 转换成为严格的XHTML
 */
public class Html2Xhtml {

    /**
     * 转化类
     *
     * @param htmlPath  html文件输入路径(带文件名称)
     * @param xhtmlPath xhtml文件输入路径(带文件名称)
     * @return
     */
    public static String html2Xhtml(String htmlPath, String xhtmlPath) {
        if (StringUtils.isEmpty(htmlPath)) {
            return null;
        }

        String path = null;
        try (FileInputStream fin = new FileInputStream(htmlPath)) {
            ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
            int data = -1;
            while ((data = fin.read()) != -1) {
                byteArrayOut.write(data);
            }
            fin.close();

            String html = byteArrayOut.toString("UTF-8");
            //System.out.println("原始HTML:" + html);

            String newHtml = formatHtml(html);
            //System.out.println("格式化后HTML:" + newHtml);

            byte[] htmlFileData = newHtml.getBytes(StandardCharsets.UTF_8);
            byteArrayOut.close();

            ByteArrayInputStream tidyInput = new ByteArrayInputStream(htmlFileData);
            ByteArrayOutputStream tidyOut = new ByteArrayOutputStream();
            Tidy tidy = new Tidy();
            tidy.setInputEncoding("UTF-8");
            tidy.setOutputEncoding("UTF-8");
            tidy.setShowWarnings(false);
            tidy.setIndentContent(true);
            tidy.setSmartIndent(true);
            tidy.setIndentAttributes(false);
            tidy.setMakeClean(true);
            tidy.setQuiet(true);
            tidy.setWord2000(true);
            tidy.setXHTML(true);
            tidy.setErrout(new PrintWriter(System.out));
            tidy.parse(tidyInput, tidyOut);
            tidyInput.close();

            tidyOut.writeTo(new FileOutputStream(xhtmlPath));
            tidyOut.flush();
            tidyOut.close();

            path = xhtmlPath;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
            path = null;
        }

        return path;
    }


    /**
     * 格式化html
     *
     * 报错代码:Invalid nested tag *** found, expected closing tag ***
     * 报错原因:html转xhtml过程中,标签没有闭合
     * 解决思路:通过jsoup格式化html
     * @param html
     * @return
     */
    private static String formatHtml(String html) {
        Document document = Jsoup.parse(html);
        document.outputSettings().syntax(Document.OutputSettings.Syntax.xml);
        document.outputSettings().escapeMode(Entities.EscapeMode.xhtml);
        return document.html();
    }

}

你可能感兴趣的:(itextpdf,html转xhtml格式化,html,java)