使用itextpdf进行动态盖章,解决PDF页数不确定时签章位置变化问题
生活随笔
收集整理的這篇文章主要介紹了
使用itextpdf进行动态盖章,解决PDF页数不确定时签章位置变化问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一?簡介
因公司業務需求需要做一個生成PDF的功能,采用的是html+freemarker來實現的。其中由于內容是變動的,需要確定簽章圖片的絕對位置,故選擇找到附近關鍵字的坐標,從而來確定蓋章位置。
二 項目依賴
<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.4.2</version> </dependency>三 測試代碼
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相對位置,從而確定簽章位置** @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));}/*** 根據pdf中的關鍵字,獲取文字的絕對位置,從而確定簽章位置** @param filePath pdf文件的絕對地址* @param filePath pdf中的關鍵字* @param pageNum pdf頁數,可傳null,默認設置最大頁數* @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中的橫坐標、縱坐標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("簽章文字域絕對位置為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透明圖片,否則會覆蓋文字String imagePath = "C:\\Users\\yinxinyao\\Desktop\\FC001.gif";addSignImg(templatePath, targetPath, imagePath, "簽章", null);}/*** 根據pdf中的關鍵字,獲取文字的絕對位置,并進行簽章** @param inputPath 未處理pdf* @param targetPath 已簽章pdf地址* @param imagePath 簽章圖片地址* @param inputPath pdf中的關鍵字* @param pageNum pdf頁數,可傳null,默認設置最大頁數* @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);// 根據域的大小縮放圖片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中的橫坐標、縱坐標Rectangle2D.Float textFloat = textRenderInfo.getBaseline().getBoundingRectange();float x = textFloat.x;float y = textFloat.y;// 設置圖片位置image.setAbsolutePosition(x + 50f, y - 30f);}}public void endTextBlock() {}public void renderImage(ImageRenderInfo renderInfo) {}});// 獲取操作的頁面PdfStamper stamper = new PdfStamper(pdfReader, new FileOutputStream(targetPath));PdfContentByte under = stamper.getOverContent(pageNum);under.addImage(image);stamper.close();pdfReader.close();} }?
總結
以上是生活随笔為你收集整理的使用itextpdf进行动态盖章,解决PDF页数不确定时签章位置变化问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 点控技术和激光定位技术
- 下一篇: 云原生安全构筑下一代企业安全架构