当前位置: 首页 > article >正文

SpringBoot集成itext导出PDF

添加依赖


        <!-- 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();
    }

}

测试

记得添加请求头

 

 


http://www.kler.cn/a/393575.html

相关文章:

  • Vector 深度复制记录
  • neo4j desktop基本入门
  • 虚幻引擎 CEO 谈元宇宙:发展、策略与布局
  • C++中的栈(Stack)和堆(Heap)
  • 丹摩征文活动|丹摩智算平台使用指南
  • 学术论文写作丨机器学习与深度学习
  • i春秋-GetFlag(HTTP请求方法使用,XXF伪造ip)
  • Redis四种架构模式
  • 大模型时代,呼叫中心部门如何建设一套呼出机器人系统?
  • python爬虫实战案例——爬取A站视频,m3u8格式视频抓取(内含完整代码!)
  • Qt文件系统-文本文件读写
  • 蓝桥杯每日真题 - 第8天
  • [CKS] K8S ServiceAccount Set Up
  • UDP协议和TCP协议之间有什么具体区别?
  • Flink+Kafka中Source和Sink的使用
  • ONLYOFFICE8.2版本测评,团队协作的办公软件
  • 新160个crackme - 096-xtFusion-k1
  • 免费送源码:Java+springboot+MySQL 物流车辆管理系统的设计与实现 计算机毕业设计原创定制
  • kafka可视化管理平台-kafka-console-ui
  • vue el-date-picker 日期选择器禁用失效问题
  • 蓝队基础(详见B站泷羽sec)
  • 计算机网络之表示层
  • 【ReactPress】React + antd + NestJS + NextJS + MySQL 的简洁兼时尚的博客网站
  • FFmpeg 怎么裁剪m4a的音频,从一个时间点开始,裁剪15秒钟的视频
  • 如何在 IntelliJ IDEA 中去掉 Java 方法注释后的空行
  • CUDA error: device-side assert triggered 报错解决