使用itextpdf进行动态盖章,解决PDF页数不确定时签章位置变化问题
生活随笔
收集整理的這篇文章主要介紹了
使用itextpdf进行动态盖章,解决PDF页数不确定时签章位置变化问题
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一?簡(jiǎn)介
因公司業(yè)務(wù)需求需要做一個(gè)生成PDF的功能,采用的是html+freemarker來(lái)實(shí)現(xiàn)的。其中由于內(nèi)容是變動(dòng)的,需要確定簽章圖片的絕對(duì)位置,故選擇找到附近關(guān)鍵字的坐標(biāo),從而來(lái)確定蓋章位置。
二 項(xiàng)目依賴
<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.4.2</version> </dependency>三 測(cè)試代碼
package pdf;import com.itextpdf.awt.geom.Rectangle2D.Float; import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.text.pdf.parser.ImageRenderInfo; import com.itextpdf.text.pdf.parser.PdfReaderContentParser; import com.itextpdf.text.pdf.parser.RenderListener; import com.itextpdf.text.pdf.parser.TextRenderInfo;import java.io.IOException; import java.util.Arrays;/*** 獲取PDF相對(duì)位置,從而確定簽章位置** @author yinxinyao* @date 2019/5/20 14:44*/ public class GetPositionTest {public static void main(String[] args) throws Exception {String filePath = "C:\\Users\\Desktop\\hello.pdf";String KEY_WORD = "簽章:";Integer[] fontPosition = getFontPosition(filePath, KEY_WORD, null);System.out.println(Arrays.toString(fontPosition));}/*** 根據(jù)pdf中的關(guān)鍵字,獲取文字的絕對(duì)位置,從而確定簽章位置** @param filePath pdf文件的絕對(duì)地址* @param filePath pdf中的關(guān)鍵字* @param pageNum pdf頁(yè)數(shù),可傳null,默認(rèn)設(shè)置最大頁(yè)數(shù)* @return x與y值* @throws IOException*/private static Integer[] getFontPosition(String filePath, final String keyWord, Integer pageNum) throws IOException {final Integer[] result = new Integer[2];PdfReader pdfReader = new PdfReader(filePath);if (null == pageNum) {pageNum = pdfReader.getNumberOfPages();}new PdfReaderContentParser(pdfReader).processContent(pageNum, new RenderListener() {public void beginTextBlock() {}public void renderText(TextRenderInfo textRenderInfo) {String text = textRenderInfo.getText();System.out.println("text is :" + text);if (text != null && text.contains(keyWord)) {// 文字在page中的橫坐標(biāo)、縱坐標(biāo)Float textFloat = textRenderInfo.getBaseline().getBoundingRectange();float x = textFloat.x;float y = textFloat.y;result[0] = (int) x;result[1] = (int) y;System.out.println(String.format("簽章文字域絕對(duì)位置為x:%s,y:%s", x, y));}}public void endTextBlock() {}public void renderImage(ImageRenderInfo renderInfo) {}});return result;} }四 整合加載簽章圖片功能
import com.itextpdf.awt.geom.Rectangle2D; import com.itextpdf.text.DocumentException; import com.itextpdf.text.Image; import com.itextpdf.text.pdf.PdfContentByte; import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.text.pdf.PdfStamper; import com.itextpdf.text.pdf.parser.ImageRenderInfo; import com.itextpdf.text.pdf.parser.PdfReaderContentParser; import com.itextpdf.text.pdf.parser.RenderListener; import com.itextpdf.text.pdf.parser.TextRenderInfo;import java.io.FileOutputStream; import java.io.IOException;/*** @author yinxinyao* @date 2019/5/21 14:42*/ public class AddSignImg {public static void main(String[] args) throws IOException, DocumentException {// 模板文件路徑String templatePath = "C:\\Users\\yinxinyao\\Desktop\\part1.pdf";// 生成的文件路徑String targetPath = "C:\\Users\\yinxinyao\\Desktop\\part2.pdf";// 圖片路徑, 需要png透明圖片,否則會(huì)覆蓋文字String imagePath = "C:\\Users\\yinxinyao\\Desktop\\FC001.gif";addSignImg(templatePath, targetPath, imagePath, "簽章", null);}/*** 根據(jù)pdf中的關(guān)鍵字,獲取文字的絕對(duì)位置,并進(jìn)行簽章** @param inputPath 未處理pdf* @param targetPath 已簽章pdf地址* @param imagePath 簽章圖片地址* @param inputPath pdf中的關(guān)鍵字* @param pageNum pdf頁(yè)數(shù),可傳null,默認(rèn)設(shè)置最大頁(yè)數(shù)* @return float的x與y值* @throws IOException*/private static void addSignImg(String inputPath, String targetPath, final String imagePath, final String keyWord, Integer pageNum) throws IOException, DocumentException {PdfReader pdfReader = new PdfReader(inputPath);// 讀圖片final Image image = Image.getInstance(imagePath);// 根據(jù)域的大小縮放圖片image.scaleToFit(120, 120);if (null == pageNum) {pageNum = pdfReader.getNumberOfPages();}new PdfReaderContentParser(pdfReader).processContent(pageNum, new RenderListener() {public void beginTextBlock() {}public void renderText(TextRenderInfo textRenderInfo) {String text = textRenderInfo.getText();if (text != null && text.contains(keyWord)) {// 文字在page中的橫坐標(biāo)、縱坐標(biāo)Rectangle2D.Float textFloat = textRenderInfo.getBaseline().getBoundingRectange();float x = textFloat.x;float y = textFloat.y;// 設(shè)置圖片位置image.setAbsolutePosition(x + 50f, y - 30f);}}public void endTextBlock() {}public void renderImage(ImageRenderInfo renderInfo) {}});// 獲取操作的頁(yè)面PdfStamper stamper = new PdfStamper(pdfReader, new FileOutputStream(targetPath));PdfContentByte under = stamper.getOverContent(pageNum);under.addImage(image);stamper.close();pdfReader.close();} }?
總結(jié)
以上是生活随笔為你收集整理的使用itextpdf进行动态盖章,解决PDF页数不确定时签章位置变化问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 点控技术和激光定位技术
- 下一篇: 云原生安全构筑下一代企业安全架构