记录一次java导出PDF的经验

每次下载导出都要到处搜索,把自己的经验记录下来以便以后使用。
主要思想就是将查询到的数据放入一个Map中调用generateTempPDF方法按照项目中存储的模板生成一个临时目录下的pdf,然后调用controller里面的导出逻辑将临时目录下的pdf导出即可,最终删除临时目录下的临时文件即可。
主要依赖:

  <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.10</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency>

1.首先要使用adobe Acrobat pro DC准备表单将参数都填入,例如:


临时目录及模板放入项目的resources下即可:

2.Controller层

@GetMapping(“/exportPersonalPdf”)
public void exportPersonalPdf(HttpServletRequest request, HttpServletResponse response, String testSn) {
BufferedInputStream bis = null;
OutputStream os = null;
String outPath = null;
try {
long userId = getUser();
// 这个地方将数据返回一个导出的pdf临时存储的绝对路径即可
String tempPath = pdfSerrvice.generatePersonalPdf(userId, testSn);
if (tempPath != null) {
// 获取项目根目录
outPath = FileUtil.getFileAbsPath(tempPath);
String fileName = “pdf文件名称.pdf”;
InputStream path = new FileInputStream(outPath);
// 判断浏览器类型
String agent = (String) request.getHeader(“USER-AGENT”);
if (agent != null && agent.indexOf(“Firefox”) != -1) {
// UTF-8编码,防止输出文件名乱码
fileName = new String(fileName.getBytes(“UTF-8”), “iso-8859-1”);
} else {
fileName = URLEncoder.encode(fileName, “UTF-8”);
}
response.reset();
response.setCharacterEncoding(“utf-8”);
response.setContentType(“application/pdf”);
response.setHeader(“Content-Disposition”, “attachment; filename=” + fileName);
bis = new BufferedInputStream(path);
byte[] b = new byte[bis.available() + 1000];
int i = 0;
// 直接下载导出
os = response.getOutputStream();
while ((i = bis.read(b)) != -1) {
os.write(b, 0, i);
}
os.flush();
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (os != null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
// 下载成功将临时目录下的文件清理
FileUtil.deleteLocationFile(outPath);
}
}

3.业务层

/**
* 生成pdf存放到临时文件夹下
*
* @param dataMap 外部输入的数据
* @param templatePath 模板路径
* @param tempPath 临时文件路径
* @throws IOException 异常
* @return 返回的是生成的pdf临时路径,用完之后需要清理
*/
public static String generateTempPDF(Map<String, Object> dataMap,
String templatePath, String tempPath) throws IOException {
PdfReader reader = null;
PdfStamper ps = null;
OutputStream fos = null;
ByteArrayOutputStream bos = null;
String outPath = null;
try {
// 模板绝对路径 “files/pdf模板.pdf”
String fileName = FileUtil.getFileAbsPath(templatePath);
reader = new PdfReader(fileName);
bos = new ByteArrayOutputStream();
ps = new PdfStamper(reader, bos);

        // 使用中文字体BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);ArrayList<BaseFont> fontList = new ArrayList<BaseFont>();fontList.add(bf);AcroFields fields = ps.getAcroFields();fields.setSubstitutionFonts(fontList);fillData(fields, dataMap);//渲染// 必须要调用这个,否则文档不会生成的ps.setFormFlattening(true);if (ps != null) {ps.close();}outPath = FileUtil.getFileAbsPath(tempPath);// 生成pdf路径存放的路径 "temp/temp" + TimeUtil.formatDate(new Date()) + ".pdf"File file = new File(outPath);if (!file.getParentFile().exists()) {file.getParentFile().mkdirs();}if (!file.exists()) {file.createNewFile();}fos = new FileOutputStream(outPath);fos.write(bos.toByteArray());} catch (Exception exception) {log.error("generateTempPDF exception.", exception);} finally {if (fos != null) {fos.flush();fos.close();}if (bos != null) {bos.close();}if (reader != null) {reader.close();}}return outPath;
}/*** 填充模板中的数据*/
private static void fillData(AcroFields fields, Map<String, Object> data) {try {for (String key : fields.getFields().keySet()) {Object value = data.get(key);if (value == null) {continue;}fields.setField(key, value.toString());}     } catch (Exception e) {e.printStackTrace();}
}

4.业务中使用的几个方法

import com.google.common.io.BaseEncoding;
import com.sun.jna.Platform;
import lombok.extern.slf4j.Slf4j;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import org.springframework.web.multipart.MultipartFile;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Base64;
import java.util.Base64.Decoder;

/**
* 获取文件绝对路径
*
* @param filePath filePath
* @return String
*/
public static String getFileAbsPath(String filePath) {
String path = null;
if (Platform.isWindows()) {
// 在win64系统的固定位置
path = (GeneratePdf.class.getResource(“/”).getPath() + filePath).substring(1).replaceAll(“/”, “\\”);

    } else if (Platform.isLinux()) {// 在linux64系统的固定位置path = "/usr/" + filePath;}System.out.println(path);return path;
}

/**
* 将日期date 转换成字符串
*
* @param date date
* @return String
* @throws ParseException
*/
public static String formatDate(Date date) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(“yyyy_MM_dd_HH_mm_ss”);
String str = simpleDateFormat.format(date);
return str;
}

【java导出PDF】相关推荐

  1. 咖啡汪日志——JAVA导出pdf文件加水印 文字+图片、文字

    咖啡汪日志--JAVA导出pdf文件加水印 文字和图片.文字 hello,又大家见面了! 作为一只不是在戏精就是在戏精路上的哈士奇,今天要展示给大家的就是如何快捷地给pdf文件增加各种水印.嗷呜呜,前 ...

  2. JAVA导出PDF并压缩成zip

    JAVA导出PDF借助 iText pom先引入两个jar包 <dependency><groupId>com.itextpdf</groupId><arti ...

  3. 使用java导出pdf文件

    使用java导出pdf文件 itext itext的使用 JasperReports JasperReports与itext的区别 Jaspersoft Studio 工具简介 Jaspersoft ...

  4. java导出PDF(itextpdf+Adobe Acrobat 9 Pro)

    java导出PDF 背景 摸索 maven依赖 代码实现 模板及结果展示 模板 结果 彩蛋 彩蛋一:本地临时文件删除不了 彩蛋二:导出横向A4PDF 彩蛋三:多个PDF合并(待完成) 背景 最近接到一 ...

  5. java导出PDF、iText5导出漂亮表格PDF、导出指定格式水印PDF

    我们在项目当中经常要导出pdf文档,pdf文档还要按一定的格式导出,以下介绍导出pdf文档功能: 1)支持A4纸大小导出 2)指定文字显示的位置 3)支持表格展示数据 4)添加水印 开源下载 java ...

  6. 「Java工具类」pdf导出工具类java导出pdf文件工具类

    介绍语 本号主要是Java常用关键技术点,通用工具类的分享:以及springboot+springcloud+Mybatisplus+druid+mysql+redis+swagger+maven+d ...

  7. java导出pdf功能记录

    这几天已在做处理导出pdf文件的功能,摸索了几天总算可以了.记录下这几天遇到的问题. 1.网上基本都是基于Itext5和Itext7来处理的.我最终是在Itext5上成功了,itext7应该是模板出问 ...

  8. Java导出PDF文档(模板导出和自定义)

    项目场景: 需要导出PDF文档,支持模板导出和自定义文档格式. 场景分析: PDF模板创建可使用表单域创建表单字段,引入数据填充,或者根据实际需要生成html转换成pdf. 解决方案: PDF模板可以 ...

  9. java导出pdf集合_java实现导出pdf-Go语言中文社区

    1.添加Maven依赖 org.xhtmlrenderer flying-saucer-pdf 9.0.3 com.itextpdf itextpdf 5.5.10 2.工具类 package com ...

  10. Java导出PDF样式详细解析(步骤+代码)

    一.文章说明 此篇文章将解决itextpdf转PDF遇到的以下问题: 1.中文不显示问题 2.表格或者图片超宽问题 3.pdf样式问题 4.Markdown引用样式在PDF中正常显示 5.转换HTML ...

最新文章

  1. python循环语句-Python for循环控制语句一般格式及方法
  2. hdu2.1.2 How many prime numbers(计算素数的个数)
  3. 代码提示_PHPStorm 支持 Laravel Facades 的代码提示
  4. IT 巡检内容、方法大全
  5. 建立http服务器,基于名称的虚拟主机
  6. c语言排序系统代码怎么写,排序概述(c语言)(示例代码)
  7. git clone --depth=1引起的问题
  8. KMP算法(C语言版)
  9. redis主从和集群搭建
  10. windows10 卓越性能模式
  11. 井字棋游戏 Matlab
  12. HTML5期末大作业:南京旅游网站设计——六朝古都-南京旅游(10页) HTML+CSS+JavaScript 出游旅游主题度假酒店 计划出行网站设计
  13. 关于行人重识别方法PCB《Beyond Part Models: Person Retrieval with Refined Part Pooling 》及代码实现解读
  14. 小米等手机企业不再搭载充电头,或许是看上了其中丰厚的利润
  15. 【C语言】从扫雷玩家到开发者
  16. 21届秋招ATL宁德新能源一面面经[数据分析工程师]
  17. 《产品游戏化》电子书下载(epub+mobi+pdf) Netflix、迪士尼、微软巨头在使用的产品策略
  18. twice论文-深度估计-BA_NET
  19. java 方麦子_南方麦子什么时候成熟?小麦有什么营养价值呢?
  20. python3.6爬虫案例:爬取朝秀帮图片

热门文章

  1. java对打字速度,java课程设计-- 打字速度测试程序
  2. MATLAB | 好看的配对箱线图绘制模板
  3. mht转html保留图片,【JAVA】mht文件转html
  4. python单引号和什么的作用几乎是一样的_python里的单引号和双引号的有什么作用...
  5. GIS招聘 | 云南省自然资源厅所属事业单位
  6. 欧姆龙PLC-小型PLC概述
  7. swing 绝对布局 窗口事件 鼠标事件 键盘事件 上传头像流程
  8. oracle 切换cdb,CDB与PDB之间的切换方法
  9. php解析bt,php读取BT文件信息lightbenc.php库使用说明
  10. 计算机用户名起什么好,如何随机取名计算机名-如何改计算机用户名