一、创立pdf模板
应用PDFelement制作pdf模板(数据域的名称对应前面插入的key)
二、导入maven依赖
<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>
《2020最新Java根底精讲视频教程和学习路线!》
三、插入数据和图片到pdf模板
Map<String, Object> data;//要插入的数据 //初始化itext //设置编码 BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED); PdfReader pdfReader=new PdfReader(“pdf模板文件门路”); PdfStamper pdfStamper=new PdfStamper(pdfReader, new FileOutputStream(“输入pdf文件门路”)); AcroFields form = pdfStamper.getAcroFields(); form.addSubstitutionFont(baseFont); //写入数据 for(String key:data.keySet()){ String value=data.get(key).toString(); //key对应模板数据域的名称 form.setField(key,value); } //增加图片 int pageNo = form.getFieldPositions("img").get(0).page; Rectangle signRect = form.getFieldPositions("img").get(0).position; float x = signRect.getLeft(); float y = signRect.getBottom(); Image image = Image.getInstance("图片门路"); PdfContentByte under = pdfStamper.getOverContent(pageNo); //设置图片大小 image.scaleAbsolute(signRect.getWidth(), signRect.getHeight()); //设置图片地位 image.setAbsolutePosition(x, y); under.addImage(image); //设置不可编辑 pdfStamper.setFormFlattening(true); pdfStamper.close();
PS:合并多个pdf成一个
//先删除之前的all.pdf String filePath="all.pdf"; File file=new File(filePath); file.delete(); //要合并的所有pdf的门路 List<String> fileList; //all.pdf保留门路 String savepath="all.pdf"; Document document = null; try { document = new Document(new PdfReader(fileList.get(0)).getPageSize(1)); PdfCopy copy = new PdfCopy(document, new FileOutputStream(savepath)); document.open(); for (int i = 0; i < fileList.size(); i++) { PdfReader reader = new PdfReader(fileList.get(i)); int n = reader.getNumberOfPages();// 取得总页码 for (int j = 1; j <= n; j++) { document.newPage(); PdfImportedPage page = copy.getImportedPage(reader, j);// 从以后Pdf,获取第j页 copy.addPage(page); } } } catch (IOException e) { e.printStackTrace(); } catch (DocumentException e) { e.printStackTrace(); } finally { if (document != null) { document.close(); } }
上面代码是用在我的项目中应用得截取局部作为参考:
// 保留门路 生成
String savePath = GlConfig.getDownloadResourcePath() + "student/" + student.getName() + "ClassHoursProve.pdf"; // 生成 pdf PdfUtil.exportTemplateByPdf(savePath, dto.toJson(), path);
pdfUtil
package com.gl.common.file.util;import cn.hutool.core.io.resource.ResourceUtil;import cn.hutool.json.JSONObject;import com.itextpdf.text.Document;import com.itextpdf.text.Image;import com.itextpdf.text.PageSize;import com.itextpdf.text.Rectangle;import com.itextpdf.text.pdf.*;import lombok.extern.slf4j.Slf4j;import org.apache.commons.io.IOUtils;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.OutputStream;import java.net.URL;import java.util.Map;@Slf4jpublic class PdfUtil { /** * 学时证实模板门路 */ public static final URL TEMPLATE_URL = ResourceUtil.getResource("template/ClassHoursProve.pdf"); /** * 导出PDF办法 * * @param savePath 保留服务器门路 * @param obj 导出的参数 */ public static void exportTemplateByPdf(String savePath, JSONObject obj,String filePath) { PdfReader reader = null; ByteArrayOutputStream bos = null; PdfStamper stamper = null; OutputStream os = null; FileOutputStream out = null; File file; Document document = null; PdfCopy copy = null; Document doc = null; try { /** 实例化文档对象 */ document = new Document(PageSize.A4, 50, 40, 40, 50); /** 创立 PdfWriter 对象 */ // 打开文档 document.open(); /** pdf文档中中文字体的设置,留神肯定要增加iTextAsian.jar包 */ String localFontPath = "c:windowsfonts"; BaseFont bfChinese = BaseFont.createFont(localFontPath + "simhei.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); FileUtils.deleteFile(savePath); file = new File(savePath); if (!file.getParentFile().exists()) { file.getParentFile().mkdirs(); } out = new FileOutputStream(file); reader = new PdfReader(TEMPLATE_URL); bos = new ByteArrayOutputStream(); stamper = new PdfStamper(reader, bos); AcroFields form = stamper.getAcroFields(); // 文字类的内容解决 form.addSubstitutionFont(bfChinese); String vlaues; for (Map.Entry<String, Object> entry : obj.entrySet()) { vlaues = String.valueOf(entry.getValue()); if ("photo".equals(entry.getKey()) || "qrcode".equals(entry.getKey())) { try { // 通过域名获取所在页和坐标,左下角为终点 int pageNo = form.getFieldPositions(entry.getKey()).get(0).page; Rectangle signRect = form.getFieldPositions(entry.getKey()).get(0).position; // 印章地位 Rectangle seal_signRect = form.getFieldPositions("month").get(0).position; float x = signRect.getLeft(); float y = signRect.getBottom(); // 印章坐标地位 float seal_x = seal_signRect.getLeft(); float seal_y = seal_signRect.getBottom(); // 读图片 Image image = Image.getInstance(vlaues); Image seal_image = Image.getInstance(filePath); // 获取操作的页面 PdfContentByte under = stamper.getOverContent(pageNo); // 依据域的大小缩放图片 image.scaleToFit(signRect.getWidth(), signRect.getHeight()); seal_image.scaleToFit(signRect.getWidth(), signRect.getHeight()); // 增加图片 image.setAbsolutePosition(x, y); seal_image.setAbsolutePosition(seal_x, seal_y); under.addImage(image); under.addImage(seal_image); } catch (Exception e) { log.info(e.getMessage()); } } else { if ("fileno".equals(entry.getKey())) { form.setFieldProperty(entry.getKey(), "textsize", 50f, null); } else { form.setFieldProperty(entry.getKey(), "textsize", 10f, null); } form.setField(entry.getKey(), vlaues); } } // 如果为false,生成的PDF文件能够编辑,如果为true,生成的PDF文件不能够编辑 stamper.setFormFlattening(true); stamper.close(); doc = new Document(); copy = new PdfCopy(doc, out); doc.open(); PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1); copy.addPage(importPage); doc.close(); document.close(); copy.flush(); copy.close(); } catch (Exception e) { log.info(e.getMessage()); } finally { try { if (stamper != null) { stamper.close(); stamper = null; } if (reader != null) { reader.close(); reader = null; } IOUtils.closeQuietly(os); IOUtils.closeQuietly(bos); IOUtils.closeQuietly(out); if (document != null) { document.close(); document = null; } if (doc != null) { doc.close(); doc = null; } if (copy != null) { copy.flush(); copy.close(); copy = null; } } catch (Exception ignored) { } } }}
链接地址:https://blog.csdn.net/Aurora_____/article/details/111209096