介绍语

本号主要是Java常用关键技术点,通用工具类的分享;以及springboot+springcloud+Mybatisplus+druid+mysql+redis+swagger+maven+docker等集成框架的技术分享;datax、kafka、flink等大数据处理框架的技术分享。文章会不断更新,欢迎码友关注点赞收藏转发!

望各位码友点击关注,冲1000粉。后面会录制一些视频教程,图文和视频结合,比如:图书介绍网站系统、抢购系统、大数据中台系统等。技术才是程序猿的最爱,码友们冲啊

如果码友觉得代码太长,可以从头到尾快速扫射一遍,了解大概即可。觉得有用后再转发收藏,以备不时之需。

正文:

pdf工具类,前面excel导出的时候一个码有问有没有pdf的工具类,我翻看了一下项目,没找到。以前有一个项目是有pdf导出的,主要是导出一些发函有公章的文件,还有需求是导出报销发票有公章等的文件,都是定制化的,耦合太大了,有些项目是要求导出网页的内容,这个是前端直接导出pdf,根本不需要后端支持。所以我自己整理写了一个工具类,抛砖引玉,有需求的码友可以自己根据公司需求定制pdf的生成工具类。这里只是给出一个非常基本的工具类,仅提供导出,仅供参考。

使用例子

import org.junit.Test;​import java.util.ArrayList;import java.util.List;​public class PdfUtilTest {​@Testpublic void createTest(){List<PdfChapter> pdfChapters = new ArrayList<>();pdfChapters.add(createContent());pdfChapters.add(createContent());pdfChapters.add(createContent());PdfUtil.getInstance().init().create("test14.pdf").chapters(pdfChapters).build();}​private PdfChapter createContent(){PdfChapter pdfChapter = new PdfChapter();pdfChapter.setTitle("Pdf工具类");pdfChapter.setOrder(1);PdfSection section = new PdfSection();section.setTitle("工具类例子1");PdfText pdfText = new PdfText();pdfText.setText("工具类内容内容");pdfText.setImage(true);pdfText.setImagePath("C:\\Users\\liangxn\\Desktop\\2021-11-06_002429.png");section.getPdfTexts().add(pdfText);pdfChapter.getSections().add(section);return pdfChapter;}}

上面例子导出的pdf如下,有几页,每页的内容是一样的,含有一张图片。这里提一下,图片和内容的布局,不是那么简单的,需要根据需求定制代码。

工具类源码:

import com.itextpdf.text.*;import com.itextpdf.text.pdf.BaseFont;import com.itextpdf.text.pdf.PdfWriter;import org.slf4j.Logger;import org.slf4j.LoggerFactory;​import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.net.URL;import java.util.List;​/*** pdf工具类,主要是实现了导出功能。* 使用itextpdf包实现*/public class PdfUtil {​private static final Logger logger = LoggerFactory.getLogger(PdfUtil.class);​// pdf大小,设置为A4纸大小public static final Rectangle PAGE_SIZE = PageSize.A4;// 设置内容距离纸张上右下左的距离public static final float MARGIN_LEFT = 50;public static final float MARGIN_RIGHT = 50;public static final float MARGIN_TOP = 50;public static final float MARGIN_BOTTOM = 50;// 空格的间距大小public static final float SPACING = 20;// 标题对齐方式: 0表示left,1表示centerpublic static final int TITLE_ALIGNMENT = 1;​​private static volatile PdfUtil instance = null;// pdf文档private Document document = null;//文章标题字体private Font _chapterFont = null;//小节标题字体private Font _sectionFont = null;//内容字体private Font _textFont = null;​private PdfUtil() {}​//DCL  (Double Check Lock 双端捡锁机制)public static PdfUtil getInstance() {if (instance == null) {synchronized (PdfUtil.class) {if (instance == null) {instance = new PdfUtil();}}}return instance;}​/*** 初始化字体*/protected PdfUtil init() {// 默认设置_chapterFont = createFont(20, Font.BOLD, new BaseColor(0, 0, 255));_sectionFont = createFont(16, Font.BOLD, new BaseColor(0, 0, 255));_textFont = createFont(10, Font.NORMAL, new BaseColor(0, 0, 0));return instance;}​/*** 初始化字体*/protected PdfUtil init(Font chapterFont, Font sectionFont, Font textFont) {// 使用自定义的字体_chapterFont = chapterFont;_sectionFont = sectionFont;_textFont = textFont;return instance;}​/*** 创建pdf文件** @param fileName 文件(全路径文件名)*/protected PdfUtil create(String fileName) {File file = new File(fileName);document = new Document(PAGE_SIZE, MARGIN_LEFT, MARGIN_RIGHT, MARGIN_TOP, MARGIN_BOTTOM);FileOutputStream out = null;try {out = new FileOutputStream(file);PdfWriter.getInstance(document, out);} catch (FileNotFoundException e) {logger.error("创建pdf文件异常", e);} catch (DocumentException e) {logger.error("创建pdf文件错误", e);}// 打开文档准备写入内容document.open();return instance;}​protected PdfUtil chapters(List<PdfChapter> pdfChapters) {try {for (PdfChapter pdfChapter : pdfChapters) {Chapter chapter = writeChapter(pdfChapter);for (PdfSection pdfSection : pdfChapter.getSections()) {Section section = writeSection(chapter, pdfSection);for (PdfText pdfText : pdfSection.getPdfTexts()) {if(pdfText.isImage()){writeImage(pdfText.getImagePath());}​if(pdfText.getText() != null){section.add(writePhrase(pdfText.getText()));}}}document.add(chapter);}} catch (DocumentException e) {e.printStackTrace();}​return instance;}​protected void build(){closeDocument();}​/*** 写章节** @param pdfChapter*/private Chapter writeChapter(PdfChapter pdfChapter) {Paragraph chapterTitle = new Paragraph(pdfChapter.getTitle(), _chapterFont);chapterTitle.setAlignment(TITLE_ALIGNMENT);Chapter chapter = new Chapter(chapterTitle, pdfChapter.getOrder());chapter.setNumberDepth(pdfChapter.getDepth());return chapter;}​/*** 写片段** @param chapter* @param pdfSection* @return*/private Section writeSection(Chapter chapter, PdfSection pdfSection) {Section section = null;if (chapter != null) {Paragraph sectionTitle = new Paragraph(pdfSection.getTitle(), _sectionFont);sectionTitle.setSpacingBefore(SPACING);section = chapter.addSection(sectionTitle);section.setNumberDepth(pdfSection.getDepth());}return section;}​/*** 写内容** @param text*/private Phrase writePhrase(String text) {return new Paragraph(text, _textFont);}​/*** 写图片** @param image*/private void writeImage(String image) {try {//图片1Image image1 = Image.getInstance(image);//将图片1添加到pdf文件中document.add(image1);} catch (IOException e) {logger.error("写入图片异常", e);} catch (DocumentException e) {logger.error("写入图片错误", e);}}​/*** 功能: 返回支持中文的字体---仿宋* <p>* simfang.ttf 仿宋常规* <p>* simhei.ttf 黑体常规** @param size  字体大小* @param style 字体风格* @param color 字体 颜色* @return 字体格式*/private Font createFont(float size, int style, BaseColor color) {BaseFont baseFont = null;try {// simfang.ttf文件必须放在class类文件所有的包路径下URL resource = PdfUtil.class.getClassLoader().getResource("simfang.ttf");if (resource == null) {throw new MyAppRunException("无simfang.ttf字体文件");}logger.info("加载simfang.ttf字体, 路径:{}", resource.getPath());baseFont = BaseFont.createFont(resource.getPath(), BaseFont.IDENTITY_H, BaseFont.EMBEDDED);} catch (DocumentException e) {logger.error("加载字体错误", e);} catch (IOException e) {logger.error("加载字体错误", e);}return new Font(baseFont, size, style, color);}​/*** 最后关闭PDF文档*/private void closeDocument() {if (document != null) {// 执行关闭时文件会自动保存document.close();logger.info("文件已保存");}}​}
实体类:
import lombok.Data;import java.util.ArrayList;
import java.util.List;@Data
public class PdfChapter {private String title;/*** 章节序列号*/private int order;/*** 章节的层级深度 设值=1 表示带序号 1.章节一;1.1小节一...,设值=0表示不带序号*/private int depth = 0;private List<PdfSection> sections = new ArrayList<>();
}
import lombok.Data;import java.util.ArrayList;
import java.util.List;@Data
public class PdfSection {private String title;/*** 否带序号 设值=1 表示带序号 1.章节一;1.1小节一...,设值=0表示不带序号*/private int depth = 1;private List<PdfText> pdfTexts = new ArrayList<>();
}
import lombok.Data;@Data
public class PdfText {private String text;private String imagePath;private boolean isImage = false;
}
其他类:
/*** 通用异常类*/
public class MyAppRunException extends RuntimeException {public MyAppRunException(String message) {super(message);}public MyAppRunException(String message, Throwable cause) {super(message, cause);}public MyAppRunException(Throwable cause) {super(cause);}protected MyAppRunException(String message,Throwable cause,boolean enableSuppression,boolean writableStackTrace) {super(message, cause, enableSuppression, writableStackTrace);}}

maven依赖

 <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13.2</version></dependency>

外话,pdf的需求基本都是需要定制的,不是一个工具类能搞定的。这里给出处理pdf的另一个包,这个包是apache的包,对于读pdf非常好用。需要定制pdf导出的话,还是需要多了解这两个包,然后定制自己的工具类。

<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.24</version><type>bundle</type> <!-- 要使用bundle需要先依赖一个plugin,自行百度 --></dependency>

鄙人编码十年多,在项目中也积累了一些工具类,很多工具类在每个项目都有在用,很实用。大部分是鄙人封装的,有些工具类是同事封装的,有些工具类已经不记得是ctrl+c的还是自己封装的了,现在有空就会总结项目中大部分的工具类,分享给各位码友。如果文章中涉及的代码有侵权行为请通知鄙人处理。

计划是先把工具类整理出来,正所谓工欲善其事,必先利其器。项目中不管是普通单体项目还是多模块maven项目或是分布式微服务,一部分功能模块都是可以重用的,工具类模块就是其中之一。

「Java工具类」pdf导出工具类java导出pdf文件工具类相关推荐

  1. python docker自动化_「docker实战篇」python的docker爬虫技术-移动自动化控制工具appium工具(17)...

    原创文章,欢迎转载.转载请注明:转载自 IT人故事会,谢谢! 原文链接地址: 「docker实战篇」python的docker爬虫技术-移动自动化控制工具appium工具(17) Appium是一个开 ...

  2. python docker自动化_「docker实战篇」python的docker爬虫技术-移动自动化控制工具安卓ADB的使用(15)...

    原创文章,欢迎转载.转载请注明:转载自 IT人故事会,谢谢! 原文链接地址: 「docker实战篇」python的docker爬虫技术-移动自动化控制工具安卓ADB的使用(15) adb(Androi ...

  3. 「 Java开发规范 」10人小团队Java开发规范参考这篇就够了

    <菜鸟程序员成长计划>之团队高效合作[开发规范篇] 1.「 Java开发规范 」10人小团队Java开发规范参考这篇就够了! 2.「 前端开发规范 」10人小团队前端开发规范参考这篇就够了 ...

  4. java百度上传控件_百度Bos上传文件工具类-BosUtils(java)

    功能要求 java项目中所有的图片均使用对象存储BOS 准备材料 首先你要又百度bos的账号,找到自己的ak.sk.endpoint.bucketname(这些东西不懂得可以去看bos的文档) 功能代 ...

  5. 疫情之下「在家办公模式」开启,你该选择哪些远程协同工具?| 特稿

    作者 | Aholiab 责编 | 胡巍巍 出品 | CSDN(ID:CSDNnews) 随着抗击新型冠状病毒感染疫情的不断深入,中国的应对举措受到了国际社会的高度关注.周密部署.亲临一线.精诚团结, ...

  6. 疫情之下「在家办公模式」开启,你该选择哪些远程协同工具?

    作者 | Aholiab 编辑 | 胡巍巍 来源 | CSDN(ID:CSDNnews) 随着抗击新型冠状病毒感染疫情的不断深入,中国的应对举措受到了国际社会的高度关注.周密部署.亲临一线.精诚团结, ...

  7. bat 自动输入密码_「docker实战篇」python的docker爬虫技术移动自动化uiautomator工具(16)...

    uiautomator 是 安卓4.3之后发布的测试工具,uiautomator是用来做UI测试的.也就是普通的手工测试,点击每个控件元素 看看输出的结果是否符合预期.比如 登陆界面 分别输入正确和错 ...

  8. java 前台播放视频_「纯js项目」海康视频项目,java后台+前台web显示的,望提供思路!...

    纯js项目: 海康视频项目,java后台+前台web显示的,望提供思路! 如果只是实现BS架构,可以向海康要web开发包,直接使用浏览器通过ocx访问海康设备浏览视频,如果需要的功能不全,再使用JNI ...

  9. pb系统改java_「软帝学院」:2019一线互联网公司Java高级面试题总结

    1.hashcode相等两个类一定相等吗?equals呢?相反呢? 2.介绍一下集合框架? 3.hashmap hastable 底层实现什么区别?hashtable和concurrenthashta ...

  10. 过五关,斩六将!「网易/美团/菜鸟」已拿offer【Java岗】

    经过两个月的辛苦奋战,最终拿到了网易.头条.字节.菜鸟的offer,感觉面试的时候还是很幸运的,很多题都是我之前刷题刷到过的,哈哈哈~~下面给广大网友们分享一下我的面经(网易/美团/菜鸟)供大家参考参 ...

最新文章

  1. 三维识别与位姿估计——Surafce Matching
  2. js/jquery学习笔记
  3. boost::describe模块宏BOOST_DESCRIBE_PP_NAME的测试程序
  4. 列名无效如何解决_XSKY ClickHouse如何实现存算分离
  5. Jenkins自定义主题教程
  6. linux 终端必须退出 history才会记录吗,Linux随笔 - linux 多个会话同时执行命令后history记录不全的解决方案【转载】...
  7. Oracle VM + Windows2003 Server 配置
  8. android studio读写txt,Android Studio从.txt文件读取/写入,保存路径?
  9. Android系统优化(65)---MTK 平台开关机、重启时间优化
  10. C++基础与深度解析第三章:数组、vector与字符串
  11. U盘安装CentOS Linux图文详解
  12. windows11彻底关闭Microsoft Defender 安装注册机
  13. Java 解压 gzip 和 tar.gz 文件
  14. 中国各主要大城市经纬度数据
  15. 面试中单例模式有几种写法
  16. 计算机奖项含金量排名,2019五大学科竞赛含金量排名
  17. android 键盘挡住popupwindow,软键盘遮挡住popupWindow问题
  18. 求解一元二次方程,包含复数解
  19. 1060驱动java_ubuntu16.04 安装 GTX 1060 显卡驱动
  20. GB/T 28181-2011、2016、2022变更对比

热门文章

  1. knife4j的使用
  2. c语言中字符串输入格式错误的是什么,C语言中scanf函数格式化错误输入问题
  3. 源码扫描工具Fortify SCA和FireLine对比说明
  4. java获取视频首帧图片用于界面展示
  5. 密歇根安娜堡计算机排名,密歇根大学安娜堡分校计算机科学与工程研究生最新专业排名...
  6. apply方法和unapply方法
  7. 移动端特点(重点)~~~
  8. Docker快速入门
  9. Sicily 1466. Taunt Exposure Estimation
  10. copa-pi测试软件,COPA-DATA SCADA/HMI自动化软件中的先锋——zenOn 6.20