itext 动态的填充pdf

Java使用iText库动态填充PDF模板:从坐标定位到表单填充的完整实践 PDF文档的动态生成是Java后端开发中处理合同、报告、票据等场景的常见需求。其核心原理是通过程序化操作,在预先设计好的PDF模板的指定位置插入可变数据。实现这一功能的技术价值在于能自动化、批量化地生成格式统一且内容各异的文档,极大地提升了业务处理效率。在Java生态中,iText库因其成熟稳定的API成为处理此类任务的优选方案,尤其适用于发票、证书、工单等固定格式文档的批量生成场景。本文聚焦于使用iText库的`PdfStamper`进行模板填充,详细阐述了如何通过坐标定位或`AcroFields`操作表 阅读详情

iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。

     下面简单的整理几个操作pdf相关实例。

1.PDF模版填充

     首先需要有一个pdf文件作为模版,可以用如adobe acrobat等工具,添加几个文本域在pdf中,下面就是模版完成后的部分截图。

Java代码  

 * @throws IOException 
 * @throws DocumentException 
 */  
@SuppressWarnings("unchecked")  
@Test  
public void fillTemplate()  
        throws IOException, DocumentException {  
    PdfReader reader = new PdfReader(templateFile); // 模版文件目录  
    PdfStamper ps = new PdfStamper(reader, new FileOutputStream(  
            "f:/fillTemplate.pdf")); // 生成的输出流  
    // ByteArrayOutputStream bos = new ByteArrayOutputStream();  
    // PdfStamper ps = new PdfStamper(reader, bos);  
  
    AcroFields s = ps.getAcroFields();  
  
    Map<String, Object> fieldMap = s.getFields(); // pdf表单相关信息展示  
    for (Map.Entry<String, Object> entry : fieldMap.entrySet()) {  
        String name = entry.getKey(); // name就是pdf模版中各个文本域的名字  
        Item item = (Item) entry.getValue();  
        System.out.println("[name]:" + name + ", [value]: " + item);  
    }  
  
    s.setField("CUSTOMERNAME", "as该多好公司");  
    s.setField("TEL", "123456asdzxc");  
    s.setField("CONTACT", "我是联系人123");  
  
    ps.setFormFlattening(true); // 这句不能少  
    ps.close();  
    reader.close();  
} 

输出的pdf文件内容:

注:默认情况下如果填充的字段值含中文时,将提示报错,这是因为没有IText相应的中文语言包,需要下载亚洲语言包,ITextAsian.jar。

如不想生成文件流(临时文件),可用ByteArrayOutputStream代替。

2.多个PDF合并

Java代码  

/** 
 * 多个PDF合并功能 
 *  
 * @param files 
 *            多个PDF的文件路径 
 * @param os 
 *            生成的输出流 
 */  
public static void mergePdfFiles(String[] files, OutputStream os) {  
    try {  
        Document document = new Document(  
                new PdfReader(files[0]).getPageSize(1));  
        PdfCopy copy = new PdfCopy(document, os);  
        document.open();  
        for (int i = 0; i < files.length; i++) {  
            PdfReader reader = new PdfReader(files[i]);  
            int n = reader.getNumberOfPages();  
            for (int j = 1; j <= n; j++) {  
                document.newPage();  
                PdfImportedPage page = copy.getImportedPage(reader, j);  
                copy.addPage(page);  
            }  
        }  
        document.close();  
    } catch (IOException e) {  
        e.printStackTrace();  
    } catch (DocumentException e) {  
        e.printStackTrace();  
    }  
}  

如果想要直接合并输出流,可以换成输出流的集合

Java代码  

/** 
 * 多个PDF合并功能  
 * @param osList 
 * @param os 
 */  
public static void mergePdfFiles(List<ByteArrayOutputStream> osList,  
        OutputStream os) {  
    try {  
        Document document = new Document(new PdfReader(osList.get(0)  
                .toByteArray()).getPageSize(1));  
        PdfCopy copy = new PdfCopy(document, os);  
        document.open();  
        for (int i = 0; i < osList.size(); i++) {  
            PdfReader reader = new PdfReader(osList.get(i).toByteArray());  
            int n = reader.getNumberOfPages();  
            for (int j = 1; j <= n; j++) {  
                document.newPage();  
                PdfImportedPage page = copy.getImportedPage(reader, j);  
                copy.addPage(page);  
            }  
        }  
        document.close();  
    } catch (IOException e) {  
        e.printStackTrace();  
    } catch (DocumentException e) {  
        e.printStackTrace();  
    }  
}  

3.PDF分割

Java代码  

/** 
 * 单个Pdf文件分割成N个文件 
 *  
 * @param filepath 
 * @param N 
 */  
public static void partitionPdfFile(String filepath, int N) {  
    Document document = null;  
    PdfCopy copy = null;  
  
    try {  
        PdfReader reader = new PdfReader(filepath);  
        int n = reader.getNumberOfPages();  
        if (n < N) {  
            System.out.println("The document does not have " + N  
                    + " pages to partition !");  
            return;  
        }  
        int size = n / N;  
        String staticpath = filepath.substring(0,  
                filepath.lastIndexOf("\\") + 1);  
        String savepath = null;  
        List<String> savepaths = new ArrayList<String>();  
        for (int i = 1; i <= N; i++) {  
            if (i < 10) {  
                savepath = filepath.substring(  
                        filepath.lastIndexOf("\\") + 1,  
                        filepath.length() - 4);  
                savepath = staticpath + savepath + "0" + i + ".pdf";  
                savepaths.add(savepath);  
            } else {  
                savepath = filepath.substring(  
                        filepath.lastIndexOf("\\") + 1,  
                        filepath.length() - 4);  
                savepath = staticpath + savepath + i + ".pdf";  
                savepaths.add(savepath);  
            }  
        }  
  
        for (int i = 0; i < N - 1; i++) {  
            document = new Document(reader.getPageSize(1));  
            copy = new PdfCopy(document, new FileOutputStream(  
                    savepaths.get(i)));  
            document.open();  
            for (int j = size * i + 1; j <= size * (i + 1); j++) {  
                document.newPage();  
                PdfImportedPage page = copy.getImportedPage(reader, j);  
                copy.addPage(page);  
            }  
            document.close();  
        }  
  
        document = new Document(reader.getPageSize(1));  
        copy = new PdfCopy(document, new FileOutputStream(  
                savepaths.get(N - 1)));  
        document.open();  
        for (int j = size * (N - 1) + 1; j <= n; j++) {  
            document.newPage();  
            PdfImportedPage page = copy.getImportedPage(reader, j);  
            copy.addPage(page);  
        }  
        document.close();  
  
    } catch (IOException e) {  
        e.printStackTrace();  
    } catch (DocumentException e) {  
        e.printStackTrace();  
    }  
}  

4.在Servlet中调用IText返回给客户端

a.将文件流直接返回给客户端

Java代码    

@Override  
protected void doGet(HttpServletRequest req, HttpServletResponse resp)  
        throws ServletException, IOException {  
    resp.setContentType("application/pdf");  
    ServletOutputStream sos = resp.getOutputStream();  
    FileInputStream in = new FileInputStream("f:/fillTemplate.pdf");  
    byte data[] = new byte[1024];  
  
    int len = 0;  
    while ((len = in.read(data)) != -1) {  
        sos.write(data, 0, len);  
    }  
    sos.flush();  
    in.close();  
    sos.close();  
}

b.填充模版文件后将输出流返回给客户端

Java代码  

@Override  
protected void doGet(HttpServletRequest req, HttpServletResponse resp)  
        throws ServletException, IOException {  
    resp.setContentType("application/pdf");  
  
    ByteArrayOutputStream baos = new ByteArrayOutputStream();  
    PdfReader reader = null;  
    PdfStamper ps = null;  
    try {  
        reader = new PdfReader(""); // 模版文件目录  
        ps = new PdfStamper(reader, baos);  
        AcroFields s = ps.getAcroFields();  
        s.setField("CUSTOMERNAME", "as该多好公司");  
        s.setField("TEL", "123456asdzxc");  
        s.setField("CONTACT", "我是联系人123");  
  
        ps.setFormFlattening(true); // 这句不能少  
        ps.close();  
        reader.close();  
    } catch (DocumentException e) {  
        e.printStackTrace();  
    }  
    ServletOutputStream sos = resp.getOutputStream();  
    baos.writeTo(sos);  
    sos.flush();  
    sos.close();  
}  

 

    上面转载自:点击打开链接

上面是转自别的博主,主要是itext对pdf的基本操作,下面主要说自己工作中遇到的问题: 怎么动态选中选框:

编辑工具:adobe

1 在itext 中的指定位置插入单选框或者复选框

2 双击选项框,然后点击:选框->导出值(填写成:true)

3 想让其选中,直接在Java中给对应的名称赋值为:true 则可以了。

     

使用iTextPdf为Pdf模板填充表单项 说明 日常开发中,通常会有动态填充Pdf表单的需求,程序可根据用户的输入或后台数据库的内容,动态、批量向Pdf模板中填充内容。 这里简单介绍一下Pdf模板的制作,以及通过iTextPdf组件给pdf Form表单进行内容填充。 Pdf模板制作 1、word中制作表格 使用Office word 或 WPS word,制作出一个表格,通过表格底色,颜色、字体设置、对齐等方式美化一下表格。 效果图如下: 2、word导出为pdf 可以使用WPS的另存为功能,将word导出为pdf文件 导出完的pdf文件,效果 阅读详情

相关推荐

java在pdf模板中插入数据

一,准备工作 1,需要下载一个工具,Adobe Accrobat Pro DC 2,准备一个word文档,然后保存为pdf格式 这边需要插入数据的地方要用下划线,不然识别不到; 3,在Adobe Accrobat Pro DC中打开保存的pdf文件,然后如下图所示 这些黑底的字,就是要插入的数据的类似占位符(个人理解);可以根据自己需求更改如下图所示;比如我把fill_1_2改成title 4,准备依赖 <dependency> ..

ipa0504的博客 3926

itext 生成 PDF(一)

itext画PDF

猪之仆的博客 2万+

基于iText7的PDF表单动态填充与中文字体适配实战指南

本文详细介绍了基于iText7的PDF表单动态填充技术,特别针对中文字体适配问题提供了实战解决方案。通过模块化设计、性能优化和字体支持等核心功能,iText7显著提升了PDF表单处理的效率和可靠性。文章包含从模板创建到Java代码实现的完整指南,帮助开发者快速掌握动态填充技术并解决中文乱码等常见问题。

weixin_29000991的博客 311

Java导出PDF(itextpdf)-通俗易懂

Java导出PDF(itextpdf)-一文带你快速进入itextpdf,快速完成自己的业务功能

weixin_45116026的博客 2万+

导出为PDF系列(一)__java后台传PDF文件

写在之前:导出PDF系列会有三篇,方法思路都是查了大量资料,参考了很多博客文章,链接全部贴上来有点不现实,如果有冒犯之处还请指出,马上改正。如果有疑问,欢迎留言评论,必定竭尽全力答复,接下来就开始吧。 用PDF将模板写死,内容动态填充 这里以导出以下页面为例 (1)新建一个word文档,设计以上内容,文件另存为PDF (2)用adobe acrobat pro dc打开刚刚保存的p...

yyyadan的博客 2940

java之数据填充PDF模板

1、既然要使用PDF模板填充,那么就需要制作PDF模板,可以使用Adobe Acrobat DC,下载地址:https://carrot.ctfile.com/dir/11269771-27158812-194d66/29433907/(使用特别破解版),安装步骤就省略了。 2、开始制作模板   a)使用wps制作一个表格,并转为PDF文件保存  b)使用Adobe Acrobat DC打开保存的PDF文件,然后搜索 "准备表单" ,点击 ”准备表单“,然后出来表单域 3、程序部分 a).

技术分享 3727

掌握iText:轻松实现固定pdf模板的动态数据填充

如果你在工作中需要处理大量的PDF表单,那么使用iText5实现固定PDF模板的动态数据填充,将是一种非常有效的方法。这篇技术文章详细介绍了如何使用iText5库来读取已有的PDF模板,并动态地填充表单数据,生成最终的表单文件。通过这种方法,你可以大大提高工作效率,同时保证表单的格式和布局的统一性。无论你是企业员工、自由职业者还是个人用户,都可以从中受益。如果你想要掌握这种有用的技术,不妨看看这篇文章,相信会对你有所帮助。在工作和生活中,很多人都会遇到需要填写各种业务表单的情况。这些表单可能是申请表、报销单

凡夫编程 4060

使用iText实现数据库数据动态填充到PDF模板的项目教程

iText是一个用于创建和操作PDF文档的Java库。它提供了一套丰富的API,使开发者能够生成复杂的PDF文档,以及从现有PDF文件中提取内容。iText库广泛应用于报表生成、合同填充、表单处理等场景。作为一个开源库,iText在遵守AGPL协议的情况下免费使用,或者通过商业许可来使用其附加的特性。AcroFields对象是iText库中用于处理PDF表单字段的核心组件。它允许开发者读取、写入和修改PDF表单的数据,并提供了一系列方法来处理表单字段的各种属性。

weixin_35671843的博客 1450

Itext 7 生成PDF总结

前言:生成pdf有很多种方法,本文使用itextpdf 7 生成 1、根据PDF的需求分为静态数据动态数据以及特殊数据 1).静态数据是数据固定,所以我们采用模板的方式进行生成-----itextpdf + Adobe Acrobat DC 填充模板生成 Adobe Acrobat DC可以在网上下载绿色版 (1).先将文件通过WPS生成PDF文件 (2).用Adobe Acrobat DC打开文件进行准备表单 (3).配置好对应字段的表单域 (4).传入数据进行打印 2).动态数据是数据不

weixin_55631086的博客 2574

Dify学习-19-EXCEL数据如何建立知识库+知识库的学习ING

Args:"""定义类,继承自类文档字符串说明这个类用于加载Excel文件这个类提供了从Excel文件(.xls和.xlsx)中提取数据并转换为文档列表的功能。处理两种Excel格式保留超链接信息跳过空行将每行数据转换为键值对格式的文档在元数据中保留源文件信息对于.xlsx文件使用openpyxl处理,可以获取更多单元格信息(如超链接);对于.xls文件则使用pandas的xlrd引擎处理。

Claire的博客 3435

Nest的限流方案

多维度限流(如 IP、用户 ID、接口级别、请求类型)可配置化(支持不同环境和接口动态配置)可观测性(接入日志、监控系统)高性能和分布式支持(Redis 限流器)与鉴权鉴权链路集成(结合 JWT、API Token)以下是一个“标准// 优先按用户ID限流,否则按IP在main.ts维度建议限流存储推荐 Redis 支持多实例限流 Key 设计支持 IP + 用户ID + 路由等多种维度限流策略精细化配置,接口粒度调整异常处理自定义响应体、日志告警观测性。

Bruce__taotao的博客 1197

Java IText PDF分页模板制作 输出

相信很多朋友在项目中或多或少会遇到报表打印的需求,然而精确套打的实现更是一份苦差呀。近日在网上找到一份chm文档,虽然这是某家公司产品开发文档(大家不要误会,我可不是想在这做广告哦,这个产品要是免费就更好了,呵呵),但是对PDF模板制作有很详细的讲解,而且里面还有视频。。。相信大

binyao02123202的专栏 1万+

【JTAG】1500协议详解

随着集成电路的规模不断扩大,1149.1的板级测试无法满足要求越来越高的芯片测试需求。芯片规模变大后,测试需求不在是一次测试整片芯片,而是芯片分为好几个区域去测试,而1500协议正是对1149.1在该方面的一个补充即1149.1主要测试板级间的互连,而1500用来测试芯片内不同core之间的互连。IEEEStd1500已经为包含不同模块的集成电路(ICs)开发了一种可测试性设计标准方法。............

xuhe0206的博客 7026

Java 生成各种 PDF 实战方案(图片、模板、表格)

本篇文章的重点还是在讲通过java生成pdf,其实如果是单纯的模板填充挺简单的,但是又要填充模板还要动态生成表格就比较麻烦了,因为如果在模板中画表格的框去生成的话,超过模板框的位置就会隐藏,我刚接到需求的时候也是有点难受,在网上也是找了大量的资料,研究了半天,发现好多都是你粘贴我,我粘贴你,最终我也算是搞成了,把这些整合一下,让大家用的好用一些,废话不多说,直接上代码!可以看到,我们在代码中并没有新开一页,只是加了一个间隙,就可以保证动态生成的表格和模板在一个页面,就此,基本上就算完成了。

qq_42633395的博客 2860

Python爬虫实战:构建高可用静态网页爬虫 - 以 Quotes 网站数据采集为例!

我长期专注 Python 爬虫工程化实战,主理专栏 《Python爬虫实战》:从采集策略到反爬对抗,从数据清洗到分布式调度,持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”,让数据价值真正做到——抓得到、洗得净、用得上。

喵手的博客 461

2026年华为OD机试真题 新系统【点亮战争迷雾】

华为OD机试真题 8月18号 新系统【点亮战争迷雾】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【点亮战争迷雾】多语言题解。

qq_45776114的博客 497

itext根据数据生成PDF

前言: 使用模板的方式开生成PDF文件 1.下载Adobe Acrobat DC,使用正式版(可以试用7天) 2.打开模板编辑表单域: 选择工具–>准备表单 3.编辑文本域属性 根据要求的模板设置文本域-本例只是测试,就放单个 4.码代码 import com.alibaba.fastjson.JSONObject; import com.itextpdf.text.pdf.*; import org.apache.commons.fileupload.FileItem; import org.

one大白(●—●)的博客 836

姿态传感器/陀螺仪之BMI270应用原理图设计

BMI270是一款由博世(Bosch)推出的高性能、超低功耗惯性测量单元(IMU),专为可穿戴设备、智能设备及物联网应用设计。

corlin6688的博客 2864

Java IText使用PDF模板 生成 输出PDF

转载自:http://blog.csdn.net/binyao02123202/article/details/6773986 这是本人学习ITEXT的一些小实践,希望可以帮到大家。这也是我第一次写这种类型博客,如有不好之处欢迎指出!!下面我们开始吧!  本文所要用到的工具或jar主要有: Acrobat 8 这个主要用来制作PDF模板、eclipse这个看你喜欢咯(你用其他也行) 、 i

This My Life - chisj 4178

详解AUTOSAR:专栏总述

本专栏系统介绍AUTOSAR规范及车用控制器软件开发,内容覆盖基础架构、SWC/RTE、通信栈、诊断、存储、安全、看门狗、工具链、环境配置与项目实战,并持续更新各模块的集成机制与工程要点。

不脱发的程序猿 3926

移动机器人路径规划中噪声环境下的鲁棒性测试仿真

设计一个二维或三维环境模型,包括静态障碍物和可能存在的动态障碍物。

amy_mhd的博客 126

根据模板PDF动态插入数据(合同等)

准备工作: Adobe Acrobat DC PDF编辑器 准备一个PDF文件 1,编辑PDF,点击左上角得下拉框,选择准备表单 2,右键选择文本域 3,双击文本域,弹出文本域属性弹出框,可编辑文本域Key 4,编辑好,点击关闭即可(其他得文本域同理设置即可) 5,全部设置完后点击保存 JAVA代码段: package com.bscc.modules.econtract.util; import com.alibaba.fastjson.JSONObject; .

zhh1996075的博客 1270

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

生成可编辑的pdf(可java代码动态赋值)

pdf文件动态签章以及生成动态信息 步骤1.conversionItextPdf(将pdf转换成编码软件为Itext的pdf) 代码如下 public void conversionItextPdf() throws Exception { String newfile = "D:\\Users\\v_songfeng\\Desktop\\合同模板\\正式合同\\ItextPDF\...

小处诚实非小事 3125

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Java 实现 pdf 和 Excel 的生成及数据动态插入、导出

转载:https://mp.weixin.qq.com/s/xVmpgSMs8ROir3krVtoBEg 一、序言 Excel、PDF的导出、导入是我们工作中经常遇到的一个问题,刚好今天公司业务遇到了这个问题,顺便记个笔记以防下次遇到相同的问题而束手无策。 公司有这么两个需求: 需求一、给了一个表单,让把查出来的数据组装到表单中并且提供以PDF格式的下载功能。 需求二、将数据查出来以Excel表格的形式下载下来。 二、Java实现PDF的生成和数据动态插入、导出功能 1、第一步:PDF制作模板

lin的专栏 804

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

IText使用PDF模板输出报表的实践

这是本人学习ITEXT的一些小实践,希望可以帮到大家。这也是我第一次写这种类型博客,如有不好之处欢迎指出!!下面我们开始吧! 本文所要用到的工具或jar主要有: Acrobat 8 这个主要用来制作PDF模板、eclipse这个看你喜欢咯(你用其他也行) 、 itext.jar、 还有为了解决中文的输出问题,需要多下载一个名为iTextAsian.jar的JAR包。这个包里面定...

feiz3020的专栏 474

利用 iText 实现 PDF 模板导出功能详解

在企业应用中,PDF 文档生成是政务系统、教育管理系统、客户签约系统等场景中的核心功能。通过预定义的 PDF 模板动态填充数据,能够确保文档格式统一、数据准确,同时显著提升自动化效率。iText 作为一款功能强大的 PDF 操作库,支持表单域(AcroForm)的读取与填充,是此类需求的理想解决方案。通过 iText 结合 PDF 模板,我们可以轻松实现数据驱动的文档生成,极大提升文档生成的自动化程度。你可以将此能力封装为一个工具类,在项目中复用。

m0_65916942的博客 710
上一篇: uniapp,vue 修改v-html中的样式
下一篇: 通过CSS实现左右内凹圆形,彻底搞懂实现步骤
LiWang__
博客等级 码龄9年 63粉丝 20原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值