itext7史上最全实战总结

1. itext7史上最全实战总结 1.1. 前言

最近有个需求需要我用Java手动写一份PDF报告,经过考察几种pdf开源代码,最终选取了itext7,此版本为7.1.11,由于发现网上关于该工具的博文比较少,特别是实战博文几乎没有,在我踩完各种坑,最终把PDF成型后,打算把经验分享出来,本文通过摘录解释来说明,内容来自本人GitHub itext-pdf

1.2. 配置文件

项目采用了Spring Cloud config所以配置在git上,仅仅研究itext7不需要用到数据库等功能,请直接运行PdfMain类的main方法,即可生成模拟的PDF报告

1.3. 版本POM

itext7相关pom

<properties> <itext.version>7.1.11</itext.version> </properties> <dependencies> <!-- itext7 --> <dependency> <groupId>com.itextpdf</groupId> <artifactId>kernel</artifactId> <version>${itext.version}</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>io</artifactId> <version>${itext.version}</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>layout</artifactId> <version>${itext.version}</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>forms</artifactId> <version>${itext.version}</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>pdfa</artifactId> <version>${itext.version}</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>pdftest</artifactId> <version>${itext.version}</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>font-asian</artifactId> <version>${itext.version}</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.18</version> </dependency> <!--itext7 html转pdf用到的包--> <dependency> <groupId>com.itextpdf</groupId> <artifactId>html2pdf</artifactId> <version>3.0.0</version> </dependency> </dependencies> 1.4. 干货

itext7语义本身和前端css很像,所以有点前端基础还是比较容易掌握的

1.4.1. 添加图片

读取项目中图片文件

设置边距

设置宽高扩大缩小

Image indexImage = new Image(ImageDataFactory.create(GenoReportBuilder.class.getClassLoader().getResource("image/gene.png"))); indexImage.setMargins(-50, -60, -60, -60); indexImage.scale(1, 1.05f); 1.4.2. 添加指定空白页

添加第2页为空白页,立即刷新后再继续添加

pdf.addNewPage(2).flush(); 1.4.3. Div、Paragraph Div div = new Div(); div.setWidth(UnitValue.createPercentValue(100)); div.setHeight(UnitValue.createPercentValue(100)); div.setHorizontalAlignment(HorizontalAlignment.CENTER); Paragraph p1 = new Paragraph(); p1.setHorizontalAlignment(HorizontalAlignment.CENTER); p1.setMaxWidth(UnitValue.createPercentValue(75)); p1.setMarginTop(180f); p1.setCharacterSpacing(0.4f); Style large = new Style(); large.setFontSize(22); large.setFontColor(GenoColor.getThemeColor()); p1.add(new Text("尊敬的 ").addStyle(large)); ... Paragraph p2 = new Paragraph(); ... div.add(p1); div.add(p2);

整块的内容用Div包裹,这里整块包裹的好处是什么?一方面排版分明成体系,另一方面若需求是整块的内容必须在同一个版面,你可以对Div设置div.setKeepTogether(true);,尽量保证若整块的内容超出了一页,那这块内容会自动整块出现在下一页,上一页剩下的就留白了

可以看到Div,Paragraph可以设置很多属性,实际上我们常用的组件除了这两种,还有Table,Cell,List,他们大部分的属性都是一样的,只是部分属性只在部分组件起效果,所以当你设置某个属性没起效果也不用奇怪

Paragraph需要特别注意的一点,想要段落文字居中,不要用setHorizontalAlignment(HorizontalAlignment.CENTER);这是组件的居中对段落无效,甚至对段落里你放Text也无效,需要改用setTextAlignment(TextAlignment.CENTER);

Paragraph段落的行距也是个高频问题,这里给出官方我看到的解释,参考https://itextpdf.com/en/resources/books/itext-7-building-blocks/chapter-4-adding-abstractelement-objects-part-1,搜关键字setFixedLeading,我的理解该方法设值行高绝对值,官方解释是两行文字中间基线之间的距离

如果想了解详细的什么属性哪里能起作用哪里不行,请访问该地址

UTOOLS1590980957507.png

1.4.4. Table

useAllAvailableWidth表示页面有多宽,我就有多宽

table.startNewRow();表示新起一行,table每画一行都要新起一行

同样table内容需要居中,和段落一样,请设置new Cell().setTextAlignment(TextAlignment.CENTER)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyyywx.html