1717import java .util .Objects ;
1818import java .util .Base64 ;
1919import 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