From 62efe64940a17f750bd5a6d44f72f72390d6de05 Mon Sep 17 00:00:00 2001 From: dshclm <3321914460@qq.com> Date: Thu, 29 May 2025 16:01:05 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pdf/service/LeavePdfService.java | 48 ++++++++++++---- .../controller/pdf/service/PdfService.java | 52 +++++++++++++----- .../resources/static/file/pdf/smryscb.pdf | Bin 343271 -> 346415 bytes .../templates/system/newdev/apply/edit.html | 1 + 4 files changed, 75 insertions(+), 26 deletions(-) diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/pdf/service/LeavePdfService.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/pdf/service/LeavePdfService.java index 0377c8b7..be3fb2ab 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/pdf/service/LeavePdfService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/pdf/service/LeavePdfService.java @@ -22,6 +22,8 @@ public class LeavePdfService { // 定义最大和最小字体大小,用于动态调整 private static final float MAX_FONT_SIZE = 14; private static final float MIN_FONT_SIZE = 8; + // 预估的字段宽度(根据实际PDF调整) + private static final float ESTIMATED_FIELD_WIDTH = 100f; // 需要特殊处理的字段列表 private static final String[] AUTO_WRAP_FIELDS = { @@ -68,14 +70,23 @@ public class LeavePdfService { // for (PDAnnotationWidget widget : field.getWidgets()) { // widget.setHighlightMode(PDAnnotationWidget.HIGHLIGHT_MODE_NONE); // } - if (fieldValue != null &&!fieldValue.isEmpty()) { + if (fieldValue != null && !fieldValue.isEmpty()) { field.setValue(fieldValue); if (field instanceof PDTextField) { PDTextField textField = (PDTextField) field; if (isAutoWrapField(fieldName)) { - textField.setMultiline(true); - float fontSize = calculateFontSize(fieldValue); - textField.setDefaultAppearance("/" + font.getName() + " " + fontSize + " Tf 0 g"); + // 计算文本在最大字体下的宽度 + float textWidth = calculateTextWidth(fieldValue, font, MAX_FONT_SIZE); + // 如果文本宽度超过预估字段宽度,启用自动换行并调整字体 + if (textWidth > ESTIMATED_FIELD_WIDTH) { + textField.setMultiline(true); + float fontSize = calculateFontSize(fieldValue, font); + textField.setDefaultAppearance("/" + font.getName() + " " + fontSize + " Tf 0 g"); + } else { + // 文本未超出,使用默认字体和不换行 + textField.setMultiline(false); + textField.setDefaultAppearance("/" + font.getName() + " " + MAX_FONT_SIZE + " Tf 0 g"); + } } else { textField.setDefaultAppearance("/" + font.getName() + " 12 Tf 0 g"); } @@ -118,12 +129,12 @@ public class LeavePdfService { if (refField != null) { refField.setReadOnly(true); } - if (refField != null &&!file.isEmpty()) { + if (refField != null && !file.isEmpty()) { // 假设图片插入到第一页,你可以根据实际情况修改 PDPage page = document.getPage(0); // 手动指定图片插入位置 - float x = 440; // 可以根据实际情况调整2 + float x = 440; // 可以根据实际情况调整 float y = 650; // 可以根据实际情况调整 PDImageXObject image = null; @@ -165,13 +176,26 @@ public class LeavePdfService { return false; } - // 计算适应字段的字体大小(仅用于需要特殊处理的字段) - private float calculateFontSize(String fieldValue) { - int textLength = fieldValue.length(); - float fontSize = 10; - if (textLength > 30) { - fontSize = Math.max(MIN_FONT_SIZE, 10 - ((textLength - 30) / 5)); + // 计算文本在指定字体和大小下的宽度 + private float calculateTextWidth(String text, PDType0Font font, float fontSize) throws IOException { + if (text == null || text.isEmpty()) { + return 0; } + // 计算文本宽度,考虑字符间距 + return font.getStringWidth(text) / 1000 * fontSize; + } + + // 计算适应字段的字体大小 + private float calculateFontSize(String fieldValue, PDType0Font font) throws IOException { + float fontSize = MAX_FONT_SIZE; + float textWidth = calculateTextWidth(fieldValue, font, fontSize); + + // 循环降低字体大小直到文本适合预估宽度 + while (textWidth > ESTIMATED_FIELD_WIDTH && fontSize > MIN_FONT_SIZE) { + fontSize -= 0.5f; + textWidth = calculateTextWidth(fieldValue, font, fontSize); + } + return fontSize; } } \ No newline at end of file diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/pdf/service/PdfService.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/pdf/service/PdfService.java index 3bdcc184..b0fd2f8f 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/pdf/service/PdfService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/pdf/service/PdfService.java @@ -20,11 +20,13 @@ import java.util.Map; public class PdfService { // 定义最大和最小字体大小,用于动态调整 - private static final float MAX_FONT_SIZE = 14; + private static final float MAX_FONT_SIZE = 12; private static final float MIN_FONT_SIZE = 8; + // 预估的字段宽度(根据实际PDF调整) + private static final float ESTIMATED_FIELD_WIDTH = 100f; // 需要特殊处理的字段列表 private static final String[] AUTO_WRAP_FIELDS = { - "常住地址", "户籍地址", "户籍地公安机关", "常住地公安机关" + "常住地址", "户籍地址", "户籍地公安机关", "常住地公安机关","姓名","已(拟)任涉密岗位" }; public ByteArrayOutputStream fillForm(Map formData, @@ -68,14 +70,23 @@ public class PdfService { // for (PDAnnotationWidget widget : field.getWidgets()) { // widget.setHighlightMode(PDAnnotationWidget.HIGHLIGHT_MODE_NONE); // } - if (fieldValue != null &&!fieldValue.isEmpty()) { + if (fieldValue != null && !fieldValue.isEmpty()) { field.setValue(fieldValue); if (field instanceof PDTextField) { PDTextField textField = (PDTextField) field; if (isAutoWrapField(fieldName)) { - textField.setMultiline(true); - float fontSize = calculateFontSize(fieldValue); - textField.setDefaultAppearance("/" + font.getName() + " " + fontSize + " Tf 0 g"); + // 计算文本在最大字体下的宽度 + float textWidth = calculateTextWidth(fieldValue, font, MAX_FONT_SIZE); + // 如果文本宽度超过预估字段宽度,启用自动换行并调整字体 + if (textWidth > ESTIMATED_FIELD_WIDTH) { + textField.setMultiline(true); + float fontSize = calculateFontSize(fieldValue, font); + textField.setDefaultAppearance("/" + font.getName() + " " + fontSize + " Tf 0 g"); + } else { + // 文本未超出,使用默认字体和不换行 + textField.setMultiline(false); + textField.setDefaultAppearance("/" + font.getName() + " " + MAX_FONT_SIZE + " Tf 0 g"); + } } else { textField.setDefaultAppearance("/" + font.getName() + " 12 Tf 0 g"); } @@ -118,12 +129,12 @@ public class PdfService { if (refField != null) { refField.setReadOnly(true); } - if (refField != null &&!file.isEmpty()) { + if (refField != null && !file.isEmpty()) { // 假设图片插入到第一页,你可以根据实际情况修改 PDPage page = document.getPage(0); // 手动指定图片插入位置 - float x = 435; // 可以根据实际情况调整2 + float x = 435; // 可以根据实际情况调整 float y = 620; // 可以根据实际情况调整 PDImageXObject image = null; @@ -165,13 +176,26 @@ public class PdfService { return false; } - // 计算适应字段的字体大小(仅用于需要特殊处理的字段) - private float calculateFontSize(String fieldValue) { - int textLength = fieldValue.length(); - float fontSize = 10; - if (textLength > 30) { - fontSize = Math.max(MIN_FONT_SIZE, 10 - ((textLength - 30) / 5)); + // 计算文本在指定字体和大小下的宽度 + private float calculateTextWidth(String text, PDType0Font font, float fontSize) throws IOException { + if (text == null || text.isEmpty()) { + return 0; } + // 计算文本宽度,考虑字符间距 + return font.getStringWidth(text) / 1000 * fontSize; + } + + // 计算适应字段的字体大小 + private float calculateFontSize(String fieldValue, PDType0Font font) throws IOException { + float fontSize = MAX_FONT_SIZE; + float textWidth = calculateTextWidth(fieldValue, font, fontSize); + + // 循环降低字体大小直到文本适合预估宽度 + while (textWidth > ESTIMATED_FIELD_WIDTH && fontSize > MIN_FONT_SIZE) { + fontSize -= 0.5f; + textWidth = calculateTextWidth(fieldValue, font, fontSize); + } + return fontSize; } } \ No newline at end of file diff --git a/ruoyi-admin/src/main/resources/static/file/pdf/smryscb.pdf b/ruoyi-admin/src/main/resources/static/file/pdf/smryscb.pdf index 660ad4287902b73f8d63b065f6cc1cd228fd32d4..c3a5fe7f3f7adc3c22e43abf410bb15c3c2a6157 100644 GIT binary patch delta 3447 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 D*i40M delta 324 zcmZ2KN%Z+okqr@y9EK)_W(Eev29pyQ*D)Gz=4VR#4H7dnF*i1!E+D`tGkNA;UQTlh z1tVhvJyWyE>;Hb`H!;&QH#9a?FtXG$GcY!tdXO<`v*`am7LZ000}BH~u*T^Me2gs9 zPct)eav7R|wVRupPQS;@_yuHuv9Tf807D}Kv+WOA7{9TwgLPXPPyfixC=1d2pOcY; z8>|p$xv{aybRjOrFYG3!dS+&p=F{bQ8MC&Rb2FMs!hO-cMTHTFnShuXh*`F8QDHsK zvwgiS>t-%Sqv^>WtXk6-0trTw>1RAx)om=zEgelv9G%?EER5WY4P2d#9Gy*_TwP2Y m&CJZ4E#2&5?d-UUOA?DpDvDCmxQtB