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
24f66377
Commit
24f66377
authored
Feb 12, 2025
by
徐俊
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
xujun
parent
87c03d57
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
77 additions
and
56 deletions
+77
-56
ProjectInfoToPDF.java
...main/java/com/yiboshi/science/utils/ProjectInfoToPDF.java
+77
-56
simfang.ttf
science-admin/src/main/resources/fonts/simfang.ttf
+0
-0
No files found.
science-admin/src/main/java/com/yiboshi/science/utils/ProjectInfoToPDF.java
View file @
24f66377
...
...
@@ -6,6 +6,8 @@ import com.yiboshi.science.param.dto.ComProjectDTO;
import
org.springframework.core.io.ClassPathResource
;
import
java.io.*
;
import
java.util.Objects
;
import
java.text.SimpleDateFormat
;
import
java.util.Date
;
public
class
ProjectInfoToPDF
{
...
...
@@ -22,35 +24,16 @@ public class ProjectInfoToPDF {
// 宋体
BaseFont
bfChinese
=
loadChineseFont
(
"/fonts/simsun.ttc"
);
// 仿宋
BaseFont
fsChinese
=
loadChineseFont
(
"/fonts/
方正仿宋简体
.ttf"
);
BaseFont
fsChinese
=
loadChineseFont
(
"/fonts/
simfang
.ttf"
);
Font
labelFont
=
new
Font
(
fsChinese
,
16
,
Font
.
NORMAL
);
Font
valueFont
=
new
Font
(
bfChinese
,
16
,
Font
.
NORMAL
);
Font
normalFont
=
new
Font
(
bfChinese
,
12
,
Font
.
NORMAL
);
Font
boldFont
=
new
Font
(
bfChinese
,
12
,
Font
.
BOLD
);
//首页内容
FirstPageInfo
(
document
,
project
,
bfChinese
);
FirstPageInfo
(
document
,
project
,
bfChinese
,
fsChinese
);
// 添加项目基本信息表格
PdfPTable
table
=
new
PdfPTable
(
2
);
table
.
setWidthPercentage
(
100
);
table
.
setSpacingBefore
(
10
f
);
table
.
setSpacingAfter
(
10
f
);
// 设置列宽度
float
[]
columnWidths
=
{
0.3f
,
0.7f
};
table
.
setWidths
(
columnWidths
);
// 添加表格内容
addTableRow
(
table
,
"项目名称:"
,
project
.
getProjName
(),
labelFont
,
valueFont
);
addTableRow
(
table
,
"项目申报单位:"
,
project
.
getProjNo
(),
labelFont
,
valueFont
);
addTableRow
(
table
,
"申请单位:"
,
project
.
getAppUnitName
(),
labelFont
,
valueFont
);
addTableRow
(
table
,
"项目负责人:"
,
project
.
getAppPersonName
(),
labelFont
,
valueFont
);
addTableRow
(
table
,
"联系电话:"
,
project
.
getMobile
(),
labelFont
,
valueFont
);
addTableRow
(
table
,
"电子邮箱:"
,
project
.
getEmail
(),
labelFont
,
valueFont
);
document
.
add
(
table
);
// 添加新页面
document
.
newPage
();
// 添加项目内容章节
addSection
(
document
,
"一、项目实施目标"
,
boldFont
);
...
...
@@ -86,39 +69,26 @@ public class ProjectInfoToPDF {
private
static
BaseFont
loadChineseFont
(
String
fontPath
)
{
try
{
// 从资源文件夹加载字体
InputStream
fontStream
=
ProjectInfoToPDF
.
class
.
getResourceAsStream
(
fontPath
);
if
(
fontStream
==
null
)
{
throw
new
FileNotFoundException
(
"找不到字体文件:"
+
fontPath
);
}
String
path
=
ProjectInfoToPDF
.
class
.
getResource
(
fontPath
).
getPath
();
// 获取文件名作为临时文件的前缀
String
fileName
=
fontPath
.
substring
(
fontPath
.
lastIndexOf
(
'/'
)
+
1
);
String
prefix
=
fileName
.
substring
(
0
,
fileName
.
lastIndexOf
(
'.'
));
String
suffix
=
fileName
.
substring
(
fileName
.
lastIndexOf
(
'.'
));
// 将字体文件复制到临时文件
File
tempFile
=
File
.
createTempFile
(
prefix
,
suffix
);
tempFile
.
deleteOnExit
();
try
(
FileOutputStream
fos
=
new
FileOutputStream
(
tempFile
))
{
byte
[]
buffer
=
new
byte
[
1024
];
int
length
;
while
((
length
=
fontStream
.
read
(
buffer
))
>
0
)
{
fos
.
write
(
buffer
,
0
,
length
);
}
// 根据字体文件类型使用不同的加载方式
if
(
fontPath
.
toLowerCase
().
endsWith
(
".ttc"
))
{
return
BaseFont
.
createFont
(
path
+
",0"
,
BaseFont
.
IDENTITY_H
,
BaseFont
.
EMBEDDED
);
}
else
{
return
BaseFont
.
createFont
(
path
,
BaseFont
.
IDENTITY_H
,
BaseFont
.
EMBEDDED
);
}
return
BaseFont
.
createFont
(
tempFile
.
getAbsolutePath
()
+
",0"
,
BaseFont
.
IDENTITY_H
,
BaseFont
.
EMBEDDED
);
}
catch
(
Exception
e
)
{
throw
new
RuntimeException
(
"加载字体文件失败,请确保resources目录下存在字体文件 "
+
fontPath
+
":"
+
e
.
getMessage
(),
e
);
}
}
//首页
private
static
Document
FirstPageInfo
(
Document
document
,
ComProjectDTO
project
,
BaseFont
bfChinese
)
throws
DocumentException
{
private
static
Document
FirstPageInfo
(
Document
document
,
ComProjectDTO
project
,
BaseFont
bfChinese
,
BaseFont
fsChinese
)
throws
DocumentException
{
Font
titleFont
=
new
Font
(
bfChinese
,
20
,
Font
.
BOLD
);
Font
normalFont
=
new
Font
(
bfChinese
,
12
,
Font
.
NORMAL
);
Font
labelFont
=
new
Font
(
fsChinese
,
16
,
Font
.
NORMAL
);
Font
valueFont
=
new
Font
(
bfChinese
,
16
,
Font
.
NORMAL
);
// 添加项目编号到左上角
Paragraph
projNo
;
...
...
@@ -146,42 +116,93 @@ public class ProjectInfoToPDF {
projNo
.
add
(
Chunk
.
NEWLINE
);
}
projNo
.
setAlignment
(
Element
.
ALIGN_LEFT
);
projNo
.
setSpacingAfter
(
10
);
projNo
.
setSpacingAfter
(
50
f
);
document
.
add
(
projNo
);
// 添加标题
Paragraph
title
=
new
Paragraph
(
"省级临床医学中心科研项目申请书"
,
titleFont
);
title
.
setAlignment
(
Element
.
ALIGN_CENTER
);
title
.
setSpacingAfter
(
20
);
title
.
setSpacingAfter
(
50
f
);
// 增加标题后的间距
document
.
add
(
title
);
// 添加项目基本信息表格
PdfPTable
table
=
new
PdfPTable
(
2
);
table
.
setWidthPercentage
(
95
);
table
.
setSpacingBefore
(
50
f
);
// 增加表格前的间距
table
.
setSpacingAfter
(
10
f
);
table
.
setHorizontalAlignment
(
Element
.
ALIGN_LEFT
);
// 设置表格左对齐
// 设置列宽度
float
[]
columnWidths
=
{
0.35f
,
0.65f
};
table
.
setWidths
(
columnWidths
);
// 添加表格内容
addTableRow
(
table
,
"项目名称:"
,
project
.
getProjName
(),
labelFont
,
valueFont
);
addTableRow
(
table
,
"申报单位:"
,
project
.
getAppUnitName
(),
labelFont
,
valueFont
);
addTableRow
(
table
,
"推荐部门(丙方):"
,
""
,
labelFont
,
valueFont
);
addTableRow
(
table
,
"项目负责人:"
,
project
.
getAppPersonName
(),
labelFont
,
valueFont
);
addTableRow
(
table
,
"联系电话:"
,
project
.
getMobile
(),
labelFont
,
valueFont
);
addTableRow
(
table
,
"起止年限:"
,
formatDateRange
(
project
.
getStartDate
(),
1
)
+
"至"
+
formatDateRange
(
project
.
getEndDate
(),
1
),
labelFont
,
valueFont
);
addTableRow
(
table
,
"填报日期:"
,
formatDateRange
(
project
.
getCreated
(),
2
),
labelFont
,
valueFont
);
document
.
add
(
table
);
return
document
;
}
//添加表格
/**
* 格式化起止年限
* @param date 开始日期
* @return 格式化后的日期范围字符串
*/
private
static
String
formatDateRange
(
Date
date
,
int
type
)
{
// 定义日期格式
SimpleDateFormat
sdf
;
if
(
type
==
1
)
sdf
=
new
SimpleDateFormat
(
"yyyy年MM月"
);
else
sdf
=
new
SimpleDateFormat
(
"yyyy年MM月dd日"
);
return
sdf
.
format
(
date
);
}
//添加首页项目表格信息
private
static
void
addTableRow
(
PdfPTable
table
,
String
label
,
String
value
,
Font
labelFont
,
Font
valueFont
)
{
// 标签单元格
PdfPCell
labelCell
=
new
PdfPCell
(
new
Phrase
(
label
,
labelFont
));
labelCell
.
setMinimumHeight
(
2
5
f
);
labelCell
.
setMinimumHeight
(
2
8
f
);
labelCell
.
setVerticalAlignment
(
Element
.
ALIGN_MIDDLE
);
labelCell
.
setHorizontalAlignment
(
Element
.
ALIGN_RIGHT
);
labelCell
.
setPaddingRight
(
5
f
);
labelCell
.
setBorder
(
Rectangle
.
NO_BORDER
);
//
创建带下划线的值
Chunk
valueChunk
;
//
值单元格
Phrase
valuePhrase
;
if
(
value
!=
null
&&
!
value
.
trim
().
isEmpty
())
{
value
Chunk
=
new
Chunk
(
value
,
valueFont
);
value
Phrase
=
new
Phrase
(
value
,
valueFont
);
}
else
{
value
Chunk
=
new
Chunk
(
" "
,
valueFont
);
value
Phrase
=
new
Phrase
(
" "
,
valueFont
);
// 空值时使用一个空格
}
valueChunk
.
setUnderline
(
0.1f
,
-
2
f
);
// 添加下划线
PdfPCell
valueCell
=
new
PdfPCell
(
new
Phrase
(
valueChunk
)
);
valueCell
.
setMinimumHeight
(
2
5
f
);
PdfPCell
valueCell
=
new
PdfPCell
(
valuePhrase
);
valueCell
.
setMinimumHeight
(
2
8
f
);
valueCell
.
setVerticalAlignment
(
Element
.
ALIGN_MIDDLE
);
valueCell
.
setHorizontalAlignment
(
Element
.
ALIGN_LEFT
);
// 修改为左对齐
valueCell
.
setPaddingLeft
(
5
f
);
valueCell
.
setPaddingRight
(
10
f
);
valueCell
.
setBorder
(
Rectangle
.
NO_BORDER
);
// 添加自定义事件来绘制下划线
valueCell
.
setCellEvent
(
new
PdfPCellEvent
()
{
public
void
cellLayout
(
PdfPCell
cell
,
Rectangle
position
,
PdfContentByte
[]
canvases
)
{
PdfContentByte
cb
=
canvases
[
PdfPTable
.
LINECANVAS
];
cb
.
setLineWidth
(
0.5f
);
float
y
=
position
.
getBottom
()
+
2
;
// 调整下划线位置
cb
.
moveTo
(
position
.
getLeft
(),
y
);
cb
.
lineTo
(
position
.
getRight
(),
y
);
cb
.
stroke
();
}
});
table
.
addCell
(
labelCell
);
table
.
addCell
(
valueCell
);
}
...
...
science-admin/src/main/resources/fonts/simfang.ttf
View file @
24f66377
No preview for this file type
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