前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java组件生成PDF文件

Java组件生成PDF文件

作者头像
每天学Java
发布2020-06-02 10:20:21
4.6K0
发布2020-06-02 10:20:21
举报
文章被收录于专栏:每天学Java每天学Java

前言

最近和一位朋友聊自己微信小程序的事情,朋友的建议将小程序的文章给去掉,增加一个新的功能,他说我写的文章很鸡肋。自己听完之后内心及其犹豫,一方面自己也很清楚自己的文字的功底确实不行,写的技术文章没多少人看,但是一直想这个能锻炼出来。另一方面虽然文章没人看,但是文章的功能是自己一点一点写出来的,让我隐藏起来,我确实有点不想接受。

犹豫几天,还是决定去除这个功能,刚好最近对于后台的重构也在进行,所以决定来一个大的改版(估计需要一段时间才能真正上线新的功能)。

今天的文章,也就是在准备的过程中实现的一个功能-导出PDF

组件选用

在日常的工作中,利用POI导出Excel的功能需求自己做了不少,但是导出PDF确实是第一次做,在百度上进行一番查阅,发现大家都是使用Abode的iText组件来生成PDF

所以这里也随大流,选用iText,官网上iText已经到7了,但是百度搜索的案例中,用的都是iText5,考虑自己对iText不熟悉,所以还是根据大众选用5,一方面,入手快有现成的代码可以复制,另一方面用的人多,那么对于一些坑,填的人也会多,自己就不用一点点摸索了

当然了,如果愿意摸索,可以去官网看案例和API,下面附上官网地址:https://itextpdf.com/en

开发记录

引入依赖文件:

代码语言:javascript
复制
		<!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->
		<dependency>
			<groupId>com.itextpdf</groupId>
			<artifactId>itextpdf</artifactId>
			<version>5.5.13</version>
		</dependency>
		<!-- https://mvnrepository.com/artifact/com.itextpdf/itext-asian -->
		<dependency>
			<groupId>com.itextpdf</groupId>
			<artifactId>itext-asian</artifactId>
			<version>5.2.0</version>
		</dependency>

创建Document对象,三种方式:

代码语言:javascript
复制
Document document =new Document(); // 默认页面大小是A4
Document document =new Document(PageSize.A4); // 指定页面大小为A4
Document document =new Document(PageSize.A4,50,50,30,20); // 指定页面大小为A4,且自定义页边距(marginLeft、marginRight、marginTop、marginBottom)

创建PdfWriter对象

第一个参数是对文档对象的引用

第二个参数是需要写入的PDF文件的实际路径。我们也可以使用字节数组流实现。

代码语言:javascript
复制
  //实际文件
  File file = new File("/Users/chenlong/Documents/test.pdf");
     PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file));

  //字节数组流
  ByteArrayOutputStream baos = null;
  baos = new ByteArrayOutputStream();//构建字节输出流
  PdfWriter.getInstance(doc,baos);//将PDF文档对象写入到流

Write对象创建之后

首先打开documet(这个过程就像我们创建一个空的pdf文件,然后打开来创作一样)

然后开始写入数据

设置文档属性

最后关闭

代码语言:javascript
复制
 document.open();
 document.addTitle("标题");
 document.addAuthor("每天学Java");
 document.addSubject("测试报表");
 document.addKeywords("关键字");
 document.addCreator("陈龙");
 new PDFUtil().generatePDF(document, reportVO);
 document.close();

而generatePDF方法是自定义的方法,对于文档内容的填充

通常我们会用到的内容内容类有:

代码语言:javascript
复制
段落Paragraph
表格table
单元格内容样式cell
直线  LineSeparator
点线  DottedLineSeparator
超链接 Anchor
添加图片 Image
定位 Anchor

水印功能
Watermark内部类,需要继承 PdfPageEventHelper类
writer.setPageEvent(new Watermark());

里面的详细属性这里就不在说了,我们只看简单的段落

代码语言:javascript
复制
  //字体大小,粗细,颜色
  Font titlefont = new Font(bfChinese, 16, Font.BOLD,, BaseColor.RED);
  //段落
  Paragraph paragraph = new Paragraph("测试报表", titlefont);
  //段落属性
  paragraph.setAlignment(1); //设置文字居中 0靠左   1,居中     2,靠右
  paragraph.setIndentationLeft(100); //设置左缩进
  paragraph.setIndentationRight(100); //设置右缩进
  paragraph.setFirstLineIndent(24); //设置首行缩进
  paragraph.setLeading(40f); //行间距
  paragraph.setSpacingBefore(5f); //设置段落上空白
  paragraph.setSpacingAfter(10f); //设置段落下空白
  //分割线
  Paragraph p1 = new Paragraph();
  p1.add(new Chunk(new LineSeparator()));
  //如果需要换行
  paragraph.add(Chunk.NEWLINE);
  //定义一个块,块之间的换行也可以使用Chunk.NEWLINE
  Chunk chunk = new Chunk("我是一个文本块");
  chunk.setFont(problems);
  chunk.setWordSpacing(50);
  paragraph.add(chunk);
    
  //需要将段落增加到document中
  document.add(paragraph);
  document.add(p1);

实现过程参考文章:

https://blog.csdn.net/weixin_37848710/article/details/89522862

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 每天学Java 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 组件选用
  • 开发记录
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档