项目需要样式比较复杂,刚开始因为时间比较紧所以采用了Itextpdf插件代码生成pdf ,实话说过程十分繁琐,因为pdf文件样式比较多,表格也比较多,各种的表格,还有就是页眉页脚页码都要自己找页面位置坐标但是又不能像html那样方便更改查看样式,只能改一点导出来看看合适不,然后再改再导出来看。
私下调研了很多,现在罗列一下我所用到的一些样式处理,希望可以帮助需要做这个功能的朋友少踩坑,少尝试,直接出完美pdf报告。
- 封面
- 首页
封面右上角那个图片可以换成logo,我做的大概是这样的一个样子,上代码
//定义 页面大小,以及页边距左右上下
package com.example.demo.controller;
import com.example.demo.config.PDFConfig;
import com.example.demo.utils.PDFBuilder;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.pdf.draw.LineSeparator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* @author hongli.zhang
* @create 2020/5/26 13:02
**/
@RestController
@RequestMapping("/businessApplication/")
public class PdfContrller {
@Autowired
PDFConfig config;//这个是配置类,里面设置了需要用到的字体和logo图片的绝对路径
public static void setImg(PdfWriter writer, String path, float fitWidth, float fitHeight, float absoluteX, float absoluteY) {
try {
Image image = Image.getInstance(path);
image.setAlignment(Image.MIDDLE);
image.scaleToFit(fitWidth, fitHeight);
image.setAbsolutePosition(absoluteX, absoluteY);
writer.getDirectContent().addImage(image);
}catch(Exception e){
}
}
@GetMapping("/test")
public void test(HttpServletRequest requ, HttpServletResponse resp) throws DocumentException {
//设置页面大小为A4纸大小,以及页边距左右上下
Document document = new Document(PageSize.A4, 100F, 100F, 80F, 120F);
PdfWriter writer = null;
try {
FileOutputStream out = new FileOutputStream("E:\\new.pdf");
writer = PdfWriter.getInstance(document, out);
} catch ( IOException | DocumentException e) {
e.printStackTrace();
}
// 定义页眉和页脚页码事件,PDFBuilder代码在后面
PDFBuilder builder = new PDFBuilder();
//设置页面监听事件
writer.setPageEvent(builder);
document.open();
//换行
Paragraph newLine = new Paragraph("\n");
float tableWidthPercentage = 100f; //表格的整体宽度
//表格背景色
BaseColor green = new BaseColor(175, 215, 136);
BaseColor blue = new BaseColor(148, 170, 214);
//图标
setImg(writer, config.getLogo(), 130, 100, document.getPageSize().getRight(230), 700);
//所需字体
String fontPath = config.getCalibri();
String fontBlodPath = config.getCalibrib();
BaseFont bf = null;
BaseFont blodbf = null;
// BaseFont chineseFont = null;
// BaseFont chineseBlodFont = null;
try {
bf = BaseFont.createFont(fontPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
blodbf = BaseFont.createFont(fontBlodPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
// chineseFont = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
} catch (IOException | DocumentException e) {
e.printStackTrace();
}
Font coverFont = new Font(blodbf, 30, Font