日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用itextpdf进行动态盖章,解决PDF页数不确定时签章位置变化问题

發布時間:2023/12/16 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用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页数不确定时签章位置变化问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。