使用java直接生成pdf保存至本地路径
一.生成PDF模板
1.下载 Adobe Acrobat DC2020
百度网盘连接:https://pan.baidu.com/s/1v6K2-xeU79tkcNQ8WBoEYQ
提取码:july
2.准备自己的PDF模板
示例:
3.在软件中打开模板
(1). 点击工具–>准备表单
(2).导入自己准备的模板
(3).进入编辑表单页面,填写自己所需的变量(变量名称需和代码中一致。)
示例:
(4).双击变量名称可以修改字体大小样式和位置信息。
二.java代码实现
1.添加maven依赖
<!-- PDF工具类 --><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13</version></dependency><!-- PDF中文支持 --><dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency>
2.pdf.untils类
package com.jm.mvc.common.utils;import java.io.*;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;import com.lowagie.text.*;
import com.lowagie.text.pdf.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import com.alibaba.fastjson.JSON;
import com.lowagie.text.pdf.PdfReader;import javax.rmi.CORBA.Util;public class PdfUtils {private final static Logger log = LoggerFactory.getLogger(PdfUtils.class);// 利用模板生成pdf,这将直接保存到指定路径public static void pdfout(Map<String,Object> o,String templatePath,String newPDFPath) {PdfReader reader;FileOutputStream out=null;ByteArrayOutputStream bos=null;PdfStamper stamper;try {//系统字体String prefixFont = "";String os = System.getProperties().getProperty("os.name");if (os.startsWith("win") || os.startsWith("Win")) {System.out.println("windows");prefixFont = "C:\\Windows\\Fonts" + File.separator;} else {System.out.println("users");prefixFont = "/usr/share/fonts/chinese" + File.separator;}//必须加“,0”或“,1”,否则会报错:com.itextpdf.text.DocumentException: Font 'C:\Windows\Fonts\simsun.ttc' with 'Identity-H' is not recognized.BaseFont bf = BaseFont.createFont(prefixFont + "simsun.ttc,0" , BaseFont.IDENTITY_H, BaseFont.EMBEDDED);out = new FileOutputStream(newPDFPath);// 输出流reader = new PdfReader(templatePath);// 读取pdf模板bos = new ByteArrayOutputStream();stamper = new PdfStamper(reader, bos);AcroFields form = stamper.getAcroFields();//文字类的内容处理Map<String,String> datemap = (Map<String,String>)o.get("datemap");form.addSubstitutionFont(bf);for(String key : datemap.keySet()){//为了文字可以有下划线,并且换行,控制每行字数,当字数超过时,将剩余文字填充至下一备选域if ("hzbz".equals(key)){String hzbz = datemap.get(key);String[] hzbzArray = stringToStringArray(hzbz,24);for(int i = 0; i < hzbzArray.length; i++){String fkey = "hzbz-line" + (i+1);form.setField(fkey,hzbzArray[i]);}}else if("bz".equals(key)){String bz = datemap.get(key);String[] bzArray = stringToStringArray(bz,24);for(int i = 0; i < bzArray.length; i++){String fkey = "bz-line" + (i+1);form.setField(fkey,bzArray[i]);}}else{String value = datemap.get(key);form.setField(key,value);}}//图片类的内容处理
// Map<String, Image> imgmap = (Map<String,Image>)o.get("imgmap");
// for(String key : imgmap.keySet()) {
// Image value = imgmap.get(key);
// //String imgpath = value;
// Image image = value;
// int pageNo = form.getFieldPositions(key).get(0).page;
// Rectangle signRect = form.getFieldPositions(key).get(0).position;
// float x = signRect.getLeft();
// float y = signRect.getBottom();
// //根据路径读取图片
// //Image image = Image.getInstance(imgpath);
// //获取图片页面
// PdfContentByte under = stamper.getOverContent(pageNo);
// //图片大小自适应
// image.scaleToFit(signRect.getWidth(), signRect.getHeight());
// //添加图片
// image.setAbsolutePosition(x, y);
// under.addImage(image);
// }stamper.setFormFlattening(true);// 如果为false,生成的PDF文件可以编辑,如果为true,生成的PDF文件不可以编辑stamper.close();Document doc = new Document(PageSize.A4, 50, 40, 40, 50);PdfCopy copy = new PdfCopy(doc, out);doc.open();//form.getTotalRevisions();int pages= stamper.getReader().getNumberOfPages();for(int i=1;i<=pages;i++){PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), i);copy.addPage(importPage);}doc.close();} catch (IOException e) {log.error("pdfout",e);} catch (DocumentException e) {log.error("pdfout",e);} finally {if(out!=null){try{out.close();}catch(Exception e){}}if(bos!=null){try{bos.close();}catch(Exception e){}}}}// 将字符串按照指定长度分割成字符串数组public static String[] stringToStringArray(String src, int length) {//检查参数是否合法if (null == src || src.equals("")) {return null;}if (length <= 0) {return null;}int n = (src.length() + length - 1) / length; //获取整个字符串可以被切割成字符子串的个数String[] split = new String[n];for (int i = 0; i < n; i++) {if (i < (n - 1)) {split[i] = src.substring(i * length, (i + 1) * length);} else {split[i] = src.substring(i * length);}}return split;}public static byte[] inputstream2Bytes(InputStream inStream) throws IOException{byte[] in_b = null;try{ByteArrayOutputStream swapStream = new ByteArrayOutputStream();byte[] buff = new byte[100]; //buff用于存放循环读取的临时数据int rc = 0;while ((rc = inStream.read(buff, 0, 100)) > 0) {swapStream.write(buff, 0, rc);}in_b = swapStream.toByteArray(); //in_b为转换之后的结果}catch(Exception e){log.error("inputstream2Bytes",e);}finally {inStream.close();}return in_b;}/*** @Description: 文件转流*/public static InputStream file2InputStream(File file) throws IOException{return new FileInputStream(file);}}
3.controller层
// An highlighted block
public void printData() {Map<String,String> map = new HashMap();//存PDF模板信息 变量与pdf模板中相对应map.put("weightno",weightno);map.put("vehicleno",vehicleno);map.put("itemname",stockname);map.put("sendname",custnobuy);map.put("receivename",custnosell);map.put("tareweight",tareweight);map.put("grossweight",grossweight);map.put("netweight",netweight);map.put("taretime",taretime);map.put("grosstime",grosstime);map.put("specno","kg");Map<String,Object> o=new HashMap();o.put("datemap",map);// 模板路径String templatePath = "D:\\pic\\firstmodel.pdf";// 生成的新文件路径String newPDFPath = "D:\\pic\\"+weightno+".pdf";pdfout(o,templatePath,newPDFPath);}
4.最终效果
使用java直接生成pdf保存至本地路径相关推荐
- java零碎总结---java实现截图并保存到本地
java零碎总结---java实现截图并保存到本地 1.java实现截图并保存到本地 提供给大家三个方法,也是整理的,都不是很难,大家需要的看看哈 2.原理都相似 ------ ...
- Java自动生成PDF并进行邮件群发
这段时间,公司承办一个互联网峰会,需要对4000多位客户发送邀请函,其中包括一个pdf文件和一封手写信,PDF中将从公司数据库中读取所有客户姓名,自动生成到相应位置,前期尝试Java自动生成pdf文件 ...
- 将SmartForms转换为PDF保存到本地
将SmartForms转换为PDF保存到本地 *&---------------------------------------------------------------------* ...
- java中生成pdf,插入图片,页眉、页脚、表格
全栈工程师开发手册 (作者:栾鹏) java教程全解 java中生成pdf,插入图片,页眉.页脚.表格 import com.lowagie.text.*; import com.lowagie.te ...
- java itext 横线,Java itext生成pdf设置下划线,,package cn.o
Java itext生成pdf设置下划线,,package cn.opackage cn.outofmemory.example.itextpdf;import com.itextpdf.text.C ...
- java 模板生成PDF文件 复选框勾选
java 模板生成PDF文件 复选框勾选 // pdf填充时要有第三个参数s.setField("A", On, true);
- java动态生成pdf文件的方法
java动态生成pdf文件 文章目录 java动态生成pdf文件 前言 一.生成pdf模板 二.使用步骤 1.使用jar包 2.pdf实现方法 总结 前言 java开发过程中难免会遇到生成文件的需求, ...
- h5 uniapp html2canvas生成海报,保存到本地功能实现;
html2canvas生成海报,保存到本地功能实现 1. 在开发过程中我们将HTML2canvas封装成一个组件,通过prop传递ID参数 2. 组件的使用,伪代码不要直接复制uniapp语法 3. ...
- Java上传文件保存到指定路径
Java上传文件保存到指定路径 上代码 @PostMapping("/file-upload")@ApiOperation(value = "上传swagger.json ...
最新文章
- 工具箱支持汽车质量人工智能
- DataPipeline联合Confluent Kafka Meetup上海站
- 【数据结构与算法】2.深度优先搜索DFS、广度优先搜索BFS
- 全球最高龄男性去世享年113岁 生前喜欢泡温泉(图)
- 有序链表转换二叉搜索树(LeetCode)
- php 版权信息自动变化,php自动更新版权信息显示的方法
- 【Axure教程】滑动输入元件
- Java第十九天:mysql(二)
- elementUi上传视频组件
- 人工智能相关概念整理
- 训练神经网络gpu占用率低,外接gpu 训练神经网络
- 如何画出FPN论文中的金字塔结构图
- 实时云渲染和本地渲染的区别
- androidstudio安装的app打开闪退,AndroidManifest中也声明了类,但是却没有报错信息。(小坑)
- 交互式多模型-粒子滤波IMM-PF—在机动目标跟踪中的应用/matlab实现
- 数据库数据迁移失败,如何进行修复操作
- [演讲]北大鄂维南院士:智能时代意味着什么?
- 2012 lt;c语言综合实验gt;答案,厦门理工学院c语言实验4循环答案.doc
- 埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛(A E F )
- VideoCapture通用属性标识符