From b90122176a8d7fd42f70a86bf70a7b13729c535a Mon Sep 17 00:00:00 2001 From: wang Date: Mon, 2 Feb 2026 18:18:40 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E6=A8=A1=E7=89=88=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../word/WordApplicationsController.java | 11 +++----- .../module/word/WordCertificateService.java | 24 ++++-------------- .../templates/certificate_template.docx | Bin 141808 -> 142020 bytes 3 files changed, 8 insertions(+), 27 deletions(-) diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/word/WordApplicationsController.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/word/WordApplicationsController.java index 1f94266..41de9ef 100644 --- a/yun-admin/src/main/java/net/lab1024/sa/admin/module/word/WordApplicationsController.java +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/word/WordApplicationsController.java @@ -65,18 +65,13 @@ public class WordApplicationsController { byte[] fileContent; String fileName; String contentType; - - if ("pdf".equalsIgnoreCase(format)) { - // 生成PDF文档 - fileContent = wordCertificateService.generateCertificateAsPdf(certificateData); - fileName = "certificate.pdf"; - contentType = "application/pdf"; - } else { + + // 生成Word文档 fileContent = wordCertificateService.generateCertificate(certificateData); fileName = "certificate.docx"; contentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; - } + // 设置文档响应头 response.setContentType(contentType); diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/word/WordCertificateService.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/word/WordCertificateService.java index 9bb18ab..96467a0 100644 --- a/yun-admin/src/main/java/net/lab1024/sa/admin/module/word/WordCertificateService.java +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/word/WordCertificateService.java @@ -5,14 +5,13 @@ import lombok.Data; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.poi.util.Units; -import org.apache.poi.xwpf.converter.pdf.PdfConverter; -import org.apache.poi.xwpf.converter.pdf.PdfOptions; import org.apache.poi.xwpf.usermodel.ParagraphAlignment; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFParagraph; import org.apache.poi.xwpf.usermodel.XWPFRun; import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.*; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTDrawing; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.STDocProtect; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import org.springframework.util.FileCopyUtils; @@ -45,7 +44,8 @@ public class WordCertificateService { */ public byte[] generateCertificate(CertificateData data) throws Exception { XWPFDocument document = prepareDocument(data); - + // 方法1:设置文档为只读推荐 + document.enforceReadonlyProtection(); // 保存到字节数组 ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); document.write(outputStream); @@ -54,20 +54,6 @@ public class WordCertificateService { return outputStream.toByteArray(); } - /** - * 生成PDF格式的证书 - */ - public byte[] generateCertificateAsPdf(CertificateData data) throws Exception { - XWPFDocument document = prepareDocument(data); - - // 转换为PDF - ByteArrayOutputStream pdfOutputStream = new ByteArrayOutputStream(); - PdfConverter.getInstance().convert(document, pdfOutputStream, PdfOptions.create()); - document.close(); - - return pdfOutputStream.toByteArray(); - } - /** * 准备文档(用于Word或PDF生成) */ @@ -118,8 +104,8 @@ public class WordCertificateService { // 添加新内容 XWPFRun run = paragraph.createRun(); run.setText(text); - run.setFontFamily("宋体"); - run.setFontSize(12); + run.setFontFamily("FangSong_GB2312"); + run.setFontSize(16); } } } diff --git a/yun-admin/src/main/resources/templates/certificate_template.docx b/yun-admin/src/main/resources/templates/certificate_template.docx index 79ced41842842cab27faaaec9b7b736f9cddc270..f10969b6f9f77450d45bfcdfd9b6b8dbf930240f 100644 GIT binary patch delta 6347 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 delta 6147 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⪙MW3#H*7|2u)CPQ;KK7c2Z2sXk?cNiJzrTQ{}kPZ z9bP1eO#G-Q>^)*Xw%Zhx;q}rVlr2nJ!i?pu55`R3RjB=tHid=a=52qeh&@iB#)0sT zr$);bH-}UWP0qw=v`W%hcmTg?+qFeE6ThcOzLp)y^6(P0cfUoRIZ@!1JguH8@ftUSWj1;oyfMUNI9(txJZDb zcp%m+)#Z{8nN5+f-XkZmtN}~~!>>Vckj1Uc$&-t0{*>HKT{c&hNG+|i&oNE@^E4vQ z9fuPtP9{wowcRMw%vJ}Y){76HMY-L0ovtmDX~Beo%Z7vASF^BHw;_3twMA6>jlb3| zJs17DVJasduGx|{_!r`*Wp^_%_8fxQaWb@2iu3Guu&^SX?l)Q?O7av8+7q6ynuMnc z$r7@?+VJZcfn}342NarRQD(D3qMS?yJ}N}2>Quf92SHICk)p?xqd=^+_x6Dne!QQ1 zKLj>!>bf)ek_6HW>2V5_^!7&0;VE|+>3J_tramS{CNPeQSP{77B8jFx6YN!(y+XMq zddSJUk-9~9A#VFPM&woz*eWEjQgF+>~dca5dl%TR3=@UtYKSVqa2d&t86*-cvX~1nDU~0{LW=ufY1u{LE4YTk@e(VkSW%MbHM-aSfYiNioyS zdu!rs01yyg3=lYw_l8CLb&l7F4gMhVnVpzm}XP3-EfP(Jx#PNJ?(Poc{AlP%;%xAlcBH_bCRP&Uc7p z`yBJm`V>AdLsq*WZJg0eI-{&_Na|K1tK}g5K0<*vL1_yuSb|dgYMJV|V|wz@J^EkO{Sr+LltqeGZWd$Ws11cUsHC z?eWj=doeYq9O9ipD!(o+uk?6bl1~srz?#7~#IoACbSkDxbYm$Y1bch3Fg&E|B%^S( z*gCr)Ds$|>p@{u;W<})wq(#7U!>XN?QE=gX@LNrZtR1rN(nfCPc_RbZ)8@S28FF`2 zjfBMSfkZy%wSR4^nJE4skEld&@1{Br!1a zLw<>8U2KJvsq4voA&)+SG3CMx#puv8zAdY;G;j805q6*#k%g-Z;$UHuPcvrLnR3aR zS1$d={a@FTBE(FJRdEXh!2e8Q06dQwMDhm~1wO%w-ZKaOd)M&((-RCG@vqZne`X-w zZ_qIvJf0CG4w9jPk28X}LAEq-6ef_?KiC^?!UTGS_Ad?#&td`zQT#6~{DWi(|7geG z0|=o0voga^nLrZ2Q#cnC#EqFi3;H*rf=@Dnp2M@~K=?TS#J14FbD