首页 > 编程语言 >Java 使用 itext 向PDF插入数据和图片

Java 使用 itext 向PDF插入数据和图片

时间:2024-02-26 13:47:32浏览次数:26  
标签:Java String form 表单 itext PDF import templateImageMap

Java 使用 itext 向PDF插入数据和图片

一、下载Adobe Acrobat DC

二、制作模板

1、准备一个word模板,并转换成PDF格式

2、使用Adobe Acrobat DC打开PDF文档,并在右侧搜索框搜索表单,点击准备表单

 

3、点击开始,制作PDF表单

 

4、扫描完成后如下图,蓝白色框就是可编辑表单
 

 

5、点击表单编辑表单名称以及插入时的字体大小样式等,如果没有设置字体大小,数据写入时会将字体会根据表单的高度自适应大小
 

 

 

6、编辑完成后保存PDF模板
 

三、在Java中使用

 1 import com.itextpdf.text.DocumentException;
 2 import com.itextpdf.text.Image;
 3 import com.itextpdf.text.Rectangle;
 4 import com.itextpdf.text.pdf.*;
 5 
 6 import java.io.*;
 7 
 8 import java.nio.file.Files;
 9 import java.util.Calendar;
10 import java.util.HashMap;
11 import java.util.Map;
12 
13 public class PDFUtil {
14 
15     private static void insertImage(AcroFields form, PdfStamper stamper, String filedName, String url) throws IOException, DocumentException {
16         int pageNo = form.getFieldPositions(filedName).get(0).page;
17         Rectangle signRect = form.getFieldPositions(filedName).get(0).position;
18         float x = signRect.getLeft();
19         float y = signRect.getBottom();
20 
21         Image image = Image.getInstance(url);
22         // 获取操作的页面
23         PdfContentByte under = stamper.getOverContent(pageNo);
24         // 根据域的大小缩放图片
25         image.scaleToFit(signRect.getWidth(), signRect.getHeight());
26         // 添加图片
27         image.setAbsolutePosition(x, y);
28         under.addImage(image);
29     }
30 
31     public static Boolean pdfTemplateInsert(String templateUrl, String outputFileUrl, Map<String, Object> templateValueMap, Map<String, String> templateImageMap) {
32         boolean success = true;
33 
34         OutputStream os = null;
35         PdfStamper ps = null;
36         PdfReader reader = null;
37         try {
38             os = Files.newOutputStream(new File(outputFileUrl).toPath());
39             //读取pdf表单
40             reader = new PdfReader(templateUrl);
41             //根据表单生成一个新的pdf文件
42             ps = new PdfStamper(reader, os);
43             //获取pdf表单
44             AcroFields form = ps.getAcroFields();
45             //给表单中添加中文字体
46             BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
47             form.addSubstitutionFont(bf);
48             if (null != templateValueMap && !templateValueMap.isEmpty()) {
49                 for (String key : templateValueMap.keySet()) {
50                     form.setField(key, String.valueOf(templateValueMap.get(key)));
51                 }
52             }
53 
54             if (null != templateImageMap && !templateImageMap.isEmpty()) {
55                 for (String key : templateImageMap.keySet()) {
56                     insertImage(form, ps, key, templateImageMap.get(key));
57                 }
58             }
59             ps.setFormFlattening(true);
60         } catch (Exception e) {
61             success = false;
62         } finally {
63             try {
64                 ps.close();
65                 reader.close();
66                 os.close();
67             } catch (Exception e) {
68                 e.printStackTrace();
69             }
70         }
71         return success;
72     }
73 
74 
75     public static void main(String[] args) {
76         //模板路径
77         String inputUrl = "E:/Desktop/test/demo/itext-demo.pdf";
78         //生成的文件路径
79         String outputUrl = "E:/Desktop/test/demo/itext-demo-output.pdf";
80         Map<String, Object> data = new HashMap<>();
81         data.put("name", "张山");
82         data.put("year", "2000年10月");
83         data.put("phone", "13032451234");
84         data.put("gangwei", "Java开发");
85         data.put("introduceOneself", "熟练使用Java常用框架:Spring 、mybatis等");
86         //图片地址
87         String imageUrl = "E:/Desktop/test/demo/1.jpeg";
88         Map<String, String> templateImageMap = new HashMap<>();
89         templateImageMap.put("image", imageUrl);
90 
91         PDFUtil.pdfTemplateInsert(inputUrl, outputUrl, data, templateImageMap);
92     }
93 }
PDFUtil
执行结果 

 

 

转自:https://blog.csdn.net/HP1004/article/details/131912387

 

 

 

 

 

标签:Java,String,form,表单,itext,PDF,import,templateImageMap
From: https://www.cnblogs.com/zt007/p/18034153

相关文章

  • 万字Java进阶笔记总结
    JavaApi字符串String注意:Java中“==”操作符的作用:基本数据类型:比较的是内容。引用数据类型比较的是对象的内存地址。StringBuffer/StringBuilder由于String是字符串是常量,它们的值在创建之后不能更改。如果我们使用这个String频繁进行操作,会有性能问题,这个时候就需要......
  • 卡码java基础课 | 4.A+B问题IV
    学习内容:累加操作算术运算符赋值运算符三元运算符重点归纳:三元运算符:c=a>b?a:b;a>b是expresssion表达式,如果这个表达式的判定结果是true的话,则取得?后面第一个值,即a的值,如果判断结果为false的话,则取得:后面的值,即b的值。例题:解:点击查看代码imp......
  • 卡码java基础课 | 3.A+B问题III
    学习内容:if语句关系运算符逻辑运算符break语句continue语句重点归纳:break和continue的用法和区别break:跳出循环continue:直接从头开始执行循环内结构,跳过continue后剩余的代码例题:解:点击查看代码importjava.util.Scanner;publicclassMain{publicstaticv......
  • vue3+vite使用vue-pdf-embed或者pdf-vue3预览 PDF 文件(能躲避 XSS 攻击,需要 pdf 文件
    1.使用vue-pdf-embed1.npm安装所需插件[email protected]@0.1.62.封装组件(创建pdfPriview.index文件)<template><divclass="pdf-preview"> <vue-pdf-embed :source="state.source" v-for="pageinstate......
  • java异步编排工具-asyncTool
    一、介绍一款开源工具AsyncTool:https://gitee.com/jd-platform-opensource/asyncTool是由京东零售的高级工程师编写的,提供了非常丰富的异步编排功能,并且经过了京东内部的测试,是对CompletableFuture的封装和补足二、引入1)、不推荐:maven引入,这个比较坑,客观原因经常会导致依赖下......
  • 教你如何判断Java代码中异步操作是否完成
    本文分享自华为云社区《java代码实现异步返回结果如何判断异步执行完成》,作者:皮牙子抓饭。在许多应用程序中,我们经常使用异步操作来提高性能和响应度。在Java中,我们可以使用多线程或者异步任务来执行耗时操作,并且在后台处理过程完成后获取结果。但是,在使用异步操作时,我们通常需......
  • JavaFlink系列之一:Maven程序搭建及Java入门案例多种写法
    JavaFlink系列之一:Maven程序搭建及Java入门案例多种写法 一、Flink项目依赖配置<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://maven.apache.org/POM/4.0.0"......
  • java实现scp功能实现目录下所有文件拷贝至指定服务器
    1、添加pom依赖<dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.55</version></dependency>2、示例代码publicstaticvoidmain(String[]args)throwsIOException{try{......
  • Java中的数组-暂未完结
    数组的定义数组是相同类型数据的有序集合数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。◆其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们。数组声明创建◆首先必须声明数组变量,才能在程序中使用数组。下面是声明数组变量的......
  • Java HashMap merge() 方法
    在3020.子集中元素的最大数量【力扣周赛382】用哈希表统计元素个数使用点击查看代码classSolution{publicintmaximumLength(int[]nums){Map<Long,Integer>cnt=newHashMap<>();for(intx:nums){cnt.merge((long)x,1,In......