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; + } + } + }