itextpdf 利用模板生成pdf 下载

2024-01-19 17:50

本文主要是介绍itextpdf 利用模板生成pdf 下载,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、编辑pdf 模板,编辑表单域,用来填充内容,也可填充图片。利用Adobe Acrobat DC 工具制作模板

2、编写代码

生成后效果图如下

在这里插入图片描述

1、制作pdf模板

Adobe Acrobat DC 打开pdf文件,工具-> 准备表单

或者 右键->添加文本域

编辑好后如下图
在这里插入图片描述

2、代码部分

2.1、pom 文件引入依赖
<!-- pdf start -->
<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13</version>
</dependency>
<dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version>
</dependency>
<!-- pdf end -->
2.2、编写controller、页面请求下载
package com.example.pdfdemo.controller;import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.*;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;@RestController
public class PDFController {/*** 模拟填充pdf的数据* key 对应模板中填充字段名*/public static Map<String,Map> mockData(){Map<String,Map> map = new HashMap<>();// 模板中需要填充的数据Map data = new HashMap<String, String>();data.put("name","Anna");data.put("age","23");data.put("phone","13888888888");data.put("email","123456@qq.com");data.put("address","上海市浦东新区");data.put("work","5年");data.put("projects","Here, fill in part of project experience" +"At least 2-3 years of NGO working experiences in gender program, with the specialty of promoting of women's rights and empowermen" +"at least 3 years working experience in automotive industry, oem project experiences will be a plus");//头像 图片 urlMap image = new HashMap<String, String>();image.put("image","D:\\PDF-TEST\\tx.jpg");map.put("data",data);map.put("image",image);return map;}@GetMapping("/pdf")public void downLoadPdf(HttpServletResponse response){try{//模板文件String sourceFile = "D:\\PDF-TEST\\blog.pdf";//下载后pdf名String fileName = "pdf-test";response.setHeader("content-disposition", "attachment;filename=" + fileName + ".pdf");response.setContentType("application/octet-stream");OutputStream out = response.getOutputStream();//输出到本地
//            FileOutputStream out = new FileOutputStream("D:\\test.pdf");//读取模板PdfReader  reader = new PdfReader(sourceFile);PdfStamper pdfStamper = new PdfStamper(reader, out);//设置字体格式BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);ArrayList<BaseFont> fontList = new ArrayList<>();fontList.add(baseFont);//获取模板文件中的表单域AcroFields afs = pdfStamper.getAcroFields();afs.setSubstitutionFonts(fontList);//填充文本dataMap data = mockData().get("data");for (Map.Entry<String, AcroFields.Item> entry : afs.getFields().entrySet()) {if (!CollectionUtils.isEmpty(data) && data.get(entry.getKey()) != null) {//Field , 这个是自己在pdf上定义的变量名称afs.setField(entry.getKey(), data.get(entry.getKey()).toString(), true);}}// 处理图片Map imageMap = mockData().get("image");for (Map.Entry<String, AcroFields.Item> entry : afs.getFields().entrySet()) {if (!CollectionUtils.isEmpty(imageMap) && imageMap.get(entry.getKey()) != null) {String key = entry.getKey();String value = imageMap.get(entry.getKey()).toString();int pageNo = afs.getFieldPositions(key).get(0).page;Rectangle signRect = afs.getFieldPositions(key).get(0).position;float x = signRect.getLeft();float y = signRect.getBottom();//根据路径读取图片Image image = Image.getInstance(value);//获取图片页面PdfContentByte under = pdfStamper.getOverContent(pageNo);//图片大小自适应image.scaleToFit(signRect.getWidth(), signRect.getHeight());//添加图片image.setAbsolutePosition(x, y);under.addImage(image);}}pdfStamper.setFormFlattening(true);pdfStamper.close();out.close();}catch (Exception e){e.printStackTrace();}}
}

这篇关于itextpdf 利用模板生成pdf 下载的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/623202

相关文章

Python如何自动生成环境依赖包requirements

《Python如何自动生成环境依赖包requirements》:本文主要介绍Python如何自动生成环境依赖包requirements问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录生成当前 python 环境 安装的所有依赖包1、命令2、常见问题只生成当前 项目 的所有依赖包1、

前端下载文件时如何后端返回的文件流一些常见方法

《前端下载文件时如何后端返回的文件流一些常见方法》:本文主要介绍前端下载文件时如何后端返回的文件流一些常见方法,包括使用Blob和URL.createObjectURL创建下载链接,以及处理带有C... 目录1. 使用 Blob 和 URL.createObjectURL 创建下载链接例子:使用 Blob

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

MySQL中动态生成SQL语句去掉所有字段的空格的操作方法

《MySQL中动态生成SQL语句去掉所有字段的空格的操作方法》在数据库管理过程中,我们常常会遇到需要对表中字段进行清洗和整理的情况,本文将详细介绍如何在MySQL中动态生成SQL语句来去掉所有字段的空... 目录在mysql中动态生成SQL语句去掉所有字段的空格准备工作原理分析动态生成SQL语句在MySQL

详解如何通过Python批量转换图片为PDF

《详解如何通过Python批量转换图片为PDF》:本文主要介绍如何基于Python+Tkinter开发的图片批量转PDF工具,可以支持批量添加图片,拖拽等操作,感兴趣的小伙伴可以参考一下... 目录1. 概述2. 功能亮点2.1 主要功能2.2 界面设计3. 使用指南3.1 运行环境3.2 使用步骤4. 核

Java利用docx4j+Freemarker生成word文档

《Java利用docx4j+Freemarker生成word文档》这篇文章主要为大家详细介绍了Java如何利用docx4j+Freemarker生成word文档,文中的示例代码讲解详细,感兴趣的小伙伴... 目录技术方案maven依赖创建模板文件实现代码技术方案Java 1.8 + docx4j + Fr

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

详解C#如何提取PDF文档中的图片

《详解C#如何提取PDF文档中的图片》提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使用,下面我们就来看看如何使用C#通过代码从PDF文档中提取图片吧... 当 PDF 文件中包含有价值的图片,如艺术画作、设计素材、报告图表等,提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使