1、简介
2、示例
2.1 引入依赖
<dependency>
<groupId>com.github.librepdf</groupId>
<artifactId>openpdf</artifactId>
<version>1.3.34</version>
</dependency>
<dependency>
<groupId>com.github.librepdf</groupId>
<artifactId>openpdf-fonts-extra</artifactId>
<version>1.3.34</version>
</dependency>
2.2 代码
2.2.1 主程序
String filePath = "/Users/xingyu/Documents/tmp/a.pdf";
FileOutputStream fos = new FileOutputStream(filePath);
PdfWriter pdfWriter = null;
Document document = null;
try {
document = new Document();
document.setPageSize(PageSize.A4);
pdfWriter = PdfWriter.getInstance(document, fos);
document.open();
Image rightTopIcon = getRightTopIcon("4");
document.add(rightTopIcon);
Paragraph titleParagraph = createParagraph("新模版002", FONT_TITLE, Element.ALIGN_CENTER, 0);
document.add(titleParagraph);
ProcessPdfVO processPdf = new ProcessPdfVO();
processPdf.setCompanyName("xxx公司");
processPdf.setCreateTime("2024-05-27");
processPdf.setProcessId("202405270004");
processPdf.setPrintDateTime("2024-05-28 17:25:09");
processPdf.setPrinter("张三");
PdfPTable firstRow = createFirstRow(processPdf);
document.add(firstRow);
PdfPTable mainTable = createMainTable();
PdfPCell cell = new PdfPCell(createParagraph("审批流程", FONT_MAIN_TABLE, Element.ALIGN_CENTER, 0));
cell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
cell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
mainTable.addCell(cell);
PdfPTable subTable = new PdfPTable(2);
subTable.setWidths(new float[]{30,70});
subTable.setWidthPercentage(100);
PdfPCell subCell1 = new PdfPCell(createParagraph("subCell1", FONT_MAIN_TABLE, Element.ALIGN_CENTER, 0));
subCell1.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
subCell1.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
subCell1.setBorder(Cell.BOX);
subTable.addCell(subCell1);
PdfPCell subCell2 = new PdfPCell(createParagraph("subCell2", FONT_MAIN_TABLE, Element.ALIGN_CENTER, 0));
subCell2.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
subCell2.setBorder(Cell.BOX);
subTable.addCell(subCell2);
PdfPCell subCell3 = new PdfPCell(createParagraph("subCell3", FONT_MAIN_TABLE, Element.ALIGN_CENTER, 0));
subCell3.setBorder(Cell.BOX);
subCell3.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
subTable.addCell(subCell3);
PdfPCell subCell4 = new PdfPCell(createParagraph("subCell4", FONT_MAIN_TABLE, Element.ALIGN_CENTER, 0));
subCell4.setBorder(Cell.BOX);
subCell4.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
subTable.addCell(subCell4);
subTable.setComplete(true);
PdfPCell subCell5 = new PdfPCell();
subCell5.setBorder(Cell.BOX);
subCell5.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
subCell5.setPadding(0);
subCell5.addElement(subTable);
mainTable.addCell(subCell5);
mainTable.addCell(new PdfPCell(createParagraph("审批流程1", FONT_MAIN_TABLE, Element.ALIGN_CENTER, 0)));
mainTable.addCell(new PdfPCell(createParagraph("审批流程2", FONT_MAIN_TABLE, Element.ALIGN_CENTER, 0)));
mainTable.addCell(new PdfPCell(createParagraph("审批流程3", FONT_MAIN_TABLE, Element.ALIGN_CENTER, 0)));
mainTable.addCell(subCell5);
mainTable.setComplete(true);
document.add(mainTable);
PdfPTable lastTable = createLastTable(processPdf);
document.add(lastTable);
} finally {
IoUtil.close(document);
IoUtil.close(pdfWriter);
IoUtil.close(fos);
}
2.2.2 表格
private static PdfPTable createMainTable() {
PdfPTable table = new PdfPTable(2);
float[] width = getUnitValues(table.getNumberOfColumns(), new float[]{30f, 70f});
table.setWidths(width);
return table;
}
private static float[] getUnitValues(int columnNum, float[] percents) {
float[] unitValues = new float[columnNum];
for (int i = 0; i < columnNum; i++) {
float percentValue;
if (Objects.nonNull(percents) && columnNum == percents.length) {
percentValue = percents[i];
} else {
percentValue = BigDecimal.valueOf(100)
.divide(BigDecimal.valueOf(columnNum), 10, RoundingMode.HALF_UP)
.floatValue();
}
unitValues[i] = percentValue;
}
return unitValues;
}
2.2.3 单元格
private static PdfPCell createCell(Integer horizontalAlignment, Integer verticalAlignment, Integer border,
Color borderColor) {
PdfPCell cell = new PdfPCell();
if (Objects.nonNull(horizontalAlignment)) {
cell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
}
if (Objects.nonNull(verticalAlignment)) {
cell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
}
if (Objects.nonNull(border)) {
cell.setBorder(border);
}
if (Objects.nonNull(borderColor)) {
cell.setBorderColor(borderColor);
}
return cell;
}
2.2.4 创建单元格
private static PdfPCell createCell(Integer horizontalAlignment, Integer verticalAlignment, Integer border,
Color borderColor) {
PdfPCell cell = new PdfPCell();
if (Objects.nonNull(horizontalAlignment)) {
cell.setHorizontalAlignment(PdfPCell.ALIGN_CENTER);
}
if (Objects.nonNull(verticalAlignment)) {
cell.setVerticalAlignment(PdfPCell.ALIGN_MIDDLE);
}
if (Objects.nonNull(border)) {
cell.setBorder(border);
}
if (Objects.nonNull(borderColor)) {
cell.setBorderColor(borderColor);
}
return cell;
}
2.2.5 图片
private static Image getRightTopIcon(String processStatus) {
Image image = null;
ProcessStatusEnum processStatusEnum = ProcessStatusEnum.getEnum(processStatus);
if (Objects.isNull(processStatusEnum)) {
return image;
}
if (StringUtils.isBlank(processStatusEnum.getIcon())) {
return image;
}
String iconPath = String.format(Locale.ROOT, "%s%s%s", "images", File.separator, processStatusEnum.getIcon());
InputStream is = null;
ByteArrayOutputStream bos = null;
try {
ClassPathResource classPathResource = new ClassPathResource(iconPath);
is = classPathResource.getInputStream();
bos = new ByteArrayOutputStream();
IoUtil.copy(is, bos);
is.close();
image = Image.getInstance(bos.toByteArray());
image.scalePercent(50);
image.setAbsolutePosition(500,700);
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
IoUtil.close(is);
IoUtil.close(bos);
}
return image;
}
2.2.6 预览图