diff --git a/yxt-common/yxt-common-base/pom.xml b/yxt-common/yxt-common-base/pom.xml index ff5d339..32ddefe 100644 --- a/yxt-common/yxt-common-base/pom.xml +++ b/yxt-common/yxt-common-base/pom.xml @@ -120,12 +120,6 @@ javase 3.3.2 - - - com.itextpdf - itextpdf - 5.4.3 - org.apache.httpcomponents httpclient @@ -165,17 +159,11 @@ hutool-all ${hutool.version} - org.freemarker freemarker 2.3.29 - - com.jacob - jacob - 1.18 - javax.xml.bind jaxb-api @@ -196,6 +184,25 @@ activation 1.1.1 + + com.jacob + jacob + 1.18 + + + com.itextpdf + itextpdf + 5.5.11 + + + com.itextpdf + itext-asian + 5.2.0 + + + org.apache.pdfbox + pdfbox + diff --git a/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/component/DocPdfComponent.java b/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/component/DocPdfComponent.java index df389cc..611e77c 100644 --- a/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/component/DocPdfComponent.java +++ b/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/component/DocPdfComponent.java @@ -35,6 +35,12 @@ public class DocPdfComponent { @Value("${templateUrl.prefixUrl:http://127.0.0.1:8080/template/}") private String prefixTemplateUrl; + @Value("${templateUrl.uploadPdfUrl:http://127.0.0.1:8080/template/pdf/}") + private String uploadPdfUrl; + + @Value("${templateUrl.prefixPdfUrl:http://127.0.0.1:8080/template/pdf/}") + private String prefixPdfUrl; + /** * 根据ftl模板生成word * @@ -170,4 +176,12 @@ public class DocPdfComponent { public String getPrefixTemplateUrl() { return prefixTemplateUrl; } + + public String getUploadPdfUrl() { + return uploadPdfUrl; + } + + public String getPrefixPdfUrl() { + return prefixPdfUrl; + } } diff --git a/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/utils/WordConvertUtils.java b/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/utils/WordConvertUtils.java index 1c38cac..4528fe1 100644 --- a/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/utils/WordConvertUtils.java +++ b/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/utils/WordConvertUtils.java @@ -1,13 +1,20 @@ package com.yxt.common.base.utils; +import com.itextpdf.text.BaseColor; +import com.itextpdf.text.Element; +import com.itextpdf.text.Rectangle; +import com.itextpdf.text.pdf.*; import com.jacob.activeX.ActiveXComponent; import com.jacob.com.ComThread; import com.jacob.com.Dispatch; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.Version; +import org.apache.pdfbox.io.MemoryUsageSetting; +import org.apache.pdfbox.multipdf.PDFMergerUtility; import java.io.*; +import java.util.List; import java.util.Map; /** @@ -138,7 +145,91 @@ public class WordConvertUtils { System.out.println("关闭文档"); // 如果没有这句话,winword.exe进程将不会关闭 ComThread.Release(); + new File(wordFile).delete(); } } + + /** + * @param inputFile 源文件全路径:你的PDF文件地址 + * @param outputFile 输出全路径:添加水印后生成PDF存放的地址 + * @param outDir 添加水印后生成PDF存放的目录 + * @param waterMarkName 你的水印 + * @return 注意:源文件全路径和输出全路径最好不要写同一样的,不然有可能会报“java.io.FileNotFoundException:请求的操作无法在使用用户映射区域打开的文件上执行”的错误 + */ + public static boolean waterMark(String inputFile, String outputFile, String outDir, String waterMarkName) { + try { + File targetFile = new File(outDir); + if (!targetFile.exists()) { + targetFile.mkdirs(); + } + PdfReader reader = new PdfReader(inputFile); + PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(outputFile)); + // 这里的字体设置比较关键,这个设置是支持中文的写法 + BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);// 使用系统字体 + int total = reader.getNumberOfPages() + 1; + PdfContentByte under; + Rectangle pageRect = null; + for (int i = 1; i < total; i++) { + pageRect = stamper.getReader().getPageSizeWithRotation(i); + // 计算水印X,Y坐标 +// float x = pageRect.getWidth() / 10; +// float y = pageRect.getHeight() / 10 - 10; + float x = 290; + float y = 400; + // 获得PDF最顶层 + under = stamper.getOverContent(i); + under.saveState(); + // set Transparency + PdfGState gs = new PdfGState(); + // 设置透明度为0.2 +// gs.setFillOpacity(1.f); + gs.setFillOpacity(0.3f); + under.setGState(gs); + under.restoreState(); + under.beginText(); + under.setFontAndSize(base, 35); +// under.setColorFill(BaseColor.ORANGE); + under.setColorFill(BaseColor.BLACK); + + // 水印文字成45度角倾斜 + under.showTextAligned(Element.ALIGN_CENTER, waterMarkName, x, y, 45); + // 添加水印文字 + under.endText(); + under.setLineWidth(1f); + under.stroke(); + } + stamper.close(); + reader.close(); + new File(inputFile).delete(); + return true; + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * pdf合并 + * + * @param files 源文件的相对路径 + * @param targetPath 输出的pdf的路径 + * @return + * @throws Exception + */ + public static File mulFile2One(List files, String targetPath) throws Exception { + PDFMergerUtility mergePdf = new PDFMergerUtility(); + for (File f : files) { + if (f.exists() && f.isFile()) { + // 循环添加要合并的pdf + mergePdf.addSource(f); + } + } + // 设置合并生成pdf文件名称 + mergePdf.setDestinationFileName(targetPath); + // 合并pdf + mergePdf.mergeDocuments(MemoryUsageSetting.setupMainMemoryOnly()); + //ToDo:根据需求实现是否要删除源文件 + return new File(targetPath); + } } diff --git a/yxt-parent/pom.xml b/yxt-parent/pom.xml index 58a8876..eeabf10 100644 --- a/yxt-parent/pom.xml +++ b/yxt-parent/pom.xml @@ -77,6 +77,8 @@ 4.1.2 6.5.0 + 2.0.25 + @@ -401,56 +403,62 @@ + + org.apache.pdfbox + pdfbox + ${pdfbox.version} + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - nexus-releases - http://nexus3.yyundong.com/repository/yxt-mvn-releases/ - - - nexus-snapshots - http://nexus3.yyundong.com/repository/yxt-mvn-snapshot/ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + nexus-releases + http://nexus3.yyundong.com/repository/yxt-mvn-releases/ + + + nexus-snapshots + http://nexus3.yyundong.com/repository/yxt-mvn-snapshot/ + + \ No newline at end of file