Skip to content

Commit 1347cc0

Browse files
authored
Merge pull request #93 from Boyuan-IT-Club/Red_Moon
修正照片大小并适当调整照片位置
2 parents 35c0c63 + ccf495c commit 1347cc0

File tree

1 file changed

+98
-53
lines changed

1 file changed

+98
-53
lines changed

src/main/java/club/boyuan/official/utils/PdfExportUtil.java

Lines changed: 98 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
import java.util.Objects;
1818
import java.util.Base64;
1919
import java.io.ByteArrayInputStream;
20+
import java.util.List;
21+
import java.util.ArrayList;
2022

2123
/**
2224
* PDF导出工具类
@@ -61,12 +63,37 @@ public static byte[] exportResumeToPdf(ResumeDTO resumeDTO) throws BusinessExcep
6163
Font normalFont = getFont(10, Font.NORMAL);
6264

6365
try {
66+
// 首先检查是否有照片字段,如果有则在最前面显示
67+
Image photoImage = null;
68+
SimpleResumeFieldDTO photoField = null;
69+
70+
if (resumeDTO.getSimpleFields() != null) {
71+
for (SimpleResumeFieldDTO field : resumeDTO.getSimpleFields()) {
72+
if (isBase64Image(field.getFieldValue())) {
73+
photoImage = createImageFromBase64(field.getFieldValue());
74+
if (photoImage != null) {
75+
photoField = field;
76+
break; // 找到第一张图片就使用
77+
}
78+
}
79+
}
80+
}
81+
6482
// 添加标题
6583
Paragraph title = new Paragraph("个人简历", titleFont);
6684
title.setAlignment(Element.ALIGN_CENTER);
6785
title.setSpacingAfter(20);
6886
document.add(title);
6987

88+
// 如果有照片,在标题下方添加照片
89+
if (photoImage != null) {
90+
// 设置照片居中显示
91+
photoImage.setAlignment(Element.ALIGN_CENTER);
92+
photoImage.setSpacingAfter(15);
93+
document.add(photoImage);
94+
System.out.println("照片已添加到简历顶部,字段: " + photoField.getFieldLabel());
95+
}
96+
7097
// 添加基本信息
7198
PdfPTable infoTable = new PdfPTable(2);
7299
infoTable.setWidthPercentage(100);
@@ -88,65 +115,81 @@ public static byte[] exportResumeToPdf(ResumeDTO resumeDTO) throws BusinessExcep
88115
if (resumeDTO.getSimpleFields() != null && !resumeDTO.getSimpleFields().isEmpty()) {
89116
System.out.println("开始添加简历详情,字段数量: " + resumeDTO.getSimpleFields().size());
90117

91-
Paragraph fieldsTitle = new Paragraph("简历详情", headerFont);
92-
fieldsTitle.setSpacingBefore(20);
93-
fieldsTitle.setSpacingAfter(10);
94-
document.add(fieldsTitle);
95-
96-
PdfPTable fieldsTable = new PdfPTable(2);
97-
fieldsTable.setWidthPercentage(100);
98-
fieldsTable.setWidths(new int[]{1, 3});
99-
100-
// 表头
101-
PdfPCell header1 = new PdfPCell(new Paragraph("字段名称", headerFont));
102-
PdfPCell header2 = new PdfPCell(new Paragraph("字段值", headerFont));
103-
header1.setBorder(Rectangle.BOX);
104-
header2.setBorder(Rectangle.BOX);
105-
header1.setBackgroundColor(BaseColor.LIGHT_GRAY);
106-
header2.setBackgroundColor(BaseColor.LIGHT_GRAY);
107-
fieldsTable.addCell(header1);
108-
fieldsTable.addCell(header2);
109-
110-
// 数据行
118+
// 过滤掉在顶部已显示的照片字段
119+
List<SimpleResumeFieldDTO> filteredFields = new ArrayList<>();
111120
for (SimpleResumeFieldDTO field : resumeDTO.getSimpleFields()) {
112-
String fieldLabel = field.getFieldLabel() != null ? field.getFieldLabel() : "未知字段";
113-
String fieldValue = field.getFieldValue() != null ? field.getFieldValue() : "";
121+
// 如果是照片字段且已经在顶部显示,则跳过
122+
if (isBase64Image(field.getFieldValue()) && photoField != null &&
123+
field.getFieldId() != null && field.getFieldId().equals(photoField.getFieldId())) {
124+
System.out.println("跳过已在顶部显示的照片字段: " + field.getFieldLabel());
125+
continue;
126+
}
127+
filteredFields.add(field);
128+
}
129+
130+
if (!filteredFields.isEmpty()) {
131+
Paragraph fieldsTitle = new Paragraph("简历详情", headerFont);
132+
fieldsTitle.setSpacingBefore(20);
133+
fieldsTitle.setSpacingAfter(10);
134+
document.add(fieldsTitle);
114135

115-
System.out.println("添加字段: " + fieldLabel + " = " +
116-
(isBase64Image(fieldValue) ? "[图片数据]" : fieldValue));
136+
PdfPTable fieldsTable = new PdfPTable(2);
137+
fieldsTable.setWidthPercentage(100);
138+
fieldsTable.setWidths(new int[]{1, 3});
117139

118-
PdfPCell fieldLabelCell = new PdfPCell(new Paragraph(fieldLabel, normalFont));
119-
PdfPCell fieldValueCell;
140+
// 表头
141+
PdfPCell header1 = new PdfPCell(new Paragraph("字段名称", headerFont));
142+
PdfPCell header2 = new PdfPCell(new Paragraph("字段值", headerFont));
143+
header1.setBorder(Rectangle.BOX);
144+
header2.setBorder(Rectangle.BOX);
145+
header1.setBackgroundColor(BaseColor.LIGHT_GRAY);
146+
header2.setBackgroundColor(BaseColor.LIGHT_GRAY);
147+
fieldsTable.addCell(header1);
148+
fieldsTable.addCell(header2);
120149

121-
// 检查是否为Base64图片
122-
if (isBase64Image(fieldValue)) {
123-
Image image = createImageFromBase64(fieldValue);
124-
if (image != null) {
125-
// 使用图片创建单元格
126-
fieldValueCell = new PdfPCell(image, true);
127-
fieldValueCell.setHorizontalAlignment(Element.ALIGN_CENTER);
128-
fieldValueCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
129-
fieldValueCell.setPadding(5f);
130-
System.out.println("成功添加图片到PDF: " + fieldLabel);
150+
// 数据行
151+
for (SimpleResumeFieldDTO field : filteredFields) {
152+
String fieldLabel = field.getFieldLabel() != null ? field.getFieldLabel() : "未知字段";
153+
String fieldValue = field.getFieldValue() != null ? field.getFieldValue() : "";
154+
155+
System.out.println("添加字段: " + fieldLabel + " = " +
156+
(isBase64Image(fieldValue) ? "[图片数据]" : fieldValue));
157+
158+
PdfPCell fieldLabelCell = new PdfPCell(new Paragraph(fieldLabel, normalFont));
159+
PdfPCell fieldValueCell;
160+
161+
// 检查是否为Base64图片
162+
if (isBase64Image(fieldValue)) {
163+
Image image = createImageFromBase64(fieldValue);
164+
if (image != null) {
165+
// 使用图片创建单元格
166+
fieldValueCell = new PdfPCell(image, true);
167+
fieldValueCell.setHorizontalAlignment(Element.ALIGN_CENTER);
168+
fieldValueCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
169+
fieldValueCell.setPadding(5f);
170+
System.out.println("成功添加图片到PDF: " + fieldLabel);
171+
} else {
172+
// 图片转换失败,显示错误信息
173+
fieldValueCell = new PdfPCell(new Paragraph("[图片加载失败]", normalFont));
174+
System.err.println("图片转换失败: " + fieldLabel);
175+
}
131176
} else {
132-
// 图片转换失败,显示错误信息
133-
fieldValueCell = new PdfPCell(new Paragraph("[图片加载失败]", normalFont));
134-
System.err.println("图片转换失败: " + fieldLabel);
177+
// 普通文本字段
178+
fieldValueCell = new PdfPCell(new Paragraph(fieldValue, normalFont));
135179
}
136-
} else {
137-
// 普通文本字段
138-
fieldValueCell = new PdfPCell(new Paragraph(fieldValue, normalFont));
180+
181+
fieldLabelCell.setBorder(Rectangle.BOX);
182+
fieldValueCell.setBorder(Rectangle.BOX);
183+
184+
fieldsTable.addCell(fieldLabelCell);
185+
fieldsTable.addCell(fieldValueCell);
139186
}
140187

141-
fieldLabelCell.setBorder(Rectangle.BOX);
142-
fieldValueCell.setBorder(Rectangle.BOX);
143-
144-
fieldsTable.addCell(fieldLabelCell);
145-
fieldsTable.addCell(fieldValueCell);
188+
document.add(fieldsTable);
189+
System.out.println("添加简历详情成功");
190+
} else {
191+
System.out.println("警告: 简历详情为空或只有照片字段");
146192
}
147-
148-
document.add(fieldsTable);
149-
System.out.println("添加简历详情成功");
150193
} else {
151194
System.out.println("警告: 简历详情为空或没有字段数据");
152195

@@ -298,9 +341,11 @@ private static Image createImageFromBase64(String base64String) {
298341
// 创建Image对象
299342
Image image = Image.getInstance(imageBytes);
300343

301-
// 设置图片大小
302-
float maxWidth = 120f; // 最大宽度
303-
float maxHeight = 120f; // 最大高度
344+
// 设置图片大小为页面的1/6左右
345+
// A4页面宽度约595点,高度约842点
346+
float pageWidth = PageSize.A4.getWidth() - 80; // 减去左右边距
347+
float maxWidth = pageWidth / 6; // 页面宽度的1/6
348+
float maxHeight = maxWidth; // 保持正方形比例
304349

305350
if (image.getWidth() > maxWidth || image.getHeight() > maxHeight) {
306351
image.scaleToFit(maxWidth, maxHeight);

0 commit comments

Comments
 (0)