因工作上需要决定将itext替换为pdfbox组件,所以在百度后选择使用XEasyPDF重写之前生成pdf的代码。
简易demo如下,希望可以帮助更多人。
public class test {
// 根据自身情况选择对应保存路径
private static final String OUTPUT_PATH = "C:\\Users\\xxx\\Desktop\\x-easypdf.pdf";
private static final String FONT_BOLD = "/font/SimSunBold.ttf";
private static final String FONT = "/font/Songti.ttf";
public static void createPDF() throws IOException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
// 创建文档
XEasyPdfDocument document = XEasyPdfHandler.Document.build();
// 创建页面
XEasyPdfPage page = XEasyPdfHandler.Page.build();
// 创建页面插入图片
XEasyPdfImage image = XEasyPdfHandler.Image.build(new File(MotionBenefitServiceImpl.class.getResource("/img/xxx.png").getFile()));
image.setMarginLeft(30).setMarginTop(20).setHeight(22).setWidth(90);
XEasyPdfHeader header = XEasyPdfHandler.Header.build(image);
header.addComponent(image);
// pdf内容
String titleStr = "xxxxxxxxxxxxxxxxxx";
// 创建文本组件
XEasyPdfText text = XEasyPdfHandler.Text.build(titleStr).setHorizontalStyle(XEasyPdfPositionStyle.CENTER).setFontSize(14).setMarginTop(40).setMarginBottom(10).setFontPath(FONT_BOLD).setNewLine(true);
XEasyPdfText text4 = XEasyPdfHandler.Text.build(p3Str).setFontSize(12).setMarginLeft(60).setMarginRight(60).setMarginTop(10).setMarginBottom(10).setFontPath(FONT);
XEasyPdfText text4_1 = XEasyPdfHandler.Text.build(airVO.getPolicyNo()).setFontSize(12).setMarginLeft(5).setMarginRight(50).setMarginTop(10).setMarginBottom(10).setFontPath(FONT_BOLD).enableTextAppend();
XEasyPdfText text19 = XEasyPdfHandler.Text.build("表头1");
XEasyPdfText text20 = XEasyPdfHandler.Text.build("表头2");
XEasyPdfText text21 = XEasyPdfHandler.Text.build("表头3");
// 将组件添加到页面
XEasyPdfSolidSplitLine solid = XEasyPdfHandler.SplitLine.SolidLine.build();
solid.setMarginTop(20).setMarginBottom(80).setMarginLeft(60).setMarginRight(60).setDefaultFontStyle(XEasyPdfDefaultFontStyle.BOLD);
page.addComponent(image);
//加入实线
page.addComponent(solid);
//加入文本组件
page.addComponent(text).addComponent(text4).addComponent(text4_1);
//表格
XEasyPdfTable table = XEasyPdfHandler.Table.build();
//分母 + 1 为了避免数据条数为基数的情况 分子加一因为有表头多以多一行
int center = (mcdVOs.size() + 1) / 2 + 1;
List<XEasyPdfRow> rowList = new ArrayList<>(center) ;
for(int i = 0; i < center ; i++) {
MonComDataVO firstGroup = null;
MonComDataVO secondGroup = null;
//做数组越界的标识和右列表格数据的下标
int flag = i + center - 2;
if (i != 0){
//左侧表格数据的下标
firstGroup = mcdVOs.get(i - 1);
if (flag < 0 ||flag > mcdVOs.size() - 1){
//基数数据右侧表格为空 放行 对象给空 保证pdf可以展示表格
}else{
secondGroup = mcdVOs.get(flag);
}
}
//创建行
XEasyPdfRow row = XEasyPdfHandler.Table.Row.build();
List<XEasyPdfCell> cellList = new ArrayList<>(center);
//固定7列
for (int j = 0; j < 7 ; j++) {
//创建列
XEasyPdfCell cell = XEasyPdfHandler.Table.Row.Cell.build(80, 20);
if (i == 0){
//第一行设置表头 默认标题
if (j == 0 || j == 4) {
cell.addContent(text19);
} else if (j == 1 || j == 5) {
cell.addContent(text20);
} else if (j == 2 || j == 6) {
cell.addContent(text21);
} else if (j == 3){
cell.setHeight(20 * center).setWidth(50).addContent(null);
}
}else {
//加入数据 分为左右两列 012 左列 、456右列
if (j == 0) {
cell.addContent(
XEasyPdfHandler.Text.build(firstGroup.getStandardMonth())
);
} else if (j == 1) {
cell.addContent(
XEasyPdfHandler.Text.build(firstGroup.getStandardDays())
);
} else if (j == 2) {
cell.addContent(
XEasyPdfHandler.Text.build(firstGroup.isStandardFlag() ? "是" : "否")
);
} else if (j == 3){
cell.addContent(
XEasyPdfHandler.Text.build("")
);
}else if (j == 4){
//避免基数情况出现异常 增加越界判断
if (flag < 0 ||flag >mcdVOs.size()-1){
cell.addContent(
XEasyPdfHandler.Text.build("")
);
}else{
cell.addContent(
XEasyPdfHandler.Text.build(secondGroup.getStandardMonth())
);
}
}else if (j == 5){
if (flag < 0 ||flag >mcdVOs.size()-1){
cell.addContent(
XEasyPdfHandler.Text.build("")
);
}else{
cell.addContent(
XEasyPdfHandler.Text.build(secondGroup.getStandardDays())
);
}
}else if (j == 6){
if (flag < 0 ||flag >mcdVOs.size()-1){
cell.addContent(
XEasyPdfHandler.Text.build("")
);
}else{
cell.addContent(
XEasyPdfHandler.Text.build(secondGroup.isStandardFlag() ? "是" : "否")
);
}
}
}
//第三列合并 除第一行都需要加此属性
if (j == 3) {
cell.setWidth(35);
if (i != 0) {
cell.enableVerticalMerge();
}
}else if(j == 1 || j == 5){
cell.setWidth(60);
}
//给每个表格加居中样式
cell.setFontSize(12).setVerticalStyle(XEasyPdfPositionStyle.CENTER).setHorizontalStyle(XEasyPdfPositionStyle.CENTER);
cellList.add(cell);
}
if (i == 0){
//表格第一行表头加粗
row.addCell(cellList).setHeight(20).setFontPath(FONT_BOLD);
}else{
row.addCell(cellList).setHeight(20).setFontPath(FONT);
}
rowList.add(row);
}
table.addRow(rowList);
table.setMarginLeft(60).setBorderColor(Color.BLACK);
page.addComponent(table);
page.addComponent(text18);
// 将页面添加到文档
document.addPage(page);
// 保存文档并关闭
document.save(OUTPUT_PATH).close();
// ByteArrayOutputStream bos = new ByteArrayOutputStream();
// document.save(bos);
// ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
}
}
大致效果图