SpringBoot集成itext导出PDF的过程

 更新时间:2024年11月15日 09:45:16   作者:宇宙超级勇猛无敌暴龙战神  
本文介绍了如何在Spring Boot中集成iText库导出PDF文件,并解决中文乱码问题,步骤包括添加依赖、准备字体、打开系统字体目录选择字体、在控制器中新增方法、创建并测试UserPdfExportService类,以及添加请求头,感兴趣的朋友一起看看吧

添加依赖

        <!-- PDF导出 -->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.11</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>

 准备字体

因为转成pdf文件可能出现乱码或者不展示中文,所以需要自定义字体

打开目录       C:\Windows\Fonts

挑一个自己喜欢的字体,然后CV大法

代码

controller新增方法 

    // 导出pdf
    @GetMapping("/exportPdf")
    public void exportPdf(HttpServletResponse response) throws DocumentException, IOException {
        byte[] pdfBytes = userPdfExportService.exportUsersToPdf();
        String filename = "用户信息.pdf";
        String encodedFilename = URLEncoder.encode(filename, StandardCharsets.UTF_8.toString()).replace("+", "%20");
        response.setContentType("application/pdf");
        response.setHeader("Content-Disposition", "attachment; filename=" + encodedFilename);
        response.setContentLength(pdfBytes.length);
        response.getOutputStream().write(pdfBytes);
        response.getOutputStream().flush();
        response.getOutputStream().close();
    }

 新增UserPdfExportService类

@Service
public class UserPdfExportService {
    @Autowired
    private ISysUserService sysUserService;
    public byte[] exportUsersToPdf() throws DocumentException, IOException {
        //查询要导出的数据
        List<SysUser> users = sysUserService.selectUserList(new SysUser());
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        Document document = new Document();
        PdfWriter.getInstance(document, baos);
        document.open();
        // 添加标题
        document.add(new Paragraph("用户列表"));
        // 加载自定义字体
        InputStream is = getClass().getResourceAsStream("/static/fonts/simfang.ttf");
        if (is == null) {
            throw new IOException("字体文件未找到");
        }
        byte[] fontBytes = toByteArray(is);
        BaseFont baseFont = BaseFont.createFont("simfang.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED, true, fontBytes, null);
        Font font = new Font(baseFont, 12);
        // 创建表格
        PdfPTable table = new PdfPTable(4);
        table.setWidthPercentage(100);
        // 在表格单元格中也应使用相同的字体
        table.addCell(new PdfPCell(new Phrase("用户名", font)));
        table.addCell(new PdfPCell(new Phrase("姓名", font)));
        table.addCell(new PdfPCell(new Phrase("邮箱", font)));
        table.addCell(new PdfPCell(new Phrase("手机号", font)));
        for (SysUser user : users) {
            table.addCell(new PdfPCell(new Phrase(user.getUserName(), font)));
            table.addCell(new PdfPCell(new Phrase(user.getNickName(), font)));
            table.addCell(new PdfPCell(new Phrase(user.getEmail(), font)));
            table.addCell(new PdfPCell(new Phrase(user.getPhonenumber(), font)));
        }
        document.add(table);
        document.close();
        return baos.toByteArray();
    }
    /**
     * 流转byte字节
     * @param is
     * @return
     * @throws IOException
     */
    private byte[] toByteArray(InputStream is) throws IOException {
        ByteArrayOutputStream buffer = new ByteArrayOutputStream();
        int nRead;
        byte[] data = new byte[16384];
        while ((nRead = is.read(data, 0, data.length)) != -1) {
            buffer.write(data, 0, nRead);
        }
        buffer.flush();
        return buffer.toByteArray();
    }
}

测试

记得添加请求头

到此这篇关于SpringBoot集成itext导出PDF的文章就介绍到这了,更多相关SpringBoot导出PDF内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring AOP与代理类的执行顺序级别浅析

    Spring AOP与代理类的执行顺序级别浅析

    这篇文章主要介绍了Spring AOP与代理类的执行顺序级别,关于 Spring AOP和Aspectj的关系,两个都实现了切面编程,Spring AOP更多地是为了Spring框架本身服务的,而Aspectj具有更强大、更完善的切面功能
    2023-03-03
  • @RefreshScope(nacos配置热更新方式)

    @RefreshScope(nacos配置热更新方式)

    文章主要介绍了Spring和Nacos对`@RefreshScope`注解的处理方式,Spring在每次调用被`@RefreshScope`注解的bean的属性时,会先从本地缓存获取,如果缓存不存在则重新创建并获取最新环境配置
    2024-12-12
  • Maven生命周期和及插件原理用法详解

    Maven生命周期和及插件原理用法详解

    这篇文章主要介绍了Maven生命周期和及插件原理用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值的相关资料
    2020-08-08
  • 三分钟教你如何在IDEA中快速创建工程的方法

    三分钟教你如何在IDEA中快速创建工程的方法

    这篇文章主要介绍了三分钟教你如何在IDEA中快速创建工程的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • Spring轻松解决循环依赖

    Spring轻松解决循环依赖

    Spring的解决循环依赖是有前置条件的,要解决循环依赖我们首先要了解Spring Bean对象的创建过程和依赖注入的方式。依赖注入方式,我之前的博客有所分享,大家可以在看本篇文章之前进行一下小小的回顾
    2023-04-04
  • Java Swing仿QQ登录界面效果

    Java Swing仿QQ登录界面效果

    这篇文章主要为大家详细介绍了Java Swing仿QQ登录界面效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • 解决springboot启动成功,但访问404的问题

    解决springboot启动成功,但访问404的问题

    这篇文章主要介绍了解决springboot启动成功,但访问404的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • java null转换为字符串的三种方法

    java null转换为字符串的三种方法

    在Java开发中,正确处理null值至关重要,以避免空指针异常,本文介绍了三种常见的null值转字符串方法:三元运算符、Objects.toString方法、String.valueOf方法,感兴趣的可以了解一下
    2024-10-10
  • Java从控制台接受输入字符的简单方法

    Java从控制台接受输入字符的简单方法

    这篇文章主要介绍了Java从控制台接受输入字符的简单方法,需要的朋友可以参考下
    2014-02-02
  • springboot如何使用@Value获取配置文件的值

    springboot如何使用@Value获取配置文件的值

    这篇文章主要介绍了springboot如何使用@Value获取配置文件的值,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08

最新评论