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

该博客介绍了在遇到HTML格式错误导致的导出PDF失败问题时,如何利用Jsoup进行格式化和修复。首先,通过引入Jsoup库,然后读取HTML文件内容,使用Jsoup的parse方法格式化HTML,最后通过Tidy工具将其转换为严格的XHTML。此方法有助于解决丢失结束标签等HTML格式问题。
摘要由CSDN通过智能技术生成
  • 前言,接着上一篇(下载(导出)pdf模板文件(比如:审批单));
  • 报错原因:html格式有误,结束标签丢失(可能根据实际情况,确认html也是正确的,但是还是会报这个错);
  • 解决思路:在拿到html内容时,通过jsoup格式化html内容;
  1. pom引入jsoup包
<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.14.3</version>
</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();
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值