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