当前位置: 代码网 > it编程>编程语言>Java > SpringBoot导出PDF的四种实现方法详解

SpringBoot导出PDF的四种实现方法详解

2025年02月19日 Java 我要评论
在spring boot应用程序中实现pdf导出功能,可以选择多种库和技术栈。每种方法都有其优缺点,适用于不同的场景。以下是四种常见的方式:itext、apache pdfbox、jasperrepo

在spring boot应用程序中实现pdf导出功能,可以选择多种库和技术栈。每种方法都有其优缺点,适用于不同的场景。以下是四种常见的方式:itext、apache pdfbox、jasperreports 和 thymeleaf + flying saucer。我将详细对比这些方法,并提供相应的代码示例。

1. itext

优点:

  • 丰富的api: 支持复杂的pdf操作,如加密、数字签名、表单处理等。
  • 企业级支持: 提供广泛的文档和支持社区。
  • 多格式输出: 除了pdf,还支持其他格式(如html、xml)的转换。

缺点:

  • 商业许可: itext 7 是商业软件,某些高级功能需要购买许可证。
  • 学习曲线: api较为复杂,可能需要一定的学习成本。

性能:

对于大多数应用场景来说,itext 的性能是足够的。它在内存管理和文件处理速度方面表现优秀,尤其适合处理复杂的pdf文档。

适用场景:

适合需要生成复杂pdf文档的应用,尤其是那些涉及安全性和高级功能的企业级应用。

示例代码:

<!-- 添加依赖 -->
<dependency>
    <groupid>com.itextpdf</groupid>
    <artifactid>itext7-core</artifactid>
    <version>7.1.15</version> <!-- 请检查并使用最新版本 -->
</dependency>
import com.itextpdf.kernel.pdf.pdfdocument;
import com.itextpdf.kernel.pdf.pdfwriter;
import com.itextpdf.layout.document;
import com.itextpdf.layout.element.paragraph;

import javax.servlet.http.httpservletresponse;
import java.io.ioexception;

public class itextpdfservice {

    public void export(httpservletresponse response) throws ioexception {
        // 设置响应头
        response.setcontenttype("application/pdf");
        response.setheader("content-disposition", "attachment; filename=users.pdf");

        try (pdfwriter writer = new pdfwriter(response.getoutputstream());
             pdfdocument pdf = new pdfdocument(writer);
             document document = new document(pdf)) {

            // 添加内容到pdf
            document.add(new paragraph("hello, this is a pdf document created with itext in spring boot!"));

            // 关闭文档
            document.close();
        }
    }
}

2. apache pdfbox

优点:

  • 完全开源: 没有商业限制,适合所有类型的项目。
  • 轻量级: 依赖项较少,项目结构简洁。
  • 易于上手: api相对简单,适合快速开发和学习。

缺点:

  • 功能有限: 在一些复杂的功能上,如处理大型pdf或执行高级操作,可能不如itext强大。
  • 性能问题: 在处理非常大的文件或高并发场景下,性能可能会略逊于itext。

性能:

pdfbox 在处理较小的pdf文件时表现良好,但在处理大文件或者高并发场景下,其性能可能会略逊于itext。

适用场景:

适合需要生成简单pdf文档的应用,尤其是那些希望保持完全开源的项目。

示例代码:

<!-- 添加依赖 -->
<dependency>
    <groupid>org.apache.pdfbox</groupid>
    <artifactid>pdfbox</artifactid>
    <version>2.0.27</version> <!-- 请检查并使用最新版本 -->
</dependency>
import org.apache.pdfbox.pdmodel.pddocument;
import org.apache.pdfbox.pdmodel.pdpage;
import org.apache.pdfbox.pdmodel.pdpagecontentstream;
import org.apache.pdfbox.pdmodel.font.pdtype1font;

import javax.servlet.http.httpservletresponse;
import java.io.ioexception;

public class pdfboxpdfservice {

    public void export(httpservletresponse response) throws ioexception {
        // 设置响应头
        response.setcontenttype("application/pdf");
        response.setheader("content-disposition", "attachment; filename=users.pdf");

        try (pddocument document = new pddocument()) {
            pdpage page = new pdpage();
            document.addpage(page);

            try (pdpagecontentstream contentstream = new pdpagecontentstream(document, page)) {
                contentstream.setfont(pdtype1font.helvetica_bold, 12);
                contentstream.begintext();
                contentstream.newlineatoffset(100, 700);
                contentstream.showtext("hello, this is a pdf document created with apache pdfbox in spring boot!");
                contentstream.endtext();
            }

            // 将pdf写入响应输出流
            document.save(response.getoutputstream());
        }
    }
}

3. jasperreports

优点:

  • 强大的报表设计能力: 支持复杂的表格、图表、分组、子报表等功能。
  • 多数据源支持: 可以从数据库、javabean集合、csv、xml等多种数据源获取数据。
  • 丰富的样式和格式化: 支持多种字体、颜色、边框、背景等样式设置,以及日期、数字等格式化。
  • 集成度高: 与spring boot集成方便,可以轻松地将报表生成逻辑嵌入到应用程序中。
  • 输出格式多样: 除了pdf,还支持html、excel、csv等多种输出格式。

缺点:

  • 学习曲线较陡: jrxml模板语法较为复杂,需要一定时间来掌握。
  • 依赖项较多: 需要引入多个依赖项,可能会增加项目的复杂度。
  • 性能问题: 在处理非常大的数据集时,可能会遇到性能瓶颈,尤其是在内存管理和渲染速度方面。

性能:

在处理复杂报表和大数据集时表现较好,尤其是在需要高级功能(如分组、图表)的情况下。

适用场景:

适合需要生成复杂报表的应用,尤其是包含大量数据、图表、分组等元素的场景。

适合需要支持多种输出格式的应用。

示例代码:

<!-- 添加依赖 -->
<dependency>
    <groupid>net.sf.jasperreports</groupid>
    <artifactid>jasperreports</artifactid>
    <version>6.17.0</version> <!-- 请检查并使用最新版本 -->
</dependency>
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.data.jrbeancollectiondatasource;
import org.springframework.web.bind.annotation.getmapping;
import org.springframework.web.bind.annotation.requestmapping;
import org.springframework.web.bind.annotation.restcontroller;

import javax.servlet.http.httpservletresponse;
import java.io.inputstream;
import java.util.hashmap;
import java.util.list;
import java.util.map;

@restcontroller
@requestmapping("/api")
public class jasperreportcontroller {

    @getmapping("/export-jasper-pdf")
    public void export(httpservletresponse response) throws exception {
        // 设置响应头
        response.setcontenttype("application/pdf");
        response.setheader("content-disposition", "attachment; filename=report.pdf");

        // 加载jrxml模板
        inputstream reporttemplate = getclass().getresourceasstream("/templates/report.jrxml");
        jasperreport jasperreport = jaspercompilemanager.compilereport(reporttemplate);

        // 准备数据
        list<user> users = userservice.getallusers(); // 假设有一个userservice类
        jrbeancollectiondatasource datasource = new jrbeancollectiondatasource(users);

        // 设置参数
        map<string, object> parameters = new hashmap<>();
        parameters.put("title", "user report");

        // 生成pdf
        jasperprint jasperprint = jasperfillmanager.fillreport(jasperreport, parameters, datasource);
        jasperexportmanager.exportreporttopdfstream(jasperprint, response.getoutputstream());
    }
}

4. thymeleaf + flying saucer

优点:

  • html/css友好: 使用标准的html和css进行页面布局和样式设置,非常适合前端开发人员。
  • 易于维护: html模板容易理解和修改,尤其适合那些已经熟悉html/css的团队。
  • 灵活性高: 可以轻松地将现有的thymeleaf模板转换为pdf,减少了重复工作。
  • 轻量级: 相对于jasperreports,flying saucer的依赖项较少,项目结构更简洁。
  • 快速开发: 对于简单的pdf生成需求,开发速度较快,因为不需要学习新的模板语言。

缺点:

  • 功能有限: 相比jasperreports,flying saucer的功能较为有限,特别是在处理复杂报表(如分组、图表)时。
  • 性能一般: 在处理大文件或高并发场景下,性能可能不如jasperreports。
  • 样式兼容性: 某些css样式可能无法完全兼容,导致pdf渲染效果与预期不符。

性能:

对于简单的pdf生成需求,性能足够,并且开发速度快,维护成本低。

适用场景:

  • 适合需要将现有的html页面转换为pdf的应用,尤其是那些已经有现成的html模板的情况。
  • 适合生成简单的文档,如发票、合同、报告等,而不涉及复杂的报表功能。

示例代码:

<!-- 添加依赖 -->
<dependency>
    <groupid>org.thymeleaf</groupid>
    <artifactid>thymeleaf</artifactid>
    <version>3.0.12.release</version> <!-- 请检查并使用最新版本 -->
</dependency>
<dependency>
    <groupid>org.xhtmlrenderer</groupid>
    <artifactid>flying-saucer-pdf-itext5</artifactid>
    <version>9.1.20</version> <!-- 请检查并使用最新版本 -->
</dependency>
import org.springframework.core.io.classpathresource;
import org.springframework.ui.model;
import org.springframework.web.bind.annotation.getmapping;
import org.springframework.web.bind.annotation.requestmapping;
import org.springframework.web.bind.annotation.restcontroller;
import org.thymeleaf.templateengine;
import org.thymeleaf.context.context;
import org.xhtmlrenderer.pdf.itextrenderer;

import javax.servlet.http.httpservletresponse;
import java.io.inputstream;
import java.io.inputstreamreader;
import java.io.outputstream;
import java.nio.charset.standardcharsets;

@restcontroller
@requestmapping("/api")
public class pdfcontroller {

    private final templateengine templateengine;

    public pdfcontroller(templateengine templateengine) {
        this.templateengine = templateengine;
    }

    @getmapping("/export-thymeleaf-pdf")
    public void export(httpservletresponse response) throws exception {
        // 设置响应头
        response.setcontenttype("application/pdf");
        response.setheader("content-disposition", "attachment; filename=report.pdf");

        // 加载html模板
        inputstream templateinputstream = new classpathresource("templates/report.html").getinputstream();
        string htmlcontent = new string(templateinputstream.readallbytes(), standardcharsets.utf_8);

        // 准备上下文数据
        context context = new context();
        context.setvariable("users", userservice.getallusers()); // 假设有一个userservice类
        context.setvariable("title", "user report");

        // 渲染html
        string processedhtml = templateengine.process(htmlcontent, context);

        // 将html转换为pdf
        itextrenderer renderer = new itextrenderer();
        renderer.setdocumentfromstring(processedhtml);
        renderer.layout();

        // 输出pdf
        try (outputstream outputstream = response.getoutputstream()) {
            renderer.createpdf(outputstream);
        }
    }
}

性能与易用性对比

itextapache pdfboxjasperreportsthymeleaf + flying saucer
性能高(复杂报表)中(简单文档)
易用性复杂简单复杂简单
功能强大有限非常强大(报表)有限(html/css)
依赖项较多(部分需商业许可)较多
适用场景复杂pdf文档简单pdf文档复杂报表简单文档/html转pdf
学习曲线陡峭平缓陡峭平缓

总结

选择 itext 如果你需要生成复杂的pdf文档,尤其是涉及到安全性和高级功能的企业级应用。itext 提供了最全面的功能和最佳的性能,但需要注意其商业许可要求。

选择 apache pdfbox 如果你希望保持完全开源,并且只需要生成简单的pdf文档。pdfbox 轻量级且易于上手,适合小型项目或对性能要求不高的场景。

选择 jasperreports 如果你需要生成复杂的报表,特别是涉及到分组、图表、子报表等功能。jasperreports 是一个功能强大且成熟的工具,适合企业级应用。

选择 thymeleaf + flying saucer 如果你需要将现有的html页面转换为pdf,或者只需要生成简单的文档(如发票、合同等)。它易于使用,开发速度快,特别适合前端开发人员。

在实际项目中,建议根据具体需求和技术栈选择合适的工具。如果你不确定哪种工具更适合,可以先尝试一个小规模的原型项目,评估其性能和易用性,再做最终决定。

以上就是springboot导出pdf的四种实现方法详解的详细内容,更多关于springboot导出pdf的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com