本文主要是介绍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 下载的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!