Spring Boot与iTextPdf:高效生成PDF文件预览

 ​

博客主页:     南来_北往

系列专栏:Spring Boot实战


在现代应用程序开发中,生成PDF文件是一个常见的需求。PDF文件因其跨平台性和易读性,被广泛应用于文档交换、报告生成和打印预览等场景。Spring Boot作为一个用于简化Spring应用开发的框架,通过提供默认配置和快速开发环境,帮助开发者以最快的速度构建应用程序。而iTextPdf是一个强大的Java类库,用于生成和处理PDF文档。本文将介绍如何使用Spring Boot和iTextPdf高效生成PDF文件并实现预览功能。

一、准备工作

首先,确保你的Spring Boot项目中已经添加了iTextPdf依赖。你可以通过修改pom.xml文件来添加依赖项。以下是一个示例:

<dependency>  <groupId>com.itextpdf</groupId>  <artifactId>itext7-core</artifactId>  <version>7.1.15</version>  
</dependency>
二、生成PDF文件

使用iTextPdf生成PDF文件的基本步骤如下:

  1. 创建PDF写入对象:使用PdfWriter类创建一个PDF写入对象,该对象负责将PDF内容写入到指定的文件中。

  2. 创建PDF文档对象:使用PdfDocument类创建一个PDF文档对象,该对象代表整个PDF文档。

  3. 创建文档对象:使用Document类创建一个文档对象,该对象用于添加内容到PDF文档中。

  4. 添加内容到文档:使用Document对象提供的各种方法(如add)将内容(如文本、段落、表格等)添加到PDF文档中。

  5. 关闭文档:在完成内容添加后,调用Document对象的close方法以确保PDF文件正确生成。

以下是一个简单的示例代码,展示了如何使用iTextPdf生成一个包含“Hello, World!”文本的PDF文件:

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.IOException;  public class PdfGenerator {  public static void main(String[] args) {  String dest = "example.pdf";  try {  createPdf(dest);  System.out.println("PDF Created");  } catch (IOException e) {  e.printStackTrace();  }  }  public static void createPdf(String dest) throws IOException {  PdfWriter writer = new PdfWriter(dest);  PdfDocument pdf = new PdfDocument(writer);  Document document = new Document(pdf);  document.add(new Paragraph("Hello, World!"));  document.close();  }  
}
三、在Spring Boot中实现PDF生成

在Spring Boot中,你可以创建一个Controller来处理PDF生成请求。以下是一个示例,展示了如何创建一个简单的REST接口,用户请求时自动生成PDF文件并返回给客户端:

import com.itextpdf.kernel.pdf.PdfDocument;  
import com.itextpdf.kernel.pdf.PdfWriter;  
import com.itextpdf.layout.Document;  
import com.itextpdf.layout.element.Paragraph;  
import org.springframework.web.bind.annotation.GetMapping;  
import org.springframework.web.bind.annotation.RestController;  
import javax.servlet.http.HttpServletResponse;  
import java.io.IOException;  @RestController  
public class PdfController {  @GetMapping("/generate-pdf")  public void generatePdf(HttpServletResponse response) throws IOException {  response.setContentType("application/pdf");  response.setHeader("Content-Disposition", "attachment; filename=sample.pdf");  PdfWriter writer = new PdfWriter(response.getOutputStream());  PdfDocument pdfDocument = new PdfDocument(writer);  Document document = new Document(pdfDocument);  document.add(new Paragraph("Hello, this is a sample PDF document generated using iTextPDF and Spring Boot!"));  document.close();  }  
}

启动Spring Boot应用后,打开浏览器访问http://localhost:8080/generate-pdf,这将触发PDF文件的下载,文件名为sample.pdf

四、实现PDF预览功能

为了预览生成的PDF文件,你可以使用Swing组件(如JFrame和JPanel)结合PDFRenderer库来渲染PDF内容。以下是一个简单的示例,展示了如何在Swing应用程序中预览PDF文件:

1、添加PDFRenderer依赖:在你的pom.xml文件中添加Apache PDFBox依赖,该依赖包含了PDFRenderer类。

<dependency>  <groupId>org.apache.pdfbox</groupId>  <artifactId>pdfbox</artifactId>  <version>2.0.24</version>  
</dependency>  
<dependency>  <groupId>org.apache.pdfbox</groupId>  <artifactId>pdfbox-tools</artifactId>  <version>2.0.24</version>  
</dependency>

2、编写预览代码:使用PDFRenderer类渲染PDF内容,并将其显示在Swing组件中。

import org.apache.pdfbox.pdmodel.PDDocument;  
import org.apache.pdfbox.rendering.PDFRenderer;  
import javax.swing.*;  
import java.awt.*;  
import java.awt.image.BufferedImage;  
import java.io.File;  
import java.io.IOException;  public class PdfPreview {  public static void main(String[] args) {  String filePath = "example.pdf";  try {  createAndShowGUI(filePath);  } catch (IOException e) {  e.printStackTrace();  }  }  private static void createAndShowGUI(String filePath) throws IOException {  JFrame frame = new JFrame("PDF Preview");  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  frame.setSize(800, 600);  PDDocument document = PDDocument.load(new File(filePath));  PDFRenderer pdfRenderer = new PDFRenderer(document);  BufferedImage bufferedImage = pdfRenderer.renderImageWithDPI(0, 300); // Render the first page at 300 DPI  ImageIcon imageIcon = new ImageIcon(bufferedImage);  JLabel label = new JLabel(imageIcon);  frame.getContentPane().add(new JScrollPane(label));  frame.setVisible(true);  document.close();  }  
}

运行PdfGenerator类生成example.pdf文件,然后运行PdfPreview类预览生成的PDF文件。

五、总结

通过结合Spring Boot和iTextPdf,你可以高效地生成PDF文件并实现预览功能。本文介绍了如何在Spring Boot项目中添加iTextPdf依赖,如何生成PDF文件,以及如何在Swing应用程序中预览PDF文件。这些示例代码可以根据实际需求进行扩展和修改,以满足不同的应用场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/54486.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【python】追加写入excel

输出文件运行前&#xff08;有两张表&#xff0c;“表1”和“Sheet1”&#xff09;&#xff1a; 目录 一&#xff1a;写入单表&#xff08;删除所有旧工作表&#xff0c;写入新表&#xff09;二&#xff1a;写入多表&#xff08;删除所有旧工作表&#xff0c;写入新表&#x…

MySQL 数据库的备份与恢复

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

TS系列(7):知识点汇总

你好&#xff0c;我是沐爸&#xff0c;欢迎点赞、收藏、评论和关注。 一、TS是什么&#xff1f; TypeScript 由微软开发&#xff0c;是基于 JavaScript 的一个扩展语言。TypeScript 包含 JavaScript 的所有内容&#xff0c;是 JavaScript 的超集。TypeScript 增加了静态类型检…

LLM+知识图谱新工具! iText2KG:使用大型语言模型构建增量知识图谱

iText2KG是一个基于大型语言模型的增量知识图谱构建工具&#xff0c;通过从文本文档中提取实体和关系来逐步构建知识图谱。该工具具有零样本学习能力&#xff0c;能够在无需特定训练的情况下&#xff0c;在多个领域中进行知识提取。它包括文档提炼、实体提取和关系提取模块&…

Unity3D 客户端多开

Unity3D 实现客户端多开 客户端多开 最近在做好友聊天系统&#xff0c;为了方便测试&#xff0c;需要再开一个客户端。 简单的方法&#xff0c;就是直接拷贝一个新的项目&#xff0c;但是需要很多时间和占用空间。 查阅了网络资料&#xff0c;发现有一种软链接&#xff0c;…

Python水循环标准化对比算法实现

&#x1f3af;要点 算法区分不同水循环数据类型&#xff1a;地下水、河水、降水、气温和其他&#xff0c;并使用相应标准化降水指数、标准化地下水指数、标准化河流水位指数和标准化降水蒸散指数。绘制和计算特定的时间序列比较统计学相关性。使用相关矩阵可视化集水区和显示空…

河南移动:核心营业系统稳定运行超300天,数据库分布式升级实践|OceanBase案例

河南移动&#xff0c;作为电信全业务运营企业&#xff0c;不仅拥有庞大的客户群体和业务规模&#xff0c;还引领着业务产品与服务体系的创新发展。河南移动的原有核心营业系统承载着超过6000万的庞大用户量&#xff0c;管理着超过80TB的海量数据&#xff0c;因此也面临着数据规…

pWnos1.0 靶机渗透 (Perl CGI 的反弹 shell 利用)

靶机介绍 来自 vulnhub 主机发现 ┌──(kali㉿kali)-[~/testPwnos1.0] …

阿里云ACP认证考试题库

最近有好些同学&#xff0c;考完阿里云ACP了&#xff0c;再来跟我反馈&#xff1a;自己花700买的阿里云ACP题库&#xff0c;结果答案是错的&#xff01; 或者考完后发现&#xff0c;买的阿里云ACP题库覆盖率只有50%&#xff01; 为避免大家继续踩坑&#xff0c;给大家分享一个阿…

qt使用QDomDocument读写xml文件

在使用QDomDocument读写xml之前需要在工程文件添加&#xff1a; QT xml 1.生成xml文件 void createXml(QString xmlName) {QFile file(xmlName);if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate |QIODevice::Text))return false;QDomDocument doc;QDomProcessin…

使用 Python 遍历文件夹

要解决这个问题&#xff0c;使用 Python 的标准库可以很好地完成。我们要做的是遍历目录树&#xff0c;找到所有的 text 文件&#xff0c;读取内容&#xff0c;处理空行和空格&#xff0c;并将处理后的内容合并到一个新的文件中。 整体思路&#xff1a; 遍历子目录&#xff1…

【目标检测】工程机械车辆数据集2690张4类VOC+YOLO格式

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2694 标注数量(xml文件个数)&#xff1a;2694 标注数量(txt文件个数)&#xff1a;2694 标注…

Star 3w+,向更安全、更泛化、更云原生的 Nacos3.0 演进

作者&#xff1a;席翁 Nacos 社区刚刚迎来了 Star 突破 30000 的里程碑&#xff0c;从此迈上了一个新的阶段。感谢大家的一路支持、信任和帮助&#xff01; Nacos /nɑ:kəʊs/是 Dynamic Naming and Configuration Service 的首字母简称&#xff0c;定位于一个更易于构建云原…

Linux网络编程 -- 网络基础

本文主要介绍网络的一些基础概念&#xff0c;不涉及具体的操作原理&#xff0c;旨在构建对网络的基础认识。 1、网络的早期发展历程 20世纪50年代 在这一时期&#xff0c;计算机主机非常昂贵&#xff0c;而通信线路和设备相对便宜。为了共享计算机主机资源和进行信息的综合处…

关于CSS 案例_新闻内容展示

新闻要求 标题:居中加粗发布日期: 右对齐分割线: 提示, 可以使用 hr 标签正文/段落: 左侧缩进插图: 居中显示 展示效果 审核过不了&#xff0c;内容没填大家将就着看吧。 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset&qu…

python-pptx 中 placeholder 和 shape 有什么区别?

在 python-pptx 库中&#xff0c;placeholder 和 shape 是两个核心概念。虽然它们看起来相似&#xff0c;但在功能和作用上存在显著的区别。为了更好地理解这两个概念&#xff0c;我们可以通过它们的定义、使用场景以及实际代码示例来剖析其差异。 Python-pptx 的官网链接&…

【Java】六大设计原则和23种设计模式

目录 一、JAVA六大设计原则 二、JAVA23种设计模式 1. 创建型模式 2. 结构型模式 3. 行为型模式 三、设计原则与设计模式 1. 设计原则 2. 设计模式 四、单例模式 1. 饿汉式 2. 懒汉式 四、代理模式 1. 什么是代理模式 2. 为什么要用代理模式 3. 有哪几种代理模式 …

服务器几核几G几M是什么意思?如何选择?

服务器几核几G几M是什么意思&#xff1f;我们建站、搭建网络平台都要用到云服务器&#xff0c;不管在腾讯云、阿里云还是别的云服务平台选购&#xff0c;都会接触到服务器配置。云服务器就是把物理服务器&#xff08;俗称“母鸡”&#xff09;&#xff0c;用虚拟机技术虚拟出多…

Android SystemUI组件(09)唤醒亮屏 锁屏处理流程

该系列文章总纲链接&#xff1a;专题分纲目录 Android SystemUI组件 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节持续迭代之前章节的思维导图&#xff0c;主要关注左侧上方锁屏分析部分 唤醒亮屏 即可。 Power按键的处理逻辑最终是由PhoneWindowManager来…

BUSHOUND的抓包使用详解

BUSHOUND是个过滤软件&#xff0c;确切来说是在windows操作系统它的驱动层USB传输的数据。所以这个数据上可能是与USB的总线上的数据是有一点差异的。 先要选择设备的抓包。所以就是在device这个界面底下&#xff0c;我们首先要选择我们要抓的设备。 尝试下键盘设备 电脑键盘…