公司最近接到一个需求,需要电子签章,下面是简单的demo,参考了一些网上的文章,自己改一改

import com.itextpdf.awt.geom.Rectangle2D;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.*;
import com.itextpdf.text.pdf.parser.PdfReaderContentParser;
import com.yz.robot.api.spring.listener.TestRenderListener;import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** @Classname test* @Author AlexZ* @Date 2020/9/1 8:51* @Version v1.0* @Description**/
public class test {public static void main(String[] args) throws Exception {// 模板文件路径String templatePath = "XXXXXXpdfurl";// 生成的文件  本地路径String targetPath = "target.pdf";//模拟用户传参HashMap<String, String> hashMap = new HashMap<>(5);hashMap.put("nameA", "xxxxxxxxxxxxxImageUrl");hashMap.put("nameB", "xxxxxxxxxxxxxImageUrl");hashMap.put("nameC", "xxxxxxxxxxxxxImageUrl");URL url = new URL(templatePath);HttpURLConnection conn = (HttpURLConnection) url.openConnection();//设置超时间为3秒conn.setConnectTimeout(3 * 1000);//防止屏蔽程序抓取而返回403错误conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");//得到输入流InputStream input = conn.getInputStream();// 读取模板文件
//        InputStream input = new FileInputStream(new File(templatePath));PdfReader reader = new PdfReader(input);//新建一个PDF解析对象PdfReaderContentParser parser = new PdfReaderContentParser(reader);PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(targetPath));for (int i = 1; i <= reader.getNumberOfPages(); i++) {//新建一个ImageRenderListener对象,该对象实现了RenderListener接口,作为处理PDF的主要类TestRenderListener listener = new TestRenderListener();//解析PDF,并处理里面的文字parser.processContent(i, listener);//获取文字的矩形边框List<Map<String, Rectangle2D.Float>> list_text = listener.rows_text_rect;for (int k = 0; k < list_text.size(); k++) {Map<String, Rectangle2D.Float> map = list_text.get(k);for (Map.Entry<String, Rectangle2D.Float> entry : map.entrySet()) {/*** 此处name根据前端/移动端传参来指定规则* 如前端传过来图片地址为nameA,我们匹配到的是$nameA,我们就截取$* 这样就可以相互匹配上了*/String name = entry.getKey().replace("$", "");Rectangle2D rectangle2D = entry.getValue();float x = ((Rectangle2D.Float) rectangle2D).x;float y = ((Rectangle2D.Float) rectangle2D).y;float width = ((Rectangle2D.Float) rectangle2D).width;float height = ((Rectangle2D.Float) rectangle2D).height;// 读图片Image image = Image.getInstance(hashMap.get(name));//url远程文件旋转需要使用setRotationDegrees   本地使用setRotationimage.setRotationDegrees(90f);// 获取操作的页面PdfContentByte under = stamper.getOverContent(i);// 根据域的大小缩放图片image.scaleToFit(width, height);// 添加图片image.setAbsolutePosition(x, y);under.addImage(image);}}}stamper.close();reader.close();System.exit(0);}
}
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;import javax.imageio.ImageIO;import com.itextpdf.awt.geom.Rectangle2D;
import com.itextpdf.awt.geom.RectangularShape;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.parser.ImageRenderInfo;
import com.itextpdf.text.pdf.parser.RenderListener;
import com.itextpdf.text.pdf.parser.TextRenderInfo;
import org.apache.log4j.Logger;public class TestRenderListener implements RenderListener {private static final Logger logger = Logger.getLogger(TestRenderListener.class);//用来存放每一行文字的坐标位置public List<Map<String, Rectangle2D.Float>> rows_text_rect = new ArrayList<>();//PDF文件的路径protected String filepath = null;public TestRenderListener() {}//step 2,遇到"BT"执行@Overridepublic void beginTextBlock() {// TODO Auto-generated method stub}//step 3/*** 文字主要处理方法*/@Overridepublic void renderText(TextRenderInfo renderInfo) {//获取文字的下面的矩形//Rectangle2D.Float rectBase = renderInfo.getBaseline().getBoundingRectange();String text = renderInfo.getText();if (text.indexOf("$name") != -1) {RectangularShape rectBase = renderInfo.getBaseline().getBoundingRectange();//获取文字下面的矩形Rectangle2D.Float rectAscen = renderInfo.getAscentLine().getBoundingRectange();//计算出文字的边框矩形float leftX = (float) rectBase.getMinX();float leftY = (float) rectBase.getMinY() - 10;float rightX = (float) rectAscen.getMaxX();float rightY = (float) rectAscen.getMaxY() + 10;Rectangle2D.Float rect = new Rectangle2D.Float(leftX, leftY + 5, rightX - leftX + 10, rightY - leftY + 20);logger.info("text:" + text + "--x:" + rect.x + "--y:" + rect.y + "--width:" + rect.width + "--height:" + rect.height);Map<String, Rectangle2D.Float> map = new HashMap<>();map.put(text, rect);rows_text_rect.add(map);}}//step 4(最后执行的,只执行一次),遇到“ET”执行@Overridepublic void endTextBlock() {// TODO Auto-generated method stub}//step 1(图片处理方法)@Overridepublic void renderImage(ImageRenderInfo renderInfo) {}
}

实现前后效果图:

Java使用itextpdf根据关键词插入图片相关推荐

  1. java中生成pdf,插入图片,页眉、页脚、表格

    全栈工程师开发手册 (作者:栾鹏) java教程全解 java中生成pdf,插入图片,页眉.页脚.表格 import com.lowagie.text.*; import com.lowagie.te ...

  2. Java Poi 向excel中插入图片

    博客 package com.unicom.yangjiabin.utils;import java.awt.image.BufferedImage; import java.io.ByteArray ...

  3. java poi 在excel中插入图片

    java web中导出excel数据是常见的功能,最近遇到一个需求是在excel中插入图片.处理excel及其他微软办公系列软件常用的就是apache poi,它也是支持图片插入的.插入图片最主要的用 ...

  4. java 在线给word 文件插入图片,并设置图片大小

    一.前言: 有时我们想在一篇word文档中的指定位置添加一张服务器上的图片,并且并且设置图片大小.这个对文档的操作一定是需要第三方api的.市面上对文档处理的插件有POI以及openoffice等等, ...

  5. 记录 java 往 word 表格里边插入图片 的坑

    坑了两次,还是记录下 免得下次又忘记.java 在往word 表格里边插入图片的时候,如果循环插入多个表格,第一个表格里边的图片正常显示,但是第二个表格里边的图片总是展示为上一个表格的最后一张图片,经 ...

  6. Java POI XSSFWorkbook Excel中插入图片

    对Excel指定单元格插入图片 一.不懂就@我,不怕麻烦嘿嘿嘿 二.参考方法(希望能有帮助) 一.不懂就@我,不怕麻烦嘿嘿嘿 引入Pom <dependency><groupId&g ...

  7. java使用poi操作word模板,插入图片、段落、表格

    java使用poi操作word插入图片.段落.表格 其他链接 准备工作 创建word模板.docx文件 编写模板格式.xml文件 java上手poi maven依赖 使用到的包 具体应用 对应封装方法 ...

  8. java导出各种PDF文件(图片、表格、字体)

    java导出PDF文件(插入图片,表格,字体) 业务需求:需要根据系统里的各种数据动态生成PDF会议材料. 最终呈现图 思路 因为会议材料涉及各种数据,图片.同时还要有表格及字体样式的要求,所以需要用 ...

  9. java实现pdf生成,包括合并图片

    参考帖子: 这位大佬的帖子必读,因为涉及到pdf创建表单的教程: java使用itext填充pdf模板,超简单教学,有手就行 以下是学习当中参考的帖子: java pdf域插入img_java实现在p ...

最新文章

  1. 三栏布局 五中解决方式
  2. java websocket 库_Java 项目中的 WebSocket 实现
  3. 0123互联网新闻 | 在线教育机构掌门1对1获3.5亿美元融资;淘宝直播独立App将在春节前上线...
  4. python人工智能能干啥_人工智能首选什么语言 Python能做哪些事情
  5. python课程开课吧怎么样-年薪30万,未来十年大量缺人,这个技能在金融圈到底有多吃香?...
  6. 关于AOP方面的设计 UML图
  7. 基于Java的学生会管理系统
  8. 【缺陷识别】基于matlab GUI SVM金属表面缺陷分类与测量(带面板)【含Matlab源码 1652期】
  9. 计算机审计中级题库,中级审计师用什么题库练习呢
  10. iphone双重认证关闭不了怎么办_iPhone如何关闭Apple ID的双重认证
  11. winrar捆绑软件
  12. 我在蚂蚁金服做后端:那些坚持在一个岗位做八年的人,后来怎么样了?...
  13. win10强制关闭飞行模式_Win7已毕业,你为什么还不用Win10?
  14. 引入第三方sdk错误提示
  15. 生物信息中的Python 01 | 从零开始处理基因序列
  16. 烟台气象台发布蓝色预警信号: 今日大到暴雪
  17. WAP 构建 Java 应用 和 WAP经验总结
  18. storm DRPC例子
  19. SQL Server 安全认证知识【1】
  20. pikachu RCE

热门文章

  1. WebSocket connection to ‘wss://xxx.com’ failed: Error in NET::ERR_SSL_OBSOLETE_VERSION
  2. 【NOIP2005 提高组】篝火晚会
  3. 0基础学RS(三)路由器基本配置
  4. Java数组初始化长度
  5. 论语之宪问第十四、卫灵公第十五、季氏第十六
  6. 虚拟机怎么架设dns服务器,虚拟机centos7 DNS服务器搭建
  7. 得到大学夏季开学典礼之后感
  8. tplink478虚拟服务器设置,tp-link路由器TL-R473如何设置,10台电脑设置局域网
  9. Java转化音频格式 m4a-wav
  10. 基于微信小程序评选投票系统 投票小程序毕业设计 毕业论文 开题报告和效果图