当前位置:
首页 >
使用itextpdf进行动态盖章,解决PDF页数不确定时签章位置变化问题
发布时间:2023/12/16
50
豆豆
生活随笔
收集整理的这篇文章主要介绍了
使用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页数不确定时签章位置变化问题的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 点控技术和激光定位技术
- 下一篇: 云原生安全构筑下一代企业安全架构