itext使用问题记录

文章讨论了在使用Java将HTML转换为PDF时遇到的乱码问题,主要原因是字体不匹配、环境编码设置不当和字符串转换编码未明确。作者提供了两种可能的解决方案:调整字体使用和明确字符串转换编码为UTF-8。

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

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

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

个人思路: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:当前为个人问题记录

以下是一些可能解决使用 iText 打印 PDF 出现重复数据问题的办法: ### 数据处理层面 - **检查数据源**:确保在向 iText 提供数据时,数据源本身没有重复。例如,如果是从数据库查询数据,检查 SQL 查询语句是否正确,是否存在重复记录。可以在查询时使用 `DISTINCT` 关键字去除重复数据。 ```sql SELECT DISTINCT column1, column2 FROM your_table; ``` - **数据去重处理**:在将数据传递给 iText 之前,对数据进行去重操作。在 Java 中,可以使用 `Set` 集合来实现去重。 ```java import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; public class DataDeduplication { public static <T> List<T> removeDuplicates(List<T> list) { Set<T> set = new HashSet<>(list); return new ArrayList<>(set); } } ``` ### iText 代码层面 - **检查循环逻辑**:如果在代码中有循环来添加数据到 PDF 中,确保循环的次数和逻辑正确,避免重复添加。例如,以下是一个简单的循环添加文本到 PDF 的示例,要确保循环不会重复执行: ```java import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.kernel.pdf.PdfWriter; import com.itextpdf.layout.Document; import com.itextpdf.layout.element.Paragraph; import java.io.File; import java.io.IOException; public class PdfCreationExample { public static void main(String[] args) throws IOException { String dest = "output.pdf"; PdfWriter writer = new PdfWriter(new File(dest)); PdfDocument pdf = new PdfDocument(writer); Document document = new Document(pdf); List<String> dataList = new ArrayList<>(); dataList.add("Data 1"); dataList.add("Data 2"); // 确保循环逻辑正确 for (String data : dataList) { document.add(new Paragraph(data)); } document.close(); } } ``` - **避免重复添加元素**:在添加元素到 PDF 时,确保不会重复添加相同的元素。例如,避免在不同的地方重复添加同一个表格或段落。 ### 缓存和状态管理层面 - **清除缓存**:如果使用了缓存机制,确保在每次生成新的 PDF 时清除缓存,避免旧数据被重复使用。 - **重置状态**:在每次生成 PDF 之前,重置相关的状态变量,确保每次都是全新的操作。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值