本文参考自: 原文地址

一、:首先明确pdf的类型,在自己的开发过程中发现pdf也分几种类型。

我目前这里就指出常用两种:

一种是交互式pdf,他的组件可以读取,可以被编辑,比如liveCycle(Adobe LiveCycle Designer ES2)一款用于编辑pdf的软件。  (如果强行运行插入方法,不会报错,pdf内存也变大,但是就是无法看到图片)

一种是静态pdf,它里面的组件可以读取,不可编辑。

二、往pdf插入图片的两种方式

插入图片需要对插入位置进行定位,这就有两种方式

1:获取组件名,以组件为中心进行插入。同时可以将图片大小适应组件大小(比如我获取pdf一个签章域的名字)

public static void main(String[] args) throws Exception {
                // 模板文件路径
                String templatePath = "E://source.pdf";
                // 生成的文件路径
                String targetPath = "E://out.pdf";
                // 关键字名
                String fieldName = "SignatureField1";
                // 图片路径
                String imagePath = "E://00.jpg";

FileOutputStream fos = new FileOutputStream(targetPath);
                // 读取模板文件
                InputStream input = new FileInputStream(new File(templatePath));
                PdfReader reader = new PdfReader(input);
                PdfStamper stamper = new PdfStamper(reader, fos);
                // 提取pdf中的表单
                AcroFields form = stamper.getAcroFields();
                form.addSubstitutionFont(BaseFont.createFont("STSong-Light","UniGB-UCS2-H", BaseFont.NOT_EMBEDDED));

// 通过域名获取所在页和坐标,左下角为起点
                int pageNo = form.getFieldPositions(fieldName).get(0).page;
                Rectangle signRect = form.getFieldPositions(fieldName).get(0).position;
                float x = signRect.getLeft();
                float y = signRect.getBottom();
                //x = 20f;
                //y = 40f;
                // 读图片
                Image image = Image.getInstance(imagePath);
                // 获取操作的页面
                PdfContentByte under = stamper.getOverContent(pageNo);
                // 根据域的大小缩放图片
                image.scaleToFit(signRect.getWidth(), signRect.getHeight());
                // 添加图片
                image.setAbsolutePosition(x, y);
                under.addImage(image);
                fos.flush();
                fos.close();
                /*stamper.close();*/
                reader.close();

}

2:关键字签章,该方式是读取pdf里面的文字,以文字为中心进行定位。其实和上面差不多,只是定位方式变化了而已。

public static byte[] signPdfByStampKeyNocert(Object source, URL imagePath, String stampKey) throws Exception {
              //source:待插入图片的pdf ,imagePath :待插入图片  , stampKey:关键字(比如 “图片插入在我这”)

// 临时文件路径
String targetPath = "E://source.pdf";

// 读取模板文件
PdfReader reader = null;
if(source instanceof String){
reader = new PdfReader((String)source);
}else if(source instanceof byte[]){
reader = new PdfReader((byte[])source);
}else if(source instanceof URL){
reader = new PdfReader((URL)source);
}

byte [] by1 = null;

PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(targetPath));

// 则使用座标签章,获取关键字的各类参数 (这个方法我整合了,各位可自行查找)
Map<String, Object> params = PDFUtil.getSignaturePostionInfo(reader, imagePath, stampKey);

// 关键字
Rectangle signRect = (Rectangle) params.get("sign8PositionRectangle");
// 获取图片的绝对位置,距离
float x = signRect.getLeft();
float y = signRect.getBottom();

// 获取关键字所在页码
int pageno = (int) params.get("sign8PositionKeywordsPageIndex");
// 获取操作的页面
PdfContentByte overContent = stamper.getOverContent(pageno);

Image image = Image.getInstance(imagePath);

// 设置图片宽高
image.scaleToFit(signRect.getWidth(), signRect.getHeight());
// image.scaleAbsolute(x, y);
// 设置图片位置

image.setAbsolutePosition(x, y);// 左边距、底边距

overContent.addImage(image);
overContent.stroke();
stamper.close();
reader.close();

byte [] bytes = FileUtil.getFile(targetPath);

FileUtil.delFile(targetPath);

return bytes;
}

java通过itext方法往pdf中插入图片(交互式pdf插入图片无法显示)相关推荐

  1. 如何去除PDF中的水印,PDF去水印方法

    如何去除PDF中的水印, 去除PDF水印的方法有哪些?想要去除PDF中的水印就需要使用到PDF编辑器来操作,很多人对于PDF编辑怎么去除PDF水印的操作方法也不是很了解,下面小编就为大家分享一下PDF ...

  2. 如何清除PDF中的水印?PDF删除水印的方法

    我们通常会去网上搜索并下载一些资料,但很多时候下载的PDF文档内容中都会有一些水印影响使用,要怎样才能删除这些PDF水印呢? 从PDF的两种类型来分别讲讲,第一种就是比较常见的普通PDF文档,一般有W ...

  3. java应用程序接口批量访问_spring中使用mybatis实现批量插入的示例代码

    有3种实现方式:foreach,spring事务,以及ExecutorType.BATCH. 1. foreach方式 这种方式实际是对SQL语句进行拼接,生成一个长长的SQL,对很多变量进行绑定.如 ...

  4. PDF中的超链接在PDF阅读器中失效问题的解决

    背景:同事在苹果电脑的PDF阅读器中打开PDF文件,说里面的超链接无法跳转,但在浏览器中打开就是可以跳转的 问题:超链接中包含了中文,在苹果那个PDF阅读器中显示的中文的编码和浏览器地址栏中显示的中文 ...

  5. list java removeif_java – removeIf()方法.从List中删除所有元素

    我有一个用户列表,我想从我的列表中删除id为 其实我这样做: [...] int pid1 = 1; int pid2 = 2; int pid3 = 3; Predicate personPredi ...

  6. java使用数组排序方法_java数组中的排序问题(冒泡排序方法的实现,及内置排序算法的应用)...

    在编程过程中对数组的运用也是很关键的,我们往往需要利用到数组,其中有一点就是当涉及到数组的排序问题,我们应该如何解决? 今天我来介绍两种常用的排序方法 一,冒泡排序序法 冒泡排序的原理: 1.比较相邻 ...

  7. 【PDF添加印章】Java在PDF中添加指定尺寸大小的图片印章

    文章目录 需求 问题 解决 需求 需要在导出PDF时,添加指定大小为 4cm × 4cm 大小的图片印章 问题 客户提供的图片由 PhotoShop 导出,尺寸大小为 4cm × 4cm ,按说使用 ...

  8. java数组排序法方法_JAVA数组中五种常见排序方法

    前言: 几种常用的JAVA数组排序方法的整合. 法一:Arrays.sort() Arrays.sort()排序方法在java中是最简单且最常用的排序方法 int []arr1= {45,34,59, ...

  9. java数组显示最大值,java 如何用方法在数组中找到最大值并显示他的名称?

    public static void sub(int racetime[], String name[]) { int maxIndex = 0; // 记录racetime最大值的下标 for (i ...

最新文章

  1. 多维矩阵/数组变成一维数组
  2. vim特殊符号的意义
  3. Mysql的垂直分表-新建
  4. IE8 兼容background-size的解决办法
  5. 倪飞曝腾讯红魔6更多细节:搭载业内顶级散热技术
  6. 港府多措施推广使用电动车 放宽条件吸引车主换车
  7. 算法刷题指南,来自GitHub 68.8k star的硬核算法教程
  8. 【eclipse插件开发实战】Eclipse插件开发2——SWT
  9. Node.js 0.8.20 稳定版发布
  10. MES系统最全介绍来了
  11. 移动硬盘在Mac上无法拷贝或删除文件的解决办法
  12. excel打不开_mac版excel死机该如何恢复?
  13. Mac下如何把iphone资料备份到移动硬盘
  14. mysql数据库语法用处_MySQL数据库语法总结笔记
  15. 使用R语言进行perMANVOA分析NMDS结果多个分组之间显著性
  16. 对random.seed()函数的理解
  17. MyBatis为什么这么“屌”?这些MyBatis的秘密,分分钟吊打面试官
  18. strcpy、strcpy_s、strncpy、strncpy_s 字符串拷贝用法
  19. 心理学c语言,心理学史练习题.doc
  20. 如何轻松的破解excel 2016工作表密码

热门文章

  1. 领域模型的概念:失血 贫血 充血 胀血
  2. java升序排列数组_java数组的升序降序排列
  3. ip用int类型存储
  4. 用友U9 BP不执行
  5. SMS短信的编码规则
  6. (6)JsonResponse, Cookie, Session
  7. ...的Comparator和Compa
  8. 按“Win+E”键出现【找不到应用程序】或【explore.exe找不到】的解决方法
  9. python中函数定义的关键字_python中定义函数的关键字是什么
  10. 规范小区电瓶车充电桩的分布保障充电安全