diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java
index 7132a32..b5a67e9 100644
--- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java
+++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java
@@ -33,6 +33,12 @@
* 定制化文件名称
*/
private String customFileName;
+
+
+ /**
+ * 定制化文件名称
+ */
+ private Boolean watermark=false;
/**
* 生成文件名
*/
diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java
index 7132a32..b5a67e9 100644
--- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java
+++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java
@@ -33,6 +33,12 @@
* 定制化文件名称
*/
private String customFileName;
+
+
+ /**
+ * 定制化文件名称
+ */
+ private Boolean watermark=false;
/**
* 生成文件名
*/
diff --git a/casic-metering-service/pom.xml b/casic-metering-service/pom.xml
index f0b0504..8ea0bed 100644
--- a/casic-metering-service/pom.xml
+++ b/casic-metering-service/pom.xml
@@ -84,7 +84,7 @@
com.itextpdf
itextpdf
- 5.0.6
+ 5.5.13
diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java
index 7132a32..b5a67e9 100644
--- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java
+++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java
@@ -33,6 +33,12 @@
* 定制化文件名称
*/
private String customFileName;
+
+
+ /**
+ * 定制化文件名称
+ */
+ private Boolean watermark=false;
/**
* 生成文件名
*/
diff --git a/casic-metering-service/pom.xml b/casic-metering-service/pom.xml
index f0b0504..8ea0bed 100644
--- a/casic-metering-service/pom.xml
+++ b/casic-metering-service/pom.xml
@@ -84,7 +84,7 @@
com.itextpdf
itextpdf
- 5.0.6
+ 5.5.13
diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java
index 9239122..549119e 100644
--- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java
+++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java
@@ -8,7 +8,6 @@
import com.itextpdf.text.*;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
-import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java
index 7132a32..b5a67e9 100644
--- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java
+++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java
@@ -33,6 +33,12 @@
* 定制化文件名称
*/
private String customFileName;
+
+
+ /**
+ * 定制化文件名称
+ */
+ private Boolean watermark=false;
/**
* 生成文件名
*/
diff --git a/casic-metering-service/pom.xml b/casic-metering-service/pom.xml
index f0b0504..8ea0bed 100644
--- a/casic-metering-service/pom.xml
+++ b/casic-metering-service/pom.xml
@@ -84,7 +84,7 @@
com.itextpdf
itextpdf
- 5.0.6
+ 5.5.13
diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java
index 9239122..549119e 100644
--- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java
+++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java
@@ -8,7 +8,6 @@
import com.itextpdf.text.*;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
-import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java
index 7bd876f..f4fd746 100644
--- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java
+++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java
@@ -2,6 +2,7 @@
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.TemplateExportParams;
+import com.casic.missiles.service.listeners.util.PdfUtils;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.config.ConfigureBuilder;
@@ -22,6 +23,7 @@
import com.spire.doc.documents.ShapeType;
import com.spire.doc.fields.ShapeObject;
import org.apache.poi.ss.usermodel.Workbook;
+
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.io.*;
@@ -140,50 +142,10 @@
}
public static void main(String[] args) {
- //加载示例文档
- Document doc = new Document();
- doc.loadFromFile("D:\\casic\\cut\\123.docx");
- //添加艺术字并设置大小
- ShapeObject shape = new ShapeObject(doc, ShapeType.Text_Plain_Text);
- shape.setWidth(60);
- shape.setHeight(20);
- //设置艺术字文本内容、位置及样式
- shape.setVerticalPosition(30);
- shape.setHorizontalPosition(20);
- shape.setRotation(315);
- shape.getWordArt().setFontFamily("黑体");
- shape.getWordArt().setText("长城计量");
- shape.setFillColor(Color.GRAY);
- shape.setLineStyle(ShapeLineStyle.Single);
- shape.setStrokeColor(new Color(192, 192, 192, 255));
- shape.setStrokeWeight(1);
- Section section;
- HeaderFooter header;
- for (int n = 0; n < doc.getSections().getCount(); n++) {
- section = doc.getSections().get(n);
- //获取section的页眉
- header = section.getHeadersFooters().getHeader();
- Paragraph paragraph;
-
- if (header.getParagraphs().getCount() > 0) {
- //如果页眉有段落,取它第一个段落
- paragraph = header.getParagraphs().get(0);
- } else {
- //否则新增加一个段落到页眉
- paragraph = header.addParagraph();
- }
- for (int i = 0; i < 4; i++) {
- for (int j = 0; j < 3; j++) {
- //复制艺术字并设置多行多列位置
- shape = (ShapeObject) shape.deepClone();
- shape.setVerticalPosition(50 + 150 * i);
- shape.setHorizontalPosition(20 + 160 * j);
- paragraph.getChildObjects().add(shape);
- }
- }
- }
- //保存文档
- doc.saveToFile("D:\\casic\\cut\\111.docx", FileFormat.Docx_2013);
+ String path = "D:\\casic\\cut\\";
+ String wordPath = path + "证书审批.docx";
+ String pdfPath = path + "证书审批.pdf";
+ PdfUtils.doc2pdf(wordPath,pdfPath);
}
public static void mainss(String[] args) throws IOException, DocumentException {
diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java
index 7132a32..b5a67e9 100644
--- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java
+++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java
@@ -33,6 +33,12 @@
* 定制化文件名称
*/
private String customFileName;
+
+
+ /**
+ * 定制化文件名称
+ */
+ private Boolean watermark=false;
/**
* 生成文件名
*/
diff --git a/casic-metering-service/pom.xml b/casic-metering-service/pom.xml
index f0b0504..8ea0bed 100644
--- a/casic-metering-service/pom.xml
+++ b/casic-metering-service/pom.xml
@@ -84,7 +84,7 @@
com.itextpdf
itextpdf
- 5.0.6
+ 5.5.13
diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java
index 9239122..549119e 100644
--- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java
+++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java
@@ -8,7 +8,6 @@
import com.itextpdf.text.*;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
-import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java
index 7bd876f..f4fd746 100644
--- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java
+++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java
@@ -2,6 +2,7 @@
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.TemplateExportParams;
+import com.casic.missiles.service.listeners.util.PdfUtils;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.config.ConfigureBuilder;
@@ -22,6 +23,7 @@
import com.spire.doc.documents.ShapeType;
import com.spire.doc.fields.ShapeObject;
import org.apache.poi.ss.usermodel.Workbook;
+
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.io.*;
@@ -140,50 +142,10 @@
}
public static void main(String[] args) {
- //加载示例文档
- Document doc = new Document();
- doc.loadFromFile("D:\\casic\\cut\\123.docx");
- //添加艺术字并设置大小
- ShapeObject shape = new ShapeObject(doc, ShapeType.Text_Plain_Text);
- shape.setWidth(60);
- shape.setHeight(20);
- //设置艺术字文本内容、位置及样式
- shape.setVerticalPosition(30);
- shape.setHorizontalPosition(20);
- shape.setRotation(315);
- shape.getWordArt().setFontFamily("黑体");
- shape.getWordArt().setText("长城计量");
- shape.setFillColor(Color.GRAY);
- shape.setLineStyle(ShapeLineStyle.Single);
- shape.setStrokeColor(new Color(192, 192, 192, 255));
- shape.setStrokeWeight(1);
- Section section;
- HeaderFooter header;
- for (int n = 0; n < doc.getSections().getCount(); n++) {
- section = doc.getSections().get(n);
- //获取section的页眉
- header = section.getHeadersFooters().getHeader();
- Paragraph paragraph;
-
- if (header.getParagraphs().getCount() > 0) {
- //如果页眉有段落,取它第一个段落
- paragraph = header.getParagraphs().get(0);
- } else {
- //否则新增加一个段落到页眉
- paragraph = header.addParagraph();
- }
- for (int i = 0; i < 4; i++) {
- for (int j = 0; j < 3; j++) {
- //复制艺术字并设置多行多列位置
- shape = (ShapeObject) shape.deepClone();
- shape.setVerticalPosition(50 + 150 * i);
- shape.setHorizontalPosition(20 + 160 * j);
- paragraph.getChildObjects().add(shape);
- }
- }
- }
- //保存文档
- doc.saveToFile("D:\\casic\\cut\\111.docx", FileFormat.Docx_2013);
+ String path = "D:\\casic\\cut\\";
+ String wordPath = path + "证书审批.docx";
+ String pdfPath = path + "证书审批.pdf";
+ PdfUtils.doc2pdf(wordPath,pdfPath);
}
public static void mainss(String[] args) throws IOException, DocumentException {
diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java
index bf1108a..0db1dd9 100644
--- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java
+++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java
@@ -24,7 +24,6 @@
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@@ -62,7 +61,7 @@
String wordOldUrl = exportWord(filePrintRegister.getTemDir(), filePrintRegister.getFileName(),
filePrintRegister.getParams(), null, filePrintRegister.getCustomFileName());
//预先生成二维码图片
- getQrCode(filePrintRegister.getTemDir(), filePrintRegister.getCustomFileName(), wordOldUrl);
+ getQrCode(filePrintRegister.getTemDir(), filePrintRegister.getCustomFileName(), wordOldUrl, filePrintRegister);
log.debug("执行完填充参数操作......");
if (CollectionUtils.isNotEmpty(filePrintRegister.getElectronicImageList())) {
try {
@@ -73,7 +72,7 @@
Collectors.groupingBy(ElectronicImage::getKeyWord)
);
log.debug("执行关键字打合成操作,打印配置为{}.......", JSON.toJSON(sameKeyWordSealMaps));
- //3、根据关键字进行添加签章和签字
+// 3、根据关键字进行添加签章和签字
selectSeal = addSameKeyWordStamp(wordOldUrl, sameKeyWordSealMaps);
//获取没有关键字的图片,即绝对路径的图片
List absolutePathImageList = filePrintRegister.getElectronicImageList().stream()
@@ -85,16 +84,25 @@
} catch (Exception ex) {
log.error("关键字异常,异常信息{}", ex);
}
- addWatermark(wordOldUrl);
+ if (filePrintRegister.getWatermark()) {
+ addWatermark(wordOldUrl);
+ }
}
log.debug("执行完路径设置操作");
//如果有骑缝章新增骑缝章
return checkExtendSeal(wordOldUrl, selectSeal, filePrintRegister);
}
- private static void getQrCode(String tempDir, String customFileName, String wordOldUrl) throws IOException {
+ private static void getQrCode(String tempDir, String customFileName, String wordOldUrl, FilePrintRegister filePrintRegister) throws IOException {
String urlPath = StringUtils.isNotEmpty(customFileName) ? customFileName + ".jpg" : "检测.jpg";
- String content = wordOldUrl.replaceAll(".docx", "pdf");
+ String[] split = wordOldUrl.split("\\.");
+ String content="";
+ if (split.length > 1) {
+ content = split[0] + "_" + System.currentTimeMillis() + ".pdf";
+ } else {
+ content = wordOldUrl + System.currentTimeMillis();
+ }
+ filePrintRegister.setQrCode(content);
// 加载模板
OutputStream output = new FileOutputStream(tempDir + urlPath);
QRCodeUtil.getQRCode(tempDir + content, output);
@@ -106,22 +114,21 @@
* @return
*/
private static String checkExtendSeal(String wordOldUrl, ElectronicImage selectSeal, FilePrintRegister filePrintRegister) {
- if (ObjectUtils.isNotEmpty(selectSeal)) {
- //默认转为docx,只需要进行docx的替换即可
- String pdfNewUrl = "";
- if (StringUtils.isEmpty(filePrintRegister.getCustomFileName())) {
- String[] pdfUrl = filePrintRegister.getFileName().split("/.docx");
- pdfNewUrl = pdfUrl[0] + ".pdf";
- } else {
- pdfNewUrl = filePrintRegister.getCustomFileName() + ".pdf";
- }
- String tempPdfUrl = filePrintRegister.getTemDir() + "XH" + pdfNewUrl;
- FilePrintRegisterUtils.wordToPdf(wordOldUrl, tempPdfUrl);
- DocPictureProvider.wordFullSeam(tempPdfUrl, selectSeal.getElectronicSealImageUrl(), filePrintRegister.getTemDir() + pdfNewUrl);
- return filePrintRegister.getTemDir() + pdfNewUrl;
+// if (ObjectUtils.isNotEmpty(selectSeal)) {
+ //默认转为docx,只需要进行docx的替换即可
+ String pdfNewUrl = "";
+ if (StringUtils.isEmpty(filePrintRegister.getCustomFileName())) {
+ String[] pdfUrl = filePrintRegister.getFileName().split("/.docx");
+ pdfNewUrl = pdfUrl[0] + ".pdf";
+ } else {
+ pdfNewUrl = filePrintRegister.getCustomFileName() + ".pdf";
}
-
- return wordOldUrl;
+ String tempPdfUrl = filePrintRegister.getTemDir() + "XH" + pdfNewUrl;
+ FilePrintRegisterUtils.wordToPdf(wordOldUrl, tempPdfUrl);
+ DocPictureProvider.wordFullSeam(tempPdfUrl, selectSeal.getElectronicSealImageUrl(), filePrintRegister.getTemDir() + pdfNewUrl);
+ return filePrintRegister.getTemDir() + pdfNewUrl;
+// }
+// return wordOldUrl;
}
/**
diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java
index 7132a32..b5a67e9 100644
--- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java
+++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java
@@ -33,6 +33,12 @@
* 定制化文件名称
*/
private String customFileName;
+
+
+ /**
+ * 定制化文件名称
+ */
+ private Boolean watermark=false;
/**
* 生成文件名
*/
diff --git a/casic-metering-service/pom.xml b/casic-metering-service/pom.xml
index f0b0504..8ea0bed 100644
--- a/casic-metering-service/pom.xml
+++ b/casic-metering-service/pom.xml
@@ -84,7 +84,7 @@
com.itextpdf
itextpdf
- 5.0.6
+ 5.5.13
diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java
index 9239122..549119e 100644
--- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java
+++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java
@@ -8,7 +8,6 @@
import com.itextpdf.text.*;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
-import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java
index 7bd876f..f4fd746 100644
--- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java
+++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java
@@ -2,6 +2,7 @@
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.TemplateExportParams;
+import com.casic.missiles.service.listeners.util.PdfUtils;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.config.ConfigureBuilder;
@@ -22,6 +23,7 @@
import com.spire.doc.documents.ShapeType;
import com.spire.doc.fields.ShapeObject;
import org.apache.poi.ss.usermodel.Workbook;
+
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.io.*;
@@ -140,50 +142,10 @@
}
public static void main(String[] args) {
- //加载示例文档
- Document doc = new Document();
- doc.loadFromFile("D:\\casic\\cut\\123.docx");
- //添加艺术字并设置大小
- ShapeObject shape = new ShapeObject(doc, ShapeType.Text_Plain_Text);
- shape.setWidth(60);
- shape.setHeight(20);
- //设置艺术字文本内容、位置及样式
- shape.setVerticalPosition(30);
- shape.setHorizontalPosition(20);
- shape.setRotation(315);
- shape.getWordArt().setFontFamily("黑体");
- shape.getWordArt().setText("长城计量");
- shape.setFillColor(Color.GRAY);
- shape.setLineStyle(ShapeLineStyle.Single);
- shape.setStrokeColor(new Color(192, 192, 192, 255));
- shape.setStrokeWeight(1);
- Section section;
- HeaderFooter header;
- for (int n = 0; n < doc.getSections().getCount(); n++) {
- section = doc.getSections().get(n);
- //获取section的页眉
- header = section.getHeadersFooters().getHeader();
- Paragraph paragraph;
-
- if (header.getParagraphs().getCount() > 0) {
- //如果页眉有段落,取它第一个段落
- paragraph = header.getParagraphs().get(0);
- } else {
- //否则新增加一个段落到页眉
- paragraph = header.addParagraph();
- }
- for (int i = 0; i < 4; i++) {
- for (int j = 0; j < 3; j++) {
- //复制艺术字并设置多行多列位置
- shape = (ShapeObject) shape.deepClone();
- shape.setVerticalPosition(50 + 150 * i);
- shape.setHorizontalPosition(20 + 160 * j);
- paragraph.getChildObjects().add(shape);
- }
- }
- }
- //保存文档
- doc.saveToFile("D:\\casic\\cut\\111.docx", FileFormat.Docx_2013);
+ String path = "D:\\casic\\cut\\";
+ String wordPath = path + "证书审批.docx";
+ String pdfPath = path + "证书审批.pdf";
+ PdfUtils.doc2pdf(wordPath,pdfPath);
}
public static void mainss(String[] args) throws IOException, DocumentException {
diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java
index bf1108a..0db1dd9 100644
--- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java
+++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java
@@ -24,7 +24,6 @@
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@@ -62,7 +61,7 @@
String wordOldUrl = exportWord(filePrintRegister.getTemDir(), filePrintRegister.getFileName(),
filePrintRegister.getParams(), null, filePrintRegister.getCustomFileName());
//预先生成二维码图片
- getQrCode(filePrintRegister.getTemDir(), filePrintRegister.getCustomFileName(), wordOldUrl);
+ getQrCode(filePrintRegister.getTemDir(), filePrintRegister.getCustomFileName(), wordOldUrl, filePrintRegister);
log.debug("执行完填充参数操作......");
if (CollectionUtils.isNotEmpty(filePrintRegister.getElectronicImageList())) {
try {
@@ -73,7 +72,7 @@
Collectors.groupingBy(ElectronicImage::getKeyWord)
);
log.debug("执行关键字打合成操作,打印配置为{}.......", JSON.toJSON(sameKeyWordSealMaps));
- //3、根据关键字进行添加签章和签字
+// 3、根据关键字进行添加签章和签字
selectSeal = addSameKeyWordStamp(wordOldUrl, sameKeyWordSealMaps);
//获取没有关键字的图片,即绝对路径的图片
List absolutePathImageList = filePrintRegister.getElectronicImageList().stream()
@@ -85,16 +84,25 @@
} catch (Exception ex) {
log.error("关键字异常,异常信息{}", ex);
}
- addWatermark(wordOldUrl);
+ if (filePrintRegister.getWatermark()) {
+ addWatermark(wordOldUrl);
+ }
}
log.debug("执行完路径设置操作");
//如果有骑缝章新增骑缝章
return checkExtendSeal(wordOldUrl, selectSeal, filePrintRegister);
}
- private static void getQrCode(String tempDir, String customFileName, String wordOldUrl) throws IOException {
+ private static void getQrCode(String tempDir, String customFileName, String wordOldUrl, FilePrintRegister filePrintRegister) throws IOException {
String urlPath = StringUtils.isNotEmpty(customFileName) ? customFileName + ".jpg" : "检测.jpg";
- String content = wordOldUrl.replaceAll(".docx", "pdf");
+ String[] split = wordOldUrl.split("\\.");
+ String content="";
+ if (split.length > 1) {
+ content = split[0] + "_" + System.currentTimeMillis() + ".pdf";
+ } else {
+ content = wordOldUrl + System.currentTimeMillis();
+ }
+ filePrintRegister.setQrCode(content);
// 加载模板
OutputStream output = new FileOutputStream(tempDir + urlPath);
QRCodeUtil.getQRCode(tempDir + content, output);
@@ -106,22 +114,21 @@
* @return
*/
private static String checkExtendSeal(String wordOldUrl, ElectronicImage selectSeal, FilePrintRegister filePrintRegister) {
- if (ObjectUtils.isNotEmpty(selectSeal)) {
- //默认转为docx,只需要进行docx的替换即可
- String pdfNewUrl = "";
- if (StringUtils.isEmpty(filePrintRegister.getCustomFileName())) {
- String[] pdfUrl = filePrintRegister.getFileName().split("/.docx");
- pdfNewUrl = pdfUrl[0] + ".pdf";
- } else {
- pdfNewUrl = filePrintRegister.getCustomFileName() + ".pdf";
- }
- String tempPdfUrl = filePrintRegister.getTemDir() + "XH" + pdfNewUrl;
- FilePrintRegisterUtils.wordToPdf(wordOldUrl, tempPdfUrl);
- DocPictureProvider.wordFullSeam(tempPdfUrl, selectSeal.getElectronicSealImageUrl(), filePrintRegister.getTemDir() + pdfNewUrl);
- return filePrintRegister.getTemDir() + pdfNewUrl;
+// if (ObjectUtils.isNotEmpty(selectSeal)) {
+ //默认转为docx,只需要进行docx的替换即可
+ String pdfNewUrl = "";
+ if (StringUtils.isEmpty(filePrintRegister.getCustomFileName())) {
+ String[] pdfUrl = filePrintRegister.getFileName().split("/.docx");
+ pdfNewUrl = pdfUrl[0] + ".pdf";
+ } else {
+ pdfNewUrl = filePrintRegister.getCustomFileName() + ".pdf";
}
-
- return wordOldUrl;
+ String tempPdfUrl = filePrintRegister.getTemDir() + "XH" + pdfNewUrl;
+ FilePrintRegisterUtils.wordToPdf(wordOldUrl, tempPdfUrl);
+ DocPictureProvider.wordFullSeam(tempPdfUrl, selectSeal.getElectronicSealImageUrl(), filePrintRegister.getTemDir() + pdfNewUrl);
+ return filePrintRegister.getTemDir() + pdfNewUrl;
+// }
+// return wordOldUrl;
}
/**
diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java
index b0a45a0..02ab1bf 100644
--- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java
+++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java
@@ -13,7 +13,6 @@
import com.casic.missiles.utils.QRCodeUtil;
import com.casic.missiles.utils.SpringContextUtil;
import io.minio.MinioClient;
-import liquibase.pro.packaged.E;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Workbook;
@@ -35,10 +34,6 @@
@Slf4j
public class PrintFileRegister extends PrintFileSupport implements FilePrintEnum {
- @Autowired
- private MinioClient minioClient;
- @Autowired
- private MinioUtil minioUtil;
@Value("${minio.bucketName}")
private String bucketName;
@Value("${casic.file.dir}")
@@ -90,7 +85,7 @@
} else {
printDocUrl = populateExcelPrintFile(tempLocalFileDir, filePrintRegister, registerParameters.getCustomFileName());
}
- if (registerParameters.getPdf() && printDocUrl.contains(WORD_SUFFIX)) {
+ if (registerParameters.getPdf() && printDocUrl.contains(WORD_SUFFIX)){
//默认转为docx,只需要进行docx的替换即可
String pdfNewUrl = printDocUrl.replaceAll(WORD_SUFFIX, PDF_SUFFIX);
FilePrintRegisterUtils.wordToPdf(printDocUrl, pdfNewUrl);
diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java
index 7132a32..b5a67e9 100644
--- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java
+++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java
@@ -33,6 +33,12 @@
* 定制化文件名称
*/
private String customFileName;
+
+
+ /**
+ * 定制化文件名称
+ */
+ private Boolean watermark=false;
/**
* 生成文件名
*/
diff --git a/casic-metering-service/pom.xml b/casic-metering-service/pom.xml
index f0b0504..8ea0bed 100644
--- a/casic-metering-service/pom.xml
+++ b/casic-metering-service/pom.xml
@@ -84,7 +84,7 @@
com.itextpdf
itextpdf
- 5.0.6
+ 5.5.13
diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java
index 9239122..549119e 100644
--- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java
+++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java
@@ -8,7 +8,6 @@
import com.itextpdf.text.*;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
-import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java
index 7bd876f..f4fd746 100644
--- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java
+++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java
@@ -2,6 +2,7 @@
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.TemplateExportParams;
+import com.casic.missiles.service.listeners.util.PdfUtils;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.deepoove.poi.config.ConfigureBuilder;
@@ -22,6 +23,7 @@
import com.spire.doc.documents.ShapeType;
import com.spire.doc.fields.ShapeObject;
import org.apache.poi.ss.usermodel.Workbook;
+
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.io.*;
@@ -140,50 +142,10 @@
}
public static void main(String[] args) {
- //加载示例文档
- Document doc = new Document();
- doc.loadFromFile("D:\\casic\\cut\\123.docx");
- //添加艺术字并设置大小
- ShapeObject shape = new ShapeObject(doc, ShapeType.Text_Plain_Text);
- shape.setWidth(60);
- shape.setHeight(20);
- //设置艺术字文本内容、位置及样式
- shape.setVerticalPosition(30);
- shape.setHorizontalPosition(20);
- shape.setRotation(315);
- shape.getWordArt().setFontFamily("黑体");
- shape.getWordArt().setText("长城计量");
- shape.setFillColor(Color.GRAY);
- shape.setLineStyle(ShapeLineStyle.Single);
- shape.setStrokeColor(new Color(192, 192, 192, 255));
- shape.setStrokeWeight(1);
- Section section;
- HeaderFooter header;
- for (int n = 0; n < doc.getSections().getCount(); n++) {
- section = doc.getSections().get(n);
- //获取section的页眉
- header = section.getHeadersFooters().getHeader();
- Paragraph paragraph;
-
- if (header.getParagraphs().getCount() > 0) {
- //如果页眉有段落,取它第一个段落
- paragraph = header.getParagraphs().get(0);
- } else {
- //否则新增加一个段落到页眉
- paragraph = header.addParagraph();
- }
- for (int i = 0; i < 4; i++) {
- for (int j = 0; j < 3; j++) {
- //复制艺术字并设置多行多列位置
- shape = (ShapeObject) shape.deepClone();
- shape.setVerticalPosition(50 + 150 * i);
- shape.setHorizontalPosition(20 + 160 * j);
- paragraph.getChildObjects().add(shape);
- }
- }
- }
- //保存文档
- doc.saveToFile("D:\\casic\\cut\\111.docx", FileFormat.Docx_2013);
+ String path = "D:\\casic\\cut\\";
+ String wordPath = path + "证书审批.docx";
+ String pdfPath = path + "证书审批.pdf";
+ PdfUtils.doc2pdf(wordPath,pdfPath);
}
public static void mainss(String[] args) throws IOException, DocumentException {
diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java
index bf1108a..0db1dd9 100644
--- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java
+++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java
@@ -24,7 +24,6 @@
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@@ -62,7 +61,7 @@
String wordOldUrl = exportWord(filePrintRegister.getTemDir(), filePrintRegister.getFileName(),
filePrintRegister.getParams(), null, filePrintRegister.getCustomFileName());
//预先生成二维码图片
- getQrCode(filePrintRegister.getTemDir(), filePrintRegister.getCustomFileName(), wordOldUrl);
+ getQrCode(filePrintRegister.getTemDir(), filePrintRegister.getCustomFileName(), wordOldUrl, filePrintRegister);
log.debug("执行完填充参数操作......");
if (CollectionUtils.isNotEmpty(filePrintRegister.getElectronicImageList())) {
try {
@@ -73,7 +72,7 @@
Collectors.groupingBy(ElectronicImage::getKeyWord)
);
log.debug("执行关键字打合成操作,打印配置为{}.......", JSON.toJSON(sameKeyWordSealMaps));
- //3、根据关键字进行添加签章和签字
+// 3、根据关键字进行添加签章和签字
selectSeal = addSameKeyWordStamp(wordOldUrl, sameKeyWordSealMaps);
//获取没有关键字的图片,即绝对路径的图片
List absolutePathImageList = filePrintRegister.getElectronicImageList().stream()
@@ -85,16 +84,25 @@
} catch (Exception ex) {
log.error("关键字异常,异常信息{}", ex);
}
- addWatermark(wordOldUrl);
+ if (filePrintRegister.getWatermark()) {
+ addWatermark(wordOldUrl);
+ }
}
log.debug("执行完路径设置操作");
//如果有骑缝章新增骑缝章
return checkExtendSeal(wordOldUrl, selectSeal, filePrintRegister);
}
- private static void getQrCode(String tempDir, String customFileName, String wordOldUrl) throws IOException {
+ private static void getQrCode(String tempDir, String customFileName, String wordOldUrl, FilePrintRegister filePrintRegister) throws IOException {
String urlPath = StringUtils.isNotEmpty(customFileName) ? customFileName + ".jpg" : "检测.jpg";
- String content = wordOldUrl.replaceAll(".docx", "pdf");
+ String[] split = wordOldUrl.split("\\.");
+ String content="";
+ if (split.length > 1) {
+ content = split[0] + "_" + System.currentTimeMillis() + ".pdf";
+ } else {
+ content = wordOldUrl + System.currentTimeMillis();
+ }
+ filePrintRegister.setQrCode(content);
// 加载模板
OutputStream output = new FileOutputStream(tempDir + urlPath);
QRCodeUtil.getQRCode(tempDir + content, output);
@@ -106,22 +114,21 @@
* @return
*/
private static String checkExtendSeal(String wordOldUrl, ElectronicImage selectSeal, FilePrintRegister filePrintRegister) {
- if (ObjectUtils.isNotEmpty(selectSeal)) {
- //默认转为docx,只需要进行docx的替换即可
- String pdfNewUrl = "";
- if (StringUtils.isEmpty(filePrintRegister.getCustomFileName())) {
- String[] pdfUrl = filePrintRegister.getFileName().split("/.docx");
- pdfNewUrl = pdfUrl[0] + ".pdf";
- } else {
- pdfNewUrl = filePrintRegister.getCustomFileName() + ".pdf";
- }
- String tempPdfUrl = filePrintRegister.getTemDir() + "XH" + pdfNewUrl;
- FilePrintRegisterUtils.wordToPdf(wordOldUrl, tempPdfUrl);
- DocPictureProvider.wordFullSeam(tempPdfUrl, selectSeal.getElectronicSealImageUrl(), filePrintRegister.getTemDir() + pdfNewUrl);
- return filePrintRegister.getTemDir() + pdfNewUrl;
+// if (ObjectUtils.isNotEmpty(selectSeal)) {
+ //默认转为docx,只需要进行docx的替换即可
+ String pdfNewUrl = "";
+ if (StringUtils.isEmpty(filePrintRegister.getCustomFileName())) {
+ String[] pdfUrl = filePrintRegister.getFileName().split("/.docx");
+ pdfNewUrl = pdfUrl[0] + ".pdf";
+ } else {
+ pdfNewUrl = filePrintRegister.getCustomFileName() + ".pdf";
}
-
- return wordOldUrl;
+ String tempPdfUrl = filePrintRegister.getTemDir() + "XH" + pdfNewUrl;
+ FilePrintRegisterUtils.wordToPdf(wordOldUrl, tempPdfUrl);
+ DocPictureProvider.wordFullSeam(tempPdfUrl, selectSeal.getElectronicSealImageUrl(), filePrintRegister.getTemDir() + pdfNewUrl);
+ return filePrintRegister.getTemDir() + pdfNewUrl;
+// }
+// return wordOldUrl;
}
/**
diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java
index b0a45a0..02ab1bf 100644
--- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java
+++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java
@@ -13,7 +13,6 @@
import com.casic.missiles.utils.QRCodeUtil;
import com.casic.missiles.utils.SpringContextUtil;
import io.minio.MinioClient;
-import liquibase.pro.packaged.E;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Workbook;
@@ -35,10 +34,6 @@
@Slf4j
public class PrintFileRegister extends PrintFileSupport implements FilePrintEnum {
- @Autowired
- private MinioClient minioClient;
- @Autowired
- private MinioUtil minioUtil;
@Value("${minio.bucketName}")
private String bucketName;
@Value("${casic.file.dir}")
@@ -90,7 +85,7 @@
} else {
printDocUrl = populateExcelPrintFile(tempLocalFileDir, filePrintRegister, registerParameters.getCustomFileName());
}
- if (registerParameters.getPdf() && printDocUrl.contains(WORD_SUFFIX)) {
+ if (registerParameters.getPdf() && printDocUrl.contains(WORD_SUFFIX)){
//默认转为docx,只需要进行docx的替换即可
String pdfNewUrl = printDocUrl.replaceAll(WORD_SUFFIX, PDF_SUFFIX);
FilePrintRegisterUtils.wordToPdf(printDocUrl, pdfNewUrl);
diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/util/PdfUtils.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/util/PdfUtils.java
index b9b4054..edd6aaf 100644
--- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/util/PdfUtils.java
+++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/util/PdfUtils.java
@@ -4,12 +4,19 @@
import com.aspose.words.Document;
import com.aspose.words.License;
import com.aspose.words.SaveFormat;
+import com.casic.missiles.dto.business.certificate.ElectronicImage;
+import com.itextpdf.text.Image;
+import com.itextpdf.text.pdf.*;
+import com.itextpdf.text.pdf.parser.*;
+import lombok.extern.slf4j.Slf4j;
+import com.itextpdf.awt.geom.Rectangle2D.Float;
-import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.InputStream;
+import java.io.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+@Slf4j
public class PdfUtils {
@@ -55,5 +62,292 @@
e.printStackTrace();
}
}
+
+
+ /**
+ * pdf插入电子印章水印
+ *
+ * @param templatePath 原pdf文件路径
+ */
+ public static void imageWaterMark(Map> sameKeyWordSealMaps, String templatePath) {
+
+ try {
+ File pdfFile = new File(templatePath);
+ byte[] pdfData = new byte[(int) pdfFile.length()];
+ FileInputStream inputStream = null;
+ try {
+ inputStream = new FileInputStream(pdfFile);
+ inputStream.read(pdfData);
+ } catch (IOException e) {
+ log.error("PDF读流异常:" + e);
+ } finally {
+ if (inputStream != null) {
+ try {
+ inputStream.close();
+ } catch (IOException e) {
+ log.error("IO流关闭发生异常:" + e);
+ }
+ }
+ }
+ //指定关键字
+// String keyword = "计算机";
+ for (Map.Entry> entry : sameKeyWordSealMaps.entrySet()) {
+ List positions = findKeywordPostions(pdfData, entry.getKey());
+ InputStream input = new FileInputStream(templatePath);
+ if (positions != null && positions.size() > 0) {
+ log.info("发现关键字总条数:" + positions.size());
+ log.info("最后一次出现关键字的位置信息:页码=" + (int) positions.get(positions.size() - 1)[0] +
+ ",X轴=" + positions.get(positions.size() - 1)[1] + ",Y轴=" + positions.get(positions.size() - 1)[2]);
+ List electronicSealList = entry.getValue();
+ for (ElectronicImage electronicImage : electronicSealList) {
+ PdfImage(templatePath, input, electronicImage.getSealImageUrlsDir(), (int) positions.get(positions.size() - 1)[1],
+ (int) positions.get(positions.size() - 1)[2], (int) positions.get(positions.size() - 1)[0]);
+ }
+ } else {
+ log.info("未发现关键字信息");
+ }
+ }
+ } catch (Exception e) {
+ log.error("PDF插入图片发生意外异常:" + e);
+ }
+
+ }
+
+ /**
+ * 添加电子签章水印
+ *
+ * @param newPdfPath 新的pdf路径
+ * @param imagePath 图片路径
+ * @param width 宽度
+ * @param height 高度
+ * @param page
+ */
+ private static void PdfImage(String newPdfPath, InputStream srcPdfPath, String imagePath, int width, int height, int page) {
+
+ PdfReader pdfReader = null;
+ PdfStamper pdfStamper = null;
+
+ try {
+ pdfReader = new PdfReader(srcPdfPath);
+ //获取最后一页(计算页面插入)
+// System.out.println("页数"+pdfReader.getNumberOfPages());
+
+ FileOutputStream out = new FileOutputStream(newPdfPath);
+
+ pdfStamper = new PdfStamper(pdfReader, out);
+ //设置最后一页
+ PdfContentByte pdfContentByte = pdfStamper.getUnderContent(page);
+ //压缩图片
+ float qrWidth = 42.75f / 35.4f * 72;
+
+ Image qrcodeImage = Image.getInstance(imagePath);
+ //设置图片宽高
+ qrcodeImage.scaleToFit(qrWidth, qrWidth);
+
+ //水印图片位置坐标
+ qrcodeImage.setAbsolutePosition(width + 40, height - 45);
+ //插入图片
+ pdfContentByte.addImage(qrcodeImage);
+ pdfStamper.close();
+ } catch (Exception e) {
+ log.error("PDF插入图片发生未知异常:" + e);
+ } finally {
+ if (pdfReader != null) {
+ pdfReader.close();
+ }
+ }
+ }
+
+ /**
+ * 查找关键字集合
+ *
+ * @param pdfData
+ * @param keyword
+ * @return
+ * @throws IOException
+ */
+ public static List findKeywordPostions(byte[] pdfData, String keyword) {
+ List result = new ArrayList<>();
+ List pdfPageContentPositions = getPdfContentPostionsList(pdfData);
+ for (PdfPageContentPositions pdfPageContentPosition : pdfPageContentPositions) {
+ List charPositions = findPositions(keyword, pdfPageContentPosition);
+ if (charPositions == null || charPositions.size() < 1) {
+ continue;
+ }
+ result.addAll(charPositions);
+ }
+ return result;
+ }
+
+ /**
+ * 读取文件内容
+ *
+ * @param pdfData
+ * @return
+ */
+ private static List getPdfContentPostionsList(byte[] pdfData) {
+ try {
+ PdfReader reader = new PdfReader(pdfData);
+ List result = new ArrayList<>();
+ int pages = reader.getNumberOfPages();
+ for (int pageNum = 1; pageNum <= pages; pageNum++) {
+ PdfRenderListener pdfRenderListener = new PdfRenderListener(pageNum);
+ //解析pdf,定位位置
+ PdfContentStreamProcessor processor = new PdfContentStreamProcessor(pdfRenderListener);
+ PdfDictionary pageDic = reader.getPageN(pageNum);
+ PdfDictionary resourcesDic = pageDic.getAsDict(PdfName.RESOURCES);
+ try {
+ processor.processContent(ContentByteUtils.getContentBytesForPage(reader, pageNum), resourcesDic);
+ } catch (Exception e) {
+ reader.close();
+ log.error("读取文件内容发生未知异常:" + e);
+ }
+ String content = pdfRenderListener.getContent();
+ List charPositions = pdfRenderListener.getcharPositions();
+ List positionsList = new ArrayList<>();
+ for (CharPosition charPosition : charPositions) {
+ float[] positions = new float[]{charPosition.getPageNum(), charPosition.getX(), charPosition.getY()};
+ positionsList.add(positions);
+ }
+ PdfPageContentPositions pdfPageContentPositions = new PdfPageContentPositions();
+ pdfPageContentPositions.setContent(content);
+ pdfPageContentPositions.setPostions(positionsList);
+ result.add(pdfPageContentPositions);
+ }
+ reader.close();
+ return result;
+ } catch (Exception e) {
+ log.error("查找关键字发生未知异常:" + e);
+ }
+ return null;
+ }
+
+ /**
+ * 定位关键字位置
+ *
+ * @param keyword
+ * @param pdfPageContentPositions
+ * @return
+ */
+ private static List findPositions(String keyword, PdfPageContentPositions pdfPageContentPositions) {
+ List result = new ArrayList<>();
+ String content = pdfPageContentPositions.getContent();
+ List charPositions = pdfPageContentPositions.getPositions();
+ for (int pos = 0; pos < content.length(); ) {
+ int positionIndex = content.indexOf(keyword, pos);
+ if (positionIndex == -1) {
+ break;
+ }
+ float[] postions = charPositions.get(positionIndex);
+ result.add(postions);
+ pos = positionIndex + 1;
+ }
+ return result;
+ }
+
+ static class CharPosition {
+
+ private int pageNum = 0;
+ private float x = 0;
+ private float y = 0;
+
+ public CharPosition(int pageNum, float x, float y) {
+
+ this.pageNum = pageNum;
+ this.x = x;
+ this.y = y;
+ }
+
+ public int getPageNum() {
+
+ return pageNum;
+ }
+
+ public float getX() {
+ return x;
+ }
+
+ public float getY() {
+ return y;
+ }
+
+ @Override
+ public String toString() {
+
+ return "[pageNum=" + this.pageNum + ",x=" + this.x + ",y=" + this.y + "]";
+ }
+ }
+
+ private static class PdfPageContentPositions {
+
+ private String content;
+ private List positions;
+
+ public String getContent() {
+ return content;
+ }
+
+ public void setContent(String content) {
+ this.content = content;
+ }
+
+ public List getPositions() {
+ return positions;
+ }
+
+ public void setPostions(List positions) {
+ this.positions = positions;
+ }
+ }
+
+ private static class PdfRenderListener implements RenderListener {
+
+ private int pageNum;
+ private StringBuilder contentBuilder = new StringBuilder();
+ private List charPositions = new ArrayList<>();
+
+ public PdfRenderListener(int pageNum) {
+ this.pageNum = pageNum;
+ }
+
+ @Override
+ public void beginTextBlock() {
+ }
+
+ @Override
+ public void renderText(TextRenderInfo renderInfo) {
+
+ List characterRenderInfos = renderInfo.getCharacterRenderInfos();
+ for (TextRenderInfo textRenderInfo : characterRenderInfos) {
+ String word = textRenderInfo.getText();
+ if (word.length() > 1) {
+ word = word.substring(word.length() - 1, word.length());
+ }
+ Float rectangle = textRenderInfo.getAscentLine().getBoundingRectange();
+ float x = (float) rectangle.getX();
+ float y = (float) rectangle.getY();
+ CharPosition charPosition = new CharPosition(pageNum, (float) x, (float) y);
+ charPositions.add(charPosition);
+ contentBuilder.append(word);
+ }
+ }
+
+ @Override
+ public void endTextBlock() {
+ }
+
+ @Override
+ public void renderImage(ImageRenderInfo renderInfo) {
+ }
+
+ public String getContent() {
+ return contentBuilder.toString();
+ }
+
+ public List getcharPositions() {
+ return charPositions;
+ }
+ }
+
}