From 2422d83af83a1850ceb1202414bf405b720cbd2d Mon Sep 17 00:00:00 2001 From: fengyuan_yang <1976974459@qq.com> Date: Thu, 12 Dec 2024 15:19:32 +0800 Subject: [PATCH] =?UTF-8?q?2024-12-12=20=E5=AF=BC=E5=87=BAWord=EF=BC=8C?= =?UTF-8?q?=E5=B9=B6=E8=BD=ACPDF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 29 +++ .../sys/modules/toWord/test1/Arrears.java | 32 +++ .../sys/modules/toWord/test1/WordTest.java | 84 ++++++++ .../test2/controller/TestWordController.java | 35 ++++ .../toWord/test2/entity/WordEntity.java | 9 + .../toWord/test2/service/TestWordService.java | 11 + .../service/impl/TestWordServiceImpl.java | 75 +++++++ .../toWord/test2/utils/UpDownUtil.java | 178 ++++++++++++++++ .../toWord/test2/utils/WordPDFUtil.java | 195 ++++++++++++++++++ .../resources/mapper/pms/QcReportMapper.xml | 4 + 10 files changed, 652 insertions(+) create mode 100644 src/main/java/com/xujie/sys/modules/toWord/test1/Arrears.java create mode 100644 src/main/java/com/xujie/sys/modules/toWord/test1/WordTest.java create mode 100644 src/main/java/com/xujie/sys/modules/toWord/test2/controller/TestWordController.java create mode 100644 src/main/java/com/xujie/sys/modules/toWord/test2/entity/WordEntity.java create mode 100644 src/main/java/com/xujie/sys/modules/toWord/test2/service/TestWordService.java create mode 100644 src/main/java/com/xujie/sys/modules/toWord/test2/service/impl/TestWordServiceImpl.java create mode 100644 src/main/java/com/xujie/sys/modules/toWord/test2/utils/UpDownUtil.java create mode 100644 src/main/java/com/xujie/sys/modules/toWord/test2/utils/WordPDFUtil.java diff --git a/pom.xml b/pom.xml index 1ef215f9..da967ddf 100644 --- a/pom.xml +++ b/pom.xml @@ -112,6 +112,34 @@ 4.1.2 + + + org.freemarker + freemarker + 2.3.31 + + + + org.xhtmlrenderer + core-renderer + R8 + + + + aspose + words + 15.8.0 + system + ${project.basedir}/jar/aspose-words-16.8.0.jar + + + + org.assertj + assertj-core + + + + org.springframework.boot spring-boot-starter-freemarker @@ -342,6 +370,7 @@ spring-boot-maven-plugin true + true diff --git a/src/main/java/com/xujie/sys/modules/toWord/test1/Arrears.java b/src/main/java/com/xujie/sys/modules/toWord/test1/Arrears.java new file mode 100644 index 00000000..4755c61c --- /dev/null +++ b/src/main/java/com/xujie/sys/modules/toWord/test1/Arrears.java @@ -0,0 +1,32 @@ +package com.xujie.sys.modules.toWord.test1; + +public class Arrears{ + private String name; + private Integer num; + + private String endDay; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Integer getNum() { + return num; + } + + public void setNum(Integer num) { + this.num = num; + } + + public String getEndDay() { + return endDay; + } + + public void setEndDay(String endDay) { + this.endDay = endDay; + } +} diff --git a/src/main/java/com/xujie/sys/modules/toWord/test1/WordTest.java b/src/main/java/com/xujie/sys/modules/toWord/test1/WordTest.java new file mode 100644 index 00000000..55ce45a4 --- /dev/null +++ b/src/main/java/com/xujie/sys/modules/toWord/test1/WordTest.java @@ -0,0 +1,84 @@ +package com.xujie.sys.modules.toWord.test1; + +import freemarker.template.Configuration; +import freemarker.template.Template; +import freemarker.template.TemplateException; +import org.springframework.web.bind.annotation.RestController; +import sun.misc.BASE64Encoder; + +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@RestController +public class WordTest { + + public static void crateWord(Map dataMap, String templateDir, String templateName, String targetFile){ + try (Writer writer = Files.newBufferedWriter(Paths.get(targetFile), StandardCharsets.UTF_8)) { + // 创建并配置FreeMarker配置对象 + Configuration configuration = new Configuration(Configuration.VERSION_2_3_31); + configuration.setDefaultEncoding("UTF-8"); + + // 设置模板加载路径为文件系统上的绝对路径 + configuration.setDirectoryForTemplateLoading(new File(templateDir)); + + // 加载模板 + Template template = configuration.getTemplate(templateName); + + // 渲染模板 + template.process(dataMap, writer); + } catch (IOException | TemplateException e) { + throw new RuntimeException(e); + } + } + + public static String getImageBase64Str(String imgFile) { + try( InputStream in = new FileInputStream(imgFile)) { + byte[] data = new byte[in.available()]; + in.read(data); + BASE64Encoder encoder = new BASE64Encoder(); + return encoder.encode(data); + } catch (FileNotFoundException e) { + throw new RuntimeException(e); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + + private static Map prepareParam(){ + LocalDate currentDate = LocalDate.now(); + List arrList = new ArrayList<>(); + arrList.add(new Arrears(){{setName("白银");setNum(500);setEndDay("三月内");}}); + arrList.add(new Arrears(){{setName("黄金");setNum(100);setEndDay("一年内");}}); + arrList.add(new Arrears(){{setName("只因");setNum(50);setEndDay("两年半");}}); + + + //填充所需要的数据 + Map dataMap = new HashMap<>(); + dataMap.put("person1", "杨奉源"); + dataMap.put("money", "一个亿"); + dataMap.put("year", String.valueOf(currentDate.getYear())); + dataMap.put("month", String.valueOf(currentDate.getMonthValue())); + dataMap.put("day", String.valueOf(currentDate.getDayOfMonth())); + dataMap.put("person2", "张海波"); + dataMap.put("phoneNumber", "135xxxxxxxx"); + dataMap.put("arrList", arrList); + dataMap.put("image1", getImageBase64Str("D:\\ckp-file\\只因你太美.jpeg")); + return dataMap; + } + + public static void main(String[] args) throws IOException { + //准备参数 + Map dataMap = prepareParam(); + crateWord(dataMap,"/ckp-file/","欠条.ftl", "D:\\ckp-file\\qiantiao.doc"); + System.out.println(6666666); + } + +} diff --git a/src/main/java/com/xujie/sys/modules/toWord/test2/controller/TestWordController.java b/src/main/java/com/xujie/sys/modules/toWord/test2/controller/TestWordController.java new file mode 100644 index 00000000..2c3c8874 --- /dev/null +++ b/src/main/java/com/xujie/sys/modules/toWord/test2/controller/TestWordController.java @@ -0,0 +1,35 @@ +package com.xujie.sys.modules.toWord.test2.controller; + +import cn.hutool.core.io.FileUtil; +import com.xujie.sys.modules.toWord.test2.entity.WordEntity; +import com.xujie.sys.modules.toWord.test2.service.TestWordService; +import com.xujie.sys.modules.toWord.test2.utils.UpDownUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.IOException; + +@RestController +@RequestMapping("/testWord/test2") +public class TestWordController { + + @Autowired + private TestWordService testWordService; + + @PostMapping("/exportWordOrPdf") + public void exportWordOrPdf(@RequestBody WordEntity query, HttpServletResponse response) { + try { + File file = testWordService.exportWordOrPdfZIP(query, response); + UpDownUtil.download(file,response); // 将临时文件下载到浏览器 + FileUtil.del(file); // 下载完之后将临时文件删除 + } catch (IOException e) { + System.out.println(e.getMessage()); + } + } + +} diff --git a/src/main/java/com/xujie/sys/modules/toWord/test2/entity/WordEntity.java b/src/main/java/com/xujie/sys/modules/toWord/test2/entity/WordEntity.java new file mode 100644 index 00000000..08e4f8b8 --- /dev/null +++ b/src/main/java/com/xujie/sys/modules/toWord/test2/entity/WordEntity.java @@ -0,0 +1,9 @@ +package com.xujie.sys.modules.toWord.test2.entity; + +import lombok.Data; + +@Data +public class WordEntity { + private String code; + private Boolean isPdf; +} diff --git a/src/main/java/com/xujie/sys/modules/toWord/test2/service/TestWordService.java b/src/main/java/com/xujie/sys/modules/toWord/test2/service/TestWordService.java new file mode 100644 index 00000000..3e1863fd --- /dev/null +++ b/src/main/java/com/xujie/sys/modules/toWord/test2/service/TestWordService.java @@ -0,0 +1,11 @@ +package com.xujie.sys.modules.toWord.test2.service; + +import com.xujie.sys.modules.toWord.test2.entity.WordEntity; + +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.IOException; + +public interface TestWordService { + File exportWordOrPdfZIP(WordEntity query, HttpServletResponse response) throws IOException; +} diff --git a/src/main/java/com/xujie/sys/modules/toWord/test2/service/impl/TestWordServiceImpl.java b/src/main/java/com/xujie/sys/modules/toWord/test2/service/impl/TestWordServiceImpl.java new file mode 100644 index 00000000..49a29cd0 --- /dev/null +++ b/src/main/java/com/xujie/sys/modules/toWord/test2/service/impl/TestWordServiceImpl.java @@ -0,0 +1,75 @@ +package com.xujie.sys.modules.toWord.test2.service.impl; + +import cn.hutool.core.io.FileUtil; +import com.xujie.sys.modules.toWord.test1.Arrears; +import com.xujie.sys.modules.toWord.test2.entity.WordEntity; +import com.xujie.sys.modules.toWord.test2.service.TestWordService; +import com.xujie.sys.modules.toWord.test2.utils.UpDownUtil; +import com.xujie.sys.modules.toWord.test2.utils.WordPDFUtil; +import org.springframework.stereotype.Service; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +public class TestWordServiceImpl implements TestWordService { + + public static final String templateName = "欠条.ftl"; + public static final String templateDir = "/ckp-file/"; + public static final String templatePath = "D:/ckp-file/templates/"; + + @Override + public File exportWordOrPdfZIP(WordEntity queryVo, HttpServletResponse response) throws IOException { + String code = queryVo.getCode(); + boolean isPdf = queryVo.getIsPdf(); + String filePath = ""; + File file = new File(templatePath); // 获取临时的根路径 + // 判断文件路径是否存在 + if (!file.exists()) { + file.mkdirs(); + } + System.out.println("保存的路径=========>>>>>>>" + file.getPath()); + String wordName = file.getPath() + "/" + code + ".doc"; // 设置导出的word的全路径名称 + exportFormatWord(queryVo, code + ".doc"); // 生成word + filePath = wordName; + if (isPdf) { //生成pdf + String pdfName = file.getPath() + "/" + code + ".pdf"; // 设置导出的pdf的全路径名称 + WordPDFUtil.wordConvertPdf(wordName,pdfName); // 将word转成pdf + FileUtil.del(wordName); // 将word文件删除 + filePath = pdfName; + } + return new File(filePath); + } + + /** + * 生成word + */ + public void exportFormatWord(WordEntity query, String code){ + LocalDate currentDate = LocalDate.now(); + List arrList = new ArrayList<>(); + arrList.add(new Arrears(){{setName("白银");setNum(500);setEndDay("三月内");}}); + arrList.add(new Arrears(){{setName("黄金");setNum(100);setEndDay("一年内");}}); + arrList.add(new Arrears(){{setName("只因");setNum(50);setEndDay("两年半");}}); + + //填充所需要的数据 + Map dataMap = new HashMap<>(); + dataMap.put("person1", "杨奉源"); + dataMap.put("money", "一个亿"); + dataMap.put("year", String.valueOf(currentDate.getYear())); + dataMap.put("month", String.valueOf(currentDate.getMonthValue())); + dataMap.put("day", String.valueOf(currentDate.getDayOfMonth())); + dataMap.put("person2", "张海波"); + dataMap.put("phoneNumber", "135xxxxxxxx"); + dataMap.put("arrList", arrList); + dataMap.put("image1", UpDownUtil.getImageBase64Str("D:\\ckp-file\\只因你太美.jpeg")); + dataMap.put("code",code); // 设置页眉 + //生成word文件到临时文件夹下 + WordPDFUtil.exportWord(dataMap, templateDir, templateName, templatePath + code); + } + +} diff --git a/src/main/java/com/xujie/sys/modules/toWord/test2/utils/UpDownUtil.java b/src/main/java/com/xujie/sys/modules/toWord/test2/utils/UpDownUtil.java new file mode 100644 index 00000000..32d36850 --- /dev/null +++ b/src/main/java/com/xujie/sys/modules/toWord/test2/utils/UpDownUtil.java @@ -0,0 +1,178 @@ +package com.xujie.sys.modules.toWord.test2.utils; + +import cn.hutool.core.util.StrUtil; +import sun.misc.BASE64Encoder; + +import javax.imageio.ImageIO; +import javax.servlet.ServletOutputStream; +import javax.servlet.http.HttpServletResponse; +import java.awt.image.BufferedImage; +import java.io.*; +import java.net.URLEncoder; +import java.util.HashMap; +import java.util.Map; + +/** + * 文件上传、下载工具类 + */ +public class UpDownUtil { + + public static String getImageBase64Str(String imgFile) { + try( InputStream in = new FileInputStream(imgFile)) { + byte[] data = new byte[in.available()]; + in.read(data); + BASE64Encoder encoder = new BASE64Encoder(); + return encoder.encode(data); + } catch (FileNotFoundException e) { + throw new RuntimeException(e); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + /** + * 将图片内容转换成Base64编码的字符串 + * @param path 图片文件的全路径名称 + * @return base64字符串和图片宽高 + */ + public static Map getImageBase64String(String path) { + Map map = new HashMap<>(); + if (StrUtil.isEmpty(path)) return null; + + File file = new File(path); + if (!file.exists()) return null; + + InputStream is = null; + InputStream is1 = null; + byte[] data = null; + try { + is = new FileInputStream(file); + is1 = new FileInputStream(file); + data = new byte[is.available()]; + is.read(data); + //获取图片宽高 + BufferedImage image = ImageIO.read(is1); + //图片的原始宽高 + map.put("height",Integer.toString(image.getHeight())); + map.put("width",Integer.toString(image.getWidth())); + is.close(); + is1.close(); + } catch (IOException e) { + e.printStackTrace(); + } + BASE64Encoder encoder = new BASE64Encoder(); + map.put("encode",encoder.encode(data)); + return map; + } + + /** + * 将图片内容转换成Base64编码的字符串,并获得图片宽高,进行缩放 + * @param path 图片文件的全路径名称 + * @param flag 判断图片是否是用户头像 + * @return base64字符串和图片宽高 + */ + public static Map getImageBase64String(String path,boolean flag) { + Map map = new HashMap<>(); + if (StrUtil.isEmpty(path)) return null; + + File file = new File(path); + if (!file.exists()) return null; + + InputStream is = null; + InputStream is1 = null; + byte[] data = null; + try { + is = new FileInputStream(file); + is1 = new FileInputStream(file); + data = new byte[is.available()]; + is.read(data); + //获取图片宽高 + BufferedImage image = ImageIO.read(is1); + //图片的原始宽高 + int height = image.getHeight(); + int width = image.getWidth(); + //如果图片是用户头像的话,按照50*50的标准来判断是否要缩小,否则的话按照500*500 + if (flag){ + //宽或高有一项大于50时,等比缩小 + if (width > 50 || height > 50){ + int cWidth = 50; + int cHeight = 50; + int showWidth = cWidth; + int showHeight = cHeight; + //原图宽高太大进行等比缩放(通过等比缩放,解决图片变形的问题) + if(1.0 * width/height >= 1.0 * cWidth/cHeight){ + //图片比较宽 + showHeight = showWidth * height / width; + }else { + //图片比较长 + showWidth = showHeight * width / height; + } + map.put("height",Integer.toString(showHeight)); + map.put("width",Integer.toString(showWidth)); + }else { + //否则使用图片的原始大小 + map.put("height",Integer.toString(height)); + map.put("width",Integer.toString(width)); + } + }else { + //宽或高大于500时,进行缩放 + if (width > 500 || height > 500){ + int cWidth = 500; + int cHeight = 500; + int showWidth = cWidth; + int showHeight = cHeight; + //原图宽高太大进行等比缩放 + if(1.0 * width/height >= 1.0 * cWidth/cHeight){ + //图片比较宽 + showHeight = showWidth * height / width; + }else { + //图片比较长 + showWidth = showHeight * width / height; + } + map.put("height",Integer.toString(showHeight)); + map.put("width",Integer.toString(showWidth)); + }else { + map.put("height",Integer.toString(height)); + map.put("width",Integer.toString(width)); + } + } + is.close(); + is1.close(); + } catch (IOException e) { + e.printStackTrace(); + } + BASE64Encoder encoder = new BASE64Encoder(); + map.put("encode",encoder.encode(data)); + return map; + } + + public static void download(File file, HttpServletResponse response) throws IOException { + if (file == null || !file.exists()) { + throw new IllegalArgumentException("文件不存在"); + } + //读取缓存1kb + byte[] buffer = new byte[1024]; + FileInputStream fis; + BufferedInputStream bis; + response.setContentType("application/octet-stream"); + response.setHeader("Content-disposition", "attachment; filename=" + new String(file.getName().getBytes("gbk"), "iso8859-1")); + try { + //读取文件 + fis = new FileInputStream(file); + //加缓存 + bis = new BufferedInputStream(fis); + //开始读取 + int i = bis.read(buffer); + //设置输出流 + ServletOutputStream os = response.getOutputStream(); + //开始循环读取 + while (i != -1) { + os.write(buffer, 0, i); + i = bis.read(buffer); + } + fis.close(); + } catch (Exception e) { + throw new RuntimeException(e.getMessage()); + } + } +} diff --git a/src/main/java/com/xujie/sys/modules/toWord/test2/utils/WordPDFUtil.java b/src/main/java/com/xujie/sys/modules/toWord/test2/utils/WordPDFUtil.java new file mode 100644 index 00000000..42ddbad1 --- /dev/null +++ b/src/main/java/com/xujie/sys/modules/toWord/test2/utils/WordPDFUtil.java @@ -0,0 +1,195 @@ +package com.xujie.sys.modules.toWord.test2.utils; + +import cn.hutool.system.OsInfo; +import cn.hutool.system.SystemUtil; +import com.aspose.words.Document; +import com.aspose.words.FontSettings; +import com.aspose.words.License; +import com.aspose.words.SaveFormat; +import com.lowagie.text.DocumentException; +import com.lowagie.text.Image; +import com.lowagie.text.pdf.*; +import freemarker.template.Configuration; +import freemarker.template.Template; +import freemarker.template.TemplateException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.xhtmlrenderer.pdf.ITextFontResolver; +import org.xhtmlrenderer.pdf.ITextRenderer; + +import java.io.*; +import java.net.MalformedURLException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.Map; + +/** + * word、pdf处理工具类 + */ +public class WordPDFUtil { + + protected static Logger logger = LoggerFactory.getLogger(WordPDFUtil.class); + + /** + * 获取破解码文件内容 + */ + public static boolean getLicense() throws IOException { + boolean result = false; + InputStream is = null; + try { + // license.xml应放在..\WebRoot\WEB-INF\classes路径下 + is = WordPDFUtil.class.getClassLoader().getResourceAsStream("static/license.xml"); + License license = new License(); + license.setLicense(is); + result = true; + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (null != is) is.close(); + } + return result; + } + + /** + * 通过模板导出word格式文件 + * + * @param dataMap 导出数据 + * @param templateName 模板名称 + * @param path 导出word的路径以及文件名称 + */ + public static void exportWord(Map dataMap, String templateDir, String templateName, String path) { + try (Writer writer = Files.newBufferedWriter(Paths.get(path), StandardCharsets.UTF_8)) { + // 创建并配置FreeMarker配置对象 + Configuration configuration = new Configuration(Configuration.VERSION_2_3_31); + configuration.setDefaultEncoding("UTF-8"); + + // 设置模板加载路径为文件系统上的绝对路径 + configuration.setDirectoryForTemplateLoading(new File(templateDir)); + + // 加载模板 + Template template = configuration.getTemplate(templateName); + + // 渲染模板 + template.process(dataMap, writer); + } catch (IOException | TemplateException e) { + throw new RuntimeException(e); + } + } + + /** + * word转pdf文件 + * + * @param Address 原文件地址 + * @param pdfAddress 保存的pdf文件地址 + */ + public static void wordConvertPdf(String Address, String pdfAddress) throws IOException { + // 验证License 若不验证则转化出的pdf文档会有水印产生 +// if (!getLicense()) { +// return; +// } + FileOutputStream os = null; + //判断是否windows系统,Linux要读取字体,否则pdf字体为方格 + OsInfo osInfo = SystemUtil.getOsInfo(); + if (osInfo.isLinux()) { + String path = WordPDFUtil.class.getClassLoader().getResource("static/simsun.ttc").getPath(); + FontSettings.getDefaultInstance().setFontsFolder(path, true); + } + try { + // 新建一个空白pdf文档 + File file = new File(pdfAddress); + os = new FileOutputStream(file); + // Address是将要被转化的word文档 + Document doc = new Document(Address); + // 全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF, EPUB, XPS, SWF 相互转换 + doc.save(os, SaveFormat.PDF); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (null != os) + os.close(); + } + } + + /** + * @param htmlString html字符串 + * @param path 生成pdf文件存储路径 + * @param chineseFontPath 中文字体存储路径 + */ + public static void htmlPDF(String htmlString, String path, String chineseFontPath) { + OutputStream os = null; + try { + os = new FileOutputStream(path); + ITextRenderer renderer = new ITextRenderer(); + //html字符串转换模式 + renderer.setDocumentFromString(htmlString); + // 解决中文不显示问题 + ITextFontResolver fontResolver = renderer.getFontResolver(); + fontResolver.addFont(chineseFontPath, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); + renderer.layout(); + renderer.createPDF(os); + } catch (MalformedURLException e) { + logger.warn(e.toString(), e); + } catch (FileNotFoundException e) { + logger.warn(e.toString(), e); + } catch (DocumentException e) { + logger.warn(e.toString(), e); + } catch (IOException e) { + logger.warn(e.toString(), e); + } finally { + if (os != null) { + try { + os.close(); + } catch (IOException e) { + logger.warn(e.toString(), e); + } + } + } + } + + /** + * pdf文件添加图片水印 + * + * @param InPdfFile 要添加水印的pdf路径 + * @param outPdfFile 添加水印完成的pdf输入路径 + * @param markImagePath 添加图片水印的路径 + * @param imgWidth 添加水印X坐标:文件的四个角,左下方的角坐标为(0,0) + * @param imgHeight 添加水印的Y坐标 + */ + public static void addPDFLogo(String InPdfFile, String outPdfFile, String markImagePath, int imgWidth, int imgHeight) throws IOException, DocumentException { + System.out.println("========开始生成水印========>>>>>>" + InPdfFile); + PdfReader reader = new PdfReader(InPdfFile, "PDF".getBytes()); + PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(new File(outPdfFile))); + PdfContentByte under; + PdfGState gs1 = new PdfGState(); + // 透明度设置 + gs1.setFillOpacity(0.8f); + // 插入图片水印 + Image img = Image.getInstance(markImagePath); + // 坐标 + img.setAbsolutePosition(imgWidth, imgHeight); + // 旋转 弧度 + img.setRotation(0); + // 旋转 角度 + img.setRotationDegrees(0); + // 自定义大小 + img.scaleAbsolute(595, 842); + //依照比例缩放 + // img.scalePercent(50); + // 原pdf文件的总页数 + int pageSize = reader.getNumberOfPages(); + for (int i = 1; i <= pageSize; i++) { + // 水印在之前文本下 + under = stamp.getUnderContent(i); + //水印在之前文本上 + // under = stamp.getOverContent(i); + // 图片水印 透明度 + under.setGState(gs1); + // 图片水印 + under.addImage(img); + } + System.out.println("========完成水印生成========>>>>>>" + outPdfFile); + stamp.close();// 关闭 + reader.close(); + } +} diff --git a/src/main/resources/mapper/pms/QcReportMapper.xml b/src/main/resources/mapper/pms/QcReportMapper.xml index a9d4bd35..18648389 100644 --- a/src/main/resources/mapper/pms/QcReportMapper.xml +++ b/src/main/resources/mapper/pms/QcReportMapper.xml @@ -173,6 +173,10 @@ a.disposal_remark, a.inspector_date, a.inspector_no, + isnull(dbo.joint_id(a.site, a.bu_no, a.inspection_no, 'coordination'), '') as operator, + isnull(dbo.joint_name(a.site, a.bu_no, a.inspection_no, 'coordination'), '') as operatorName, + isnull(dbo.joint_id(a.site, a.bu_no, a.inspection_no, 'responsible'), '') as responsiblePerson, + isnull(dbo.joint_name2(a.site, a.bu_no, a.inspection_no, 'responsible'), '') as responsiblePersonName, u.user_display as inspectorName, a.seq_no, a.batch_roll_no,