每个table中cell都有默认高度,会比实际输入字体高些,此时设置setHeight,若更大没有问题,若高度小于或接近字体大小文字可能就消失了,若想让Cell高度更接近文字高度,请设置Cell的padding,即cell.setPadding(-2),设置负值即可
1.4.5. Tab,\t
itext7中如果要表示段落前的空格,不能使用\t,但换行可以使用\n
若要实现Tab效果可以有多个方法
\u00a0符号,大概7、8个该符号可表示tab,可能不是很准确
p1.add(new Text("\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0壹基因衷心祝愿您身体健康、享受品质生活!"));p1.setFirstLineIndent(24),表示段落前留多少空,需要知道一个字多大,设置成两倍就行
Tab也是集成AbstractElement的组件,通过以下方式也可实现相同的效果
p2.add(new Tab()); p2.addTabStops(new TabStop(20, TabAlignment.LEFT)); 1.4.6. 换页我常用的换页方法为如下,该方法可保证立即换页
doc.add(new AreaBreak(AreaBreakType.NEXT_PAGE));当然PdfDocument有addNewPage其实也可以用,但有时候你没把握好刷新时间可能导致某些混乱
1.4.7. 画图或画文字能画出多么复杂的图形看是谁画了,在我的PDF中,我画的最复杂的图形如下
该图形由多个弧形区域加线段加文字组成,包括数字上的小箭头也是画出来的,画这个的代码过多,想要了解详细的可以自行下载研究,这里介绍API功能
lineTo画线段
roundRectangle可用来画角是弧形的方形,也可以用来画圆
showText用来画文字
以上几种结合填充即可把三角形,多边形画出来了
PdfPage page = pdf.getPage(pdf.getNumberOfPages()); pageSize = pdf.getDefaultPageSize(); PdfCanvas pdfCanvas = new PdfCanvas(page); pdfCanvas.saveState().moveTo(pageSize.getWidth() / 2 - 100 + i * 40, yOffset - 203) .lineTo(pageSize.getWidth() / 2 - 100 + i * 40, yOffset - 208) .stroke().restoreState(); pdfCanvas.setLineWidth(2); pdfCanvas.setStrokeColor(color); pdfCanvas.roundRectangle(pageSize.getWidth() / 2 - 3 + posXOffset, yOffset - 188, 6, 6, 3) .stroke(); pdfCanvas.beginText() .setFontAndSize(font, 12) .moveText(pageSize.getWidth() / 2 - text.length() * 12 / 2, yOffset - 45); pdfCanvas.showText(text); pdfCanvas.endText(); 1.4.8. Html段落转Pdf段落我们可能遇到把一段Html文本转换成itext7的段落放进来,此时需要用到它的htmlToPdf模块,该模块对应POM
<!--itext7 html转pdf用到的包--> <dependency> <groupId>com.itextpdf</groupId> <artifactId>html2pdf</artifactId> <version>3.0.0</version> </dependency>至于使用,设置好配置属性,使用也很简单,通常我们需要支持中文,所有配置如下,字体可以自己换
ConverterProperties proper = new ConverterProperties(); //字体设置,解决中文不显示问题 FontSet fontSet = new FontSet(); fontSet.addFont(GenoReportBuilder.class.getClassLoader().getResource("font/SourceHanSansCN-Regular.ttf").getPath(), PdfEncodings.IDENTITY_H); FontProvider fontProvider = new FontProvider(fontSet); proper.setFontProvider(fontProvider); String content = "html内容"; List<IElement> elements = HtmlConverter.convertToElements(content, proper);转换的内容是IElement集合,而IElement是什么呢?给张图就了解了
也就是说只要你的html内容是<div></div>包裹的,你直接把元素转成itext7的Div然后add到document就可以实现html内容的添加了,当然你也可以用instanceof判断不同内容不同处理
如下是我的处理例子供参考,我把输入html内容样式进行了一定修改后转成itext7组件,这里特别提心,html转过来的itext7组件可能会不支持部分样式的修改,所以需要在html中进行css样式的添加,这里我就把字体和高度统一用css设值了
Div overall = new Div(); java.util.List<IElement> iElements = getFixContent(value); for (IElement iElement : iElements) { Style style = new Style(); style.setFontSize(10); style.setCharacterSpacing(0.7f); if (iElement instanceof Div) { Div div = (Div) iElement; java.util.List<IElement> children = div.getChildren(); // 全部段落改成相同样式 this.addParagraphStyleCircle(style, children); overall.add(div); } else if (iElement instanceof Paragraph) { Paragraph element = (Paragraph) iElement; overall.add(element.addStyle(style)); } } doc.add(overall);