Itext7生成pdf最全api总结
最近使用itext7生成pdf被折磨到崩溃,一是官方文档不全,网上文章基本都是基于老版本api的,已经完全不适用itext7版本;二是itext7的api和css很像,使用java写css很让人崩溃。把我用到的做一个总结。
显示中文
itext7在使用默认字体显示中文的时候,由于默认字库不支持中文,生成的pdf中的中文会显示空白,要解决这个问题需要自己引入字体。
-
下载一个中文字体,我这里用的是SourceHanSansCN.ttf(只用过ttf文件,不知道是否支持其他字体文件的格式)
-
加载中文字体
InputStream inputStream = new FileInputStream(new File("SourceHanSansCN.ttf")); //第三个参数为embedded,是否为内置字体,这里是自己提供的所以传false PdfFont font = PdfFontFactory.createFont(IOUtils.toByteArray(inputStream), PdfEncodings.IDENTITY_H, false);
-
设置字体
//默认是A4纸大小 Document document = new Document(pdfDocument, new PageSize()); document.setFont(font);
分辨率
大部分情况下,生成的pdf是有打印需求的,打印就涉及到pdf分辨率的问题。在itext中除了插入的图片外其他都是矢量图所以不必担心分辨率的问题,只需要保证插入图片的分辨率即可,在itext中生成图片的分辨率默认是72dpi,这里是需要做一些处理的,如下:
int defaultDpi = 72;
int targetDpi = 300;
Image test = new Image(ImageDataFactory.create("test.jpg"));
test.scale(defaultDpi/targetDpi, defaultDpi/targetDpi);
布局
Itext坐标系如下图,当使用绝对布局的时候需要计算元素距离左侧和下侧的长度,当使用相对布局的时候,元素则是自上往下排列。
绝对布局
setFixedPosition(float left, float bottom, float width)
相对布局
使用相对布局时,不需要setFixedPosition,只需要设置距离上下左右的长度即可,这里感觉有点类似于css了。
setMarginLeft(float value);
setMarginRight(float value);
setMarginBottom(float value);
setMarginTop(float value);
setMargin(float commonMargin);
自动分页+生成页码
在使用绝对布局的时候,大部分情况下页面内容是固定大小的,位置也是固定的,分页也需要自己写代码来进行控制。但是如果pdf的内容不是固定的,这时候如果使用绝对布局就不是那么的灵活了,还需要自己计算元素的高度也设置绝对位置,这个时候我们选择使用相对布局则会更合适、简单一些。代码如下:
class PageEventHandler implements IEventHandler {
private Document document;
private PdfFont font;
//由于需要统一和汉字的字体&#x