itext使用问题记录

发布时间:2023年12月18日

使用功能:读取html文件转换PDF功能

个人错误记录: 生成的PDF又部分文字及符号乱码

使用代码来源:html转pdf(总结五种方法Java)_java html转pdf-CSDN博客

个人思路:1.字体使用问题,2.环境的编码导致的,3.读取html文件编码问题,4.在使用文件IO流过程中出现了问题

1.字体使用问题

c:/Windows/Fonts/simsun.ttc,0

本地使用的是V5.30版本,服务器使用V5.03版本?

2.环境的编码 ,服务器使用windows Server 2008??

系统编码是UTF-8

3.HTML编码为UTF-8

4.使用IO流过程问题

1.因为参考代码中有一个部分为

读取HTML 流文件,并查询当中的 或类似符号直接替换为空格
/**
     * 读取HTML 流文件,并查询当中的 或类似符号直接替换为空格
     *
     * @param inputStream
     * @return
     */
    private static InputStream readInputStrem(InputStream inputStream) {
        // 定义一些特殊字符的正则表达式 如:
        String regEx_special = "\\&[a-zA-Z||[^\\s]]{1,10};";
        try {
            //<1>创建字节数组输出流,用来输出读取到的内容
            ByteArrayOutputStream baos = new ByteArrayOutputStream();

            StringBuilder sb = new StringBuilder();
            //<2>创建缓存大小
            byte[] buffer = new byte[1024]; // 1KB
            //每次读取到内容的长度
            int len = -1;
            //<3>开始读取输入流中的内容
            while ((len = inputStream.read(buffer)) != -1) { //当等于-1说明没有数据可以读取了
                baos.write(buffer, 0, len);   //把读取到的内容写到输出流中
            }

            //<4> 把字节数组转换为字符串
            String content = baos.toString();
//            String content = sb.toString();
            //<5>关闭输入流和输出流
            //            inputStream.close();
            baos.close();
            //            log.info("读取的内容:{}", content);
            //            判断HTML内容是否具有HTML的特殊字符标记
            Pattern compile = Pattern.compile(regEx_special, Pattern.CASE_INSENSITIVE);
            Matcher matcher = compile.matcher(content);
            String replaceAll = matcher.replaceAll("");
//                        log.info("替换后的内容:{}", replaceAll);
            //            将字符串转化为输入流返回
            System.out.print(replaceAll);
            log.info("读取的html字符串: " + replaceAll);
            InputStream stringStream = getStringStream(replaceAll);
            //<6>返回结果
            return stringStream;
        } catch (Exception e) {
            e.printStackTrace();
            log.error("html转pdf失败: " , e);
            return null;
        }finally {
            System.gc();
        }
    }
/**
     * 将一个字符串转化为输入流
     * @param sInputString 字符串
     * @return
     */
    public static InputStream getStringStream(String sInputString) {
        if (sInputString != null && !sInputString.trim().equals("")) {
            try {
                ByteArrayInputStream tInputStringStream = new ByteArrayInputStream(sInputString.getBytes());
                return tInputStringStream;
            } catch (Exception e) {
                e.printStackTrace();
                log.error("html转pdf失败: " , e);
            }
        }
        return null;
    }

出现PDF部分中文符号乱码就是这个部分,该部分代码可不进行调用,

如需调用的,该部分代码可改为

 /**
     * 将一个字符串转化为输入流
     * @param sInputString 字符串
     * @return
     */
    public static InputStream getStringStream(String sInputString) {
        if (sInputString != null && !sInputString.trim().equals("")) {
            try {
                ByteArrayInputStream tInputStringStream = new ByteArrayInputStream(sInputString.getBytes("UTF-8"));
                return tInputStringStream;
            } catch (Exception e) {
                e.printStackTrace();
                log.error("html转pdf失败: " , e);
            }
        }
        return null;
    }

字符串转换成为流,但是转换的编码不明确就会按照GBK的进行转换,导致了部分乱码

2. 使用流太麻烦也可以更换为

String html= IOUtils.toString(new FileInputStream(new File(srcPath)),StandardCharsets.UTF_8);

PS:当前为个人问题记录

文章来源:https://blog.csdn.net/qq_41690927/article/details/135059145
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。