Commit 591a74a6 authored by wangxl's avatar wangxl

1

parent 8e46a719
......@@ -20,6 +20,7 @@ public class ProjectInfoToPDF {
/**
* 生成项目申请书和合同书PDF
*
* @param project 项目信息
* @return 生成的PDF文件字节数组
*/
......@@ -27,14 +28,14 @@ public class ProjectInfoToPDF {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Document document = new Document(PageSize.A4);
PdfWriter writer = PdfWriter.getInstance(document, baos);
try {
// 文件水印
String watermark = project.getAppNo();
if (project.getProjState() >= CommonEnum.projState.pass.getCode()) {
watermark = project.getProjNo();
}
// 宋体
BaseFont bfChinese = loadChineseFont("simsun.ttc");
// 仿宋
......@@ -52,14 +53,14 @@ public class ProjectInfoToPDF {
//首页内容
FirstPageInfo(document, project, bfChinese, fsChinese);
// 添加新页面
document.newPage();
// 添加项目内容章节
addSection(document, "一、项目基本情况", boldFont);
addProjectBasicTable(document, project, bfChinese, fsChinese); // 添加项目基本信息表格
// 添加横向页面
document.setPageSize(PageSize.A4.rotate());
document.newPage();
......@@ -77,12 +78,17 @@ public class ProjectInfoToPDF {
// 项目经费预算表
addProjectBudgetTable(document, project, bfChinese, fsChinese);
// 插入申请书正文PDF
if (null != project.getConvertUrl() && !project.getConvertUrl().trim().isEmpty()) {
InsertPdfContent(document, "申请书正文", System.getProperty("user.dir") + project.getConvertUrl(), writer);
if (Objects.nonNull(project.getDownloadUrl())) {
String fileExtName = project.getDownloadUrl().substring(project.getDownloadUrl().lastIndexOf(".") + 1);
if (fileExtName.toLowerCase().equals("pdf")) {
// 插入申请书正文PDF
InsertPdfContent(document, "申请书正文", System.getProperty("user.dir") + project.getDownloadUrl(), writer);
} else {
if (null != project.getConvertUrl() && !project.getConvertUrl().trim().isEmpty()) {
InsertPdfContent(document, "申请书正文", System.getProperty("user.dir") + project.getConvertUrl(), writer);
}
}
}
// 加载项目组成员简历
List<ComProjectMembersDTO> MemberList = project.getMembers();
if (null != MemberList && MemberList.size() > 0) {
......@@ -122,6 +128,7 @@ public class ProjectInfoToPDF {
/**
* 加载中文字体
*
* @param fontName 字体文件名
* @return BaseFont 中文字体
* @throws RuntimeException 加载字体失败时抛出异常
......@@ -161,6 +168,7 @@ public class ProjectInfoToPDF {
/**
* 首页项目信息
*
* @param document
* @param project
* @param bfChinese
......@@ -216,7 +224,7 @@ public class ProjectInfoToPDF {
table.setSpacingBefore(50f); // 增加表格前的间距
table.setSpacingAfter(10f);
table.setHorizontalAlignment(Element.ALIGN_LEFT); // 设置表格左对齐
// 设置列宽度
float[] columnWidths = {0.35f, 0.65f};
table.setWidths(columnWidths);
......@@ -236,6 +244,7 @@ public class ProjectInfoToPDF {
/**
* 添加首页项目表格信息
*
* @param table
* @param label
* @param value
......@@ -250,7 +259,7 @@ public class ProjectInfoToPDF {
labelCell.setHorizontalAlignment(Element.ALIGN_RIGHT);
labelCell.setPaddingRight(5f);
labelCell.setBorder(Rectangle.NO_BORDER);
// 值单元格
Phrase valuePhrase;
if (value != null && !value.trim().isEmpty()) {
......@@ -258,7 +267,7 @@ public class ProjectInfoToPDF {
} else {
valuePhrase = new Phrase(" ", valueFont); // 空值时使用一个空格
}
PdfPCell valueCell = new PdfPCell(valuePhrase);
valueCell.setMinimumHeight(28f);
valueCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
......@@ -266,7 +275,7 @@ public class ProjectInfoToPDF {
valueCell.setPaddingLeft(5f);
valueCell.setPaddingRight(10f);
valueCell.setBorder(Rectangle.NO_BORDER);
// 添加自定义事件来绘制下划线
valueCell.setCellEvent(new PdfPCellEvent() {
public void cellLayout(PdfPCell cell, Rectangle position, PdfContentByte[] canvases) {
......@@ -278,13 +287,14 @@ public class ProjectInfoToPDF {
cb.stroke();
}
});
table.addCell(labelCell);
table.addCell(valueCell);
}
/**
* 项目基本信息
*
* @param document
* @param project
* @param bfChinese
......@@ -305,7 +315,7 @@ public class ProjectInfoToPDF {
PdfPTable personTable = new PdfPTable(9); // 9列,第一列用于标题
float[] personWidths = {1f, 1.5f, 2f, 1f, 2f, 1.5f, 2f, 2f, 2f}; // 调整第一列宽度
personTable.setWidths(personWidths);
// 申请人信息标题行
PdfPCell titleCell = new PdfPCell(new Phrase("申\n请\n人\n信\n息", titleFont));
titleCell.setRowspan(6); // 合并6行
......@@ -313,28 +323,28 @@ public class ProjectInfoToPDF {
titleCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
titleCell.setMinimumHeight(150f); // 调整高度以适应内容
personTable.addCell(titleCell);
// 第一行
addBasicTableCell(personTable, "姓 名", project.getAppPersonName(), 2, labelFont, valueFont);
addBasicTableCell(personTable, "性别", project.getSex(), 2, labelFont, valueFont);
addBasicTableCell(personTable, "出生年月", DateUtils.formatDateRange(project.getBirthday(), 1), 2, labelFont, valueFont);
addBasicTableCell(personTable, "民族", project.getNationName(), 2, labelFont, valueFont);
// 第二行
addBasicTableCell(personTable, "学 位", project.getDegreeName(), 2, labelFont, valueFont);
addBasicTableCell(personTable, "职称", project.getTitleName(), 2, labelFont, valueFont);
addBasicTableCell(personTable, "每年工作时间(月)", project.getJobTime().toString(), 4, labelFont, valueFont);
// 第三行
addBasicTableCell(personTable, "电 话", project.getMobile(), 4, labelFont, valueFont);
addBasicTableCell(personTable, "电子邮箱", project.getEmail(), 4, labelFont, valueFont);
// 第四行
addBasicTableCell(personTable, "个人通讯地址", project.getAddress(), 8, labelFont, valueFont);
// 第五行
addBasicTableCell(personTable, "工作单位", project.getAppUnitName(), 8, labelFont, valueFont);
// 第六行
addBasicTableCell(personTable, "主要研究领域", project.getMainResearchAreas(), 8, labelFont, valueFont);
......@@ -343,12 +353,12 @@ public class ProjectInfoToPDF {
personCell.setPadding(0);
personCell.setBorder(Rectangle.BOX);
mainTable.addCell(personCell);
// 申请单位信息部分
PdfPTable unitTable = new PdfPTable(5); // 5列,第一列用于标题
float[] unitWidths = {1.2f, 3f, 5f, 3f, 5f}; // 调整所有列的比例,保持第一列宽度一致
unitTable.setWidths(unitWidths);
// 申请单位信息标题行
titleCell = new PdfPCell(new Phrase("申\n请\n单\n位\n信\n息", titleFont));
titleCell.setRowspan(5); // 合并5行
......@@ -356,7 +366,7 @@ public class ProjectInfoToPDF {
titleCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
titleCell.setMinimumHeight(100f);
unitTable.addCell(titleCell);
// 单位信息内容
addBasicTableCell(unitTable, "单位名称", project.getAppUnitName(), 4, labelFont, valueFont);
addBasicTableCell(unitTable, "联系人", project.getUnitLinkName(), 2, labelFont, valueFont);
......@@ -369,12 +379,12 @@ public class ProjectInfoToPDF {
unitCell.setPadding(0);
unitCell.setBorder(Rectangle.BOX);
mainTable.addCell(unitCell);
// 项目基本情况部分
PdfPTable projTable = new PdfPTable(5); // 5列,第一列用于标题
float[] projWidths = {1.2f, 3f, 5f, 3f, 5f}; // 与申请单位信息表格使用相同的比例
projTable.setWidths(projWidths);
// 项目基本情况标题行
titleCell = new PdfPCell(new Phrase("项\n目\n基\n本\n信\n息", titleFont));
titleCell.setRowspan(8); // 合并8行
......@@ -382,7 +392,7 @@ public class ProjectInfoToPDF {
titleCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
titleCell.setMinimumHeight(200f);
projTable.addCell(titleCell);
// 项目基本情况内容
addBasicTableCell(projTable, "项目名称", project.getProjName(), 4, labelFont, valueFont);
addBasicTableCell(projTable, "学科代码", project.getKnowledgeName(), 2, labelFont, valueFont);
......@@ -405,6 +415,7 @@ public class ProjectInfoToPDF {
/**
* 添加基本信息表格单元格
*
* @param table
* @param label
* @param value
......@@ -418,7 +429,7 @@ public class ProjectInfoToPDF {
labelCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
labelCell.setHorizontalAlignment(Element.ALIGN_CENTER);
table.addCell(labelCell);
PdfPCell valueCell = new PdfPCell(new Phrase(value != null ? value : "", valueFont));
valueCell.setMinimumHeight(25f);
valueCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
......@@ -429,8 +440,9 @@ public class ProjectInfoToPDF {
/**
* 添加项目组主要成员表格
* @param document PDF文档
* @param project 项目信息
*
* @param document PDF文档
* @param project 项目信息
* @param bfChinese 宋体字体
* @param fsChinese 仿宋字体
* @throws DocumentException
......@@ -438,7 +450,7 @@ public class ProjectInfoToPDF {
private static void addProjectMembersTable(Document document, ComProjectDTO project, BaseFont bfChinese, BaseFont fsChinese) throws DocumentException {
Font titleFont = new Font(bfChinese, 12, Font.BOLD);
Font contentFont = new Font(bfChinese, 12, Font.NORMAL);
// 添加表格标题
Paragraph title = new Paragraph("项目组主要成员", titleFont);
title.add(new Chunk(" (注:不包括项目申请人)", contentFont));
......@@ -449,7 +461,7 @@ public class ProjectInfoToPDF {
// 创建表格
PdfPTable table = new PdfPTable(12); // 12列
table.setWidthPercentage(98);
// 设置列宽度比例
float[] widths = {0.5f, 1f, 1f, 0.8f, 0.8f, 0.8f, 2f, 0.8f, 1.2f, 1f, 1.2f, 1f};
table.setWidths(widths);
......@@ -510,7 +522,7 @@ public class ProjectInfoToPDF {
PdfPTable statsTable = new PdfPTable(7); // 7列
statsTable.setWidthPercentage(98);
statsTable.setSpacingBefore(20f); // 与上表格保持间距
// 设置列宽度比例
float[] statsWidths = {1f, 1f, 1f, 1f, 1f, 1f, 1f};
statsTable.setWidths(statsWidths);
......@@ -539,8 +551,9 @@ public class ProjectInfoToPDF {
/**
* 添加项目绩效目标表
* @param document PDF文档
* @param project 项目信息
*
* @param document PDF文档
* @param project 项目信息
* @param bfChinese 宋体字体
* @param fsChinese 仿宋字体
* @throws DocumentException
......@@ -552,7 +565,7 @@ public class ProjectInfoToPDF {
Font titleFont = new Font(bfChinese, 12, Font.BOLD);
Font contentFont = new Font(bfChinese, 12, Font.NORMAL);
Font wingdng2Font = new Font(WINGDNG2, 12, Font.NORMAL);
// 添加表格标题
Paragraph title = new Paragraph("绩效目标表", titleFont);
title.setAlignment(Element.ALIGN_CENTER);
......@@ -765,6 +778,7 @@ public class ProjectInfoToPDF {
/**
* 项目经费预算表
*
* @param document
* @param project
* @param bfChinese
......@@ -924,28 +938,28 @@ public class ProjectInfoToPDF {
Rectangle pageSize = document.getPageSize();
float width = pageSize.getWidth();
float height = pageSize.getHeight();
// 设置水印字体
canvas.saveState();
canvas.beginText();
canvas.setFontAndSize(baseFont, 30); // 减小字体大小
canvas.setGrayFill(0.9f);
// 计算水印间距
float xStep = width / 2; // 水平间距
float yStep = height / 3; // 垂直间距
// 在页面上添加多个水印
for (float y = yStep/2; y < height; y += yStep) {
for (float x = xStep/2; x < width; x += xStep) {
canvas.showTextAligned(Element.ALIGN_CENTER,
watermarkText,
x,
y,
45);
for (float y = yStep / 2; y < height; y += yStep) {
for (float x = xStep / 2; x < width; x += xStep) {
canvas.showTextAligned(Element.ALIGN_CENTER,
watermarkText,
x,
y,
45);
}
}
canvas.endText();
canvas.restoreState();
......@@ -955,20 +969,20 @@ public class ProjectInfoToPDF {
canvasOver.beginText();
canvasOver.setFontAndSize(baseFont, 12); // 设置页码字体大小
canvasOver.setColorFill(BaseColor.BLACK);
// 页码文本
String text = String.format("第 %d 页", writer.getPageNumber());
// 在页面底部居中添加页码
canvasOver.showTextAligned(Element.ALIGN_CENTER,
text,
width / 2, // 页面中心
15, // 距离底部15单位,降低页码位置
0); // 不旋转
canvasOver.showTextAligned(Element.ALIGN_CENTER,
text,
width / 2, // 页面中心
15, // 距离底部15单位,降低页码位置
0); // 不旋转
canvasOver.endText();
canvasOver.restoreState();
} catch (Exception e) {
e.printStackTrace();
}
......@@ -977,9 +991,10 @@ public class ProjectInfoToPDF {
/**
* 插入PDF文件到指定位置
* @param document 目标文档
*
* @param document 目标文档
* @param titleName 标题名称
* @param pdfPath 要插入的PDF文件路径
* @param pdfPath 要插入的PDF文件路径
* @throws DocumentException
* @throws IOException
*/
......@@ -997,10 +1012,10 @@ public class ProjectInfoToPDF {
// 读取PDF文件内容
byte[] pdfBytes = readPdfToBytes(pdfPath);
// 创建PdfReader
reader = new PdfReader(pdfBytes);
// 获取PDF页数
int totalPages = reader.getNumberOfPages();
......@@ -1021,21 +1036,32 @@ public class ProjectInfoToPDF {
/**
* 加载项目组成员简历
* @param document PDF文档
*
* @param document PDF文档
* @param MemberList 成员列表
* @param writer PDF写入器
* @param writer PDF写入器
*/
private static void LoadProjectMember(Document document, List<ComProjectMembersDTO> MemberList, PdfWriter writer) throws DocumentException, IOException {
// 遍历每个成员的简历
for (ComProjectMembersDTO member : MemberList) {
if (Objects.nonNull(member.getFileId())) {
InsertPdfContent(document, "", System.getProperty("user.dir") + member.getConvertUrl(), writer);
if (Objects.nonNull(member.getDownloadUrl())) {
String fileExtName = member.getDownloadUrl().substring(member.getDownloadUrl().lastIndexOf(".") + 1);
if (fileExtName.toLowerCase().equals("pdf")) {
InsertPdfContent(document, "", System.getProperty("user.dir") + member.getDownloadUrl(), writer);
} else {
if (null != member.getConvertUrl() && !member.getConvertUrl().trim().isEmpty()) {
InsertPdfContent(document, "", System.getProperty("user.dir") + member.getConvertUrl(), writer);
}
}
}
}
}
}
/**
* 读取PDF文件并返回字节数组
*
* @param pdfPath PDF文件路径
* @return 字节数组
*/
......@@ -1044,7 +1070,7 @@ public class ProjectInfoToPDF {
if (!file.exists()) {
throw new FileNotFoundException("PDF文件不存在: " + pdfPath);
}
try (FileInputStream fis = new FileInputStream(file)) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment