本文的实现方法需要用到 adobeacrobatXpro 来设置锚点(准确的说是域)

链接:https://pan.baidu.com/s/1GebLg8rSPqPBDNqnas9A3A
提取码:pp9b

下载安装

用本软件打开你的pdf
下面开始在PDF上插入锚点

以后你用java找到这个锚点是要靠这个域名的,并且插入图片的大小和域的大小一样

不设置的话打印出来的PDF会出现一个表单框

     <!--pdf插图--><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.6</version></dependency><!-- itextpdf的亚洲字体支持 --><dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency>

locationPath.java

package com.protectzaizai.schoolcardoa.entity;import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;/*** @Author: 动感小⑦* @Date:2020/2/26 15:21*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class locationPath {//对应坐标和所在页面是第几页float x;float y;int pageNo;//图片地址String path;//图片大小float width;float height;
}

DocUtils.java

package com.protectzaizai.schoolcardoa.utils;import com.artofsolving.jodconverter.DocumentConverter;
import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection;
import com.artofsolving.jodconverter.openoffice.converter.OpenOfficeDocumentConverter;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.*;
import com.protectzaizai.schoolcardoa.entity.locationPath;
import com.sun.star.lib.uno.protocols.urp.urp;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.*;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.jeecgframework.poi.word.WordExportUtil;import java.io.*;
import java.net.ConnectException;
import java.util.*;/*** @Author: 动感小⑦* @Date:2020/2/22 11:07*/
public class DocUtils {/*** pdf中插入图片,针对单一pdf,需要用adobe acrobat设置表单域* filedAndPath 是表单域名与对应图片地址的键值对*/public static void pdfInsertImgByfield(String sourceFile, String destFile, HashMap<String, String> filedAndPath) throws IOException, DocumentException {// 模板文件路径String templatePath = sourceFile;// 生成的文件路径String targetPath = destFile;// 读取模板文件InputStream input = new FileInputStream(new File(templatePath));PdfReader reader = new PdfReader(input);PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(targetPath));// 提取pdf中的表单AcroFields form = stamper.getAcroFields();form.addSubstitutionFont(BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED));//遍历表单域,插入对应图片Iterator<Map.Entry<String, String>> iterator = filedAndPath.entrySet().iterator();while (iterator.hasNext()) {Map.Entry<String, String> entry = iterator.next();// 书签名String fieldName = entry.getKey();// 图片路径String imagePath = entry.getValue();// 通过域名获取所在页和坐标,左下角为起点int pageNo = form.getFieldPositions(fieldName).get(0).page;Rectangle signRect = form.getFieldPositions(fieldName).get(0).position;float x = signRect.getLeft();float y = signRect.getBottom();// 读图片Image image = Image.getInstance(imagePath);// 获取操作的页面PdfContentByte under = stamper.getOverContent(pageNo);// 根据域的大小缩放图片image.scaleToFit(signRect.getWidth(), signRect.getHeight());// 添加图片image.setAbsolutePosition(x, y);under.addImage(image);//这里输出数据
//            locationPath locationPath = new locationPath();
//            locationPath.setX(x).setY(y).setHeight(signRect.getHeight()).setWidth(signRect.getWidth()).setPageNo(pageNo).setPath(imagePath);
//            System.out.println(locationPath);}stamper.close();reader.close();}/*** pdf中插入图片* 如果数据定位不太详细的话可以用上面一种方法输出一下位置信息,然后确定每个位置的信息** @param sourceFile* @param destFile* @param locationPath 自己写的类,参数x,y是地址 path是对应的地址* @throws IOException* @throws DocumentException*/public static void pdfInsertImgByLocation(String sourceFile, String destFile, List<locationPath> locationPath) throws IOException, DocumentException {// 模板文件路径String templatePath = sourceFile;// 生成的文件路径String targetPath = destFile;// 读取模板文件InputStream input = new FileInputStream(new File(templatePath));PdfReader reader = new PdfReader(input);PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(targetPath));for (locationPath l : locationPath) {// 读图片Image image = Image.getInstance(l.getPath());// 获取操作的页面PdfContentByte under = stamper.getOverContent(l.getPageNo());// 根据域的大小缩放图片image.scaleToFit(l.getWidth(), l.getHeight());// 添加图片image.setAbsolutePosition(l.getX(), l.getY());under.addImage(image);}stamper.close();reader.close();}//                          下面是工具方法//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//获得锚点数据,或者生成一个锚点public static void main(String args[]) throws IOException, DocumentException {
//        HashMap<String, String> map = new HashMap<>();
//        map.put("field1", "D:\\test1.png");
//        map.put("field2", "D:\\test2.png");
//        map.put("field3", "D:\\test1.png");
//        map.put("field4", "D:\\test2.png");
//        map.put("field5", "D:\\test1.png");
//        pdfInsertImgByfield("D:\\schoolCard.pdf", "D:\\schoolCard1.pdf", map);locationPath l1 = new locationPath();l1.setX((float) 169.643).setY((float) 335.407).setPageNo(1).setWidth((float) 106.380005).setHeight((float) 94.0).setPath("D:\\test1.png");locationPath l2 = new locationPath();l2.setX((float) 284.738).setY((float) 335.407).setPageNo(1).setWidth((float) 106.380005).setHeight((float) 94.0).setPath("D:\\test1.png");locationPath l3 = new locationPath();l3.setX((float) 399.417).setY((float) 335.407).setPageNo(1).setWidth((float) 106.380005).setHeight((float) 94.0).setPath("D:\\test1.png");locationPath l4 = new locationPath();l4.setX((float) 286.315).setY((float) 225.042).setPageNo(1).setWidth((float) 106.380005).setHeight((float) 94.0).setPath("D:\\test1.png");locationPath l5 = new locationPath();l5.setX((float) 400.885).setY((float) 225.042).setPageNo(1).setWidth((float) 106.380005).setHeight((float) 94.0).setPath("D:\\test1.png");List<locationPath> list = new ArrayList<>();list.add(l1);list.add(l2);list.add(l3);list.add(l4);list.add(l5);pdfInsertImgByLocation("D:\\schoolCard.pdf", "D:\\schoolCard.pdf", list);}private static int convertFile(File inputFile, File outputFile, OpenOfficeConnection connection) throws ConnectException {connection.connect();DocumentConverter converter = new OpenOfficeDocumentConverter(connection);converter.convert(inputFile, outputFile);connection.disconnect();System.out.println("****pdf转换成功,PDF输出:" + outputFile.getPath() + "****");return 0;}
}

这个util亲测可用,有问题可以在评论里说

java springboot pdf插入图片 定点插图相关推荐

  1. java通过itext方法往pdf中插入图片(交互式pdf插入图片无法显示)

    本文参考自: 原文地址 一.:首先明确pdf的类型,在自己的开发过程中发现pdf也分几种类型. 我目前这里就指出常用两种: 一种是交互式pdf,他的组件可以读取,可以被编辑,比如liveCycle(A ...

  2. Java给PDF添加图片水印,且可以文字定位

    这两天公司开发需要对PDF增加特定图片,类似于电子印章效果,试了许多网上的方式,经过测试PDF只可以插入图片或者通过RSA实现专属签章,我觉得插入图片好用一些,效果如下: 这是定位了<盖章> ...

  3. Java制作PDF转图片小工具

    背景: 前几日一位朋友突然找我帮忙将PDF转换成图片,我仗义相助,建议他使用福昕阅读器,然而他说转换需要VIP会员,老贵了.我花了半天时间寻找免费会员,结果不出所料没有找到,我一怒之下,便决定亲自动手 ...

  4. pdf插入图片到指定坐标位置 亲测可用

    pdf插入图片到指定位置,常见图片格式都支持 坐标位置可自定义 根据文字.关键字识别坐标位置,可见另一个帖子:pdf识别关键字坐标 依赖引用:itextpdf-5.5.13.jar 常见itextpd ...

  5. Java Poi word 插入图片并添加边框

    Java Poi word 插入图片并添加边框 //得到Picture的Base64编码 Base64Picture p1; //打开Word文件 Resource resource = new Cl ...

  6. itextsharp操作pdf——插入图片

    itextsharp 插入图片操作 asp.net 用于审核后签字或者其他需要对pdf进行插入图片的操作. 在pdf添加图片方法: protected void AddImg(string oldP, ...

  7. java之pdf转图片的几种方式,以及在使用过程中遇到的问题和处理方案

    java之pdf转图片的几种方式,以及在使用过程中遇到的问题和处理方案 方式 pdfBox iText(方式同上) spire.pdf.free(方式同上) 遇到的问题 图片清晰度.这种方式都有这个问 ...

  8. java pdf 插入图片_java在pdf模板的指定位置插入图片

    个人感觉pdf的操作比word舒心多了 java操作pdf有个非常好用的库itextpdf,maven: com.itextpdf itextpdf 5.5.6 com.itextpdf itext- ...

  9. java pdfbox 合并PDF、PDF转图片、PDF插入图片

    1.添加依赖 <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox< ...

最新文章

  1. Mysql将SQL查询结果以字符串形式返回
  2. Python构建基于elkan优化算法的K-Means聚类模型
  3. Android之组件化开发
  4. 【Android 逆向】Android 逆向通用工具开发 ( PC 端工程分析 | 网络初始化操作 | PC 端工程核心业务逻辑 )
  5. 11. java 抽象类
  6. js 手机号加密 中间星号表示
  7. 计算 java_两种计算Java对象大小的方法(转)
  8. Python笔记-BeautifulSoup基本用法(通过标签及class定位元素)
  9. 基于Android的rgb七彩环颜色采集器
  10. 手持设备点击响应速度,鼠标事件与touch事件的那些事
  11. 一个能支持Flash的广告控件
  12. python核心编程笔记chapter 14
  13. 拓端tecdat|R语言:逻辑回归ROC曲线对角线分析过程及结果
  14. mt3dgis 视频教程
  15. 【金九银十】Java微服务面试题,看到你就是赚到
  16. web中HTTP协议详解
  17. JS实现弹窗效果,超简单哦
  18. Flutter Sliver系列组件入门
  19. 【CSS】画一个扇形
  20. python小海龟画房子编程_这个python海龟绘图为什么出错?

热门文章

  1. Xmind 8 pro 软件破解版
  2. 点击 按钮 下载图片
  3. tweenmax笔记
  4. 物联网-通信模块使用笔记
  5. MSI(Message Signaled Interrupt)
  6. 吐槽一下typora
  7. 云计算的认识和看法_我对云计算的认识
  8. FileZilla下载及基本用法
  9. K8S(二)安装配置篇
  10. 用健身的思维来对待学习