Java使用itextpdf导出数据为PDF
导包
pom.xml
引入jar包
// itextpdf<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.1</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency>
字体
在resources文件夹下创建文件夹pdfFont,放入simhei.ttf(黑体)字体文件,备用
导出
ElectricityPlanDTO 类为导出数据对象
传入作为页面条件查询过滤数据
/*** 导出用户信息到excel/pdf* @return*/@SuppressWarnings("unchecked")@RequestMapping(value = "/exportPDF" , method = RequestMethod.GET)@ResponseBodypublic String delWarnPdfPrint( ElectricityPlanDTO electricityPlanDTO,HttpServletRequest req, HttpServletResponse resp) throws Exception {File file = null;InputStream fin = null;ServletOutputStream out = null;/*******pdf文件内容生成开始*********/Document document = new Document(PageSize.A4, 25, 25, 25, 25);Subject subject = SecurityUtils.getSubject();SysUser sysUser = (SysUser)subject.getPrincipal();List<ElectricityPlanDTO> planList = electricityPlanService.getElectricByPlan(sysUser.getDeptid(),electricityPlanDTO);Map<String,Object> dataMap = new HashMap<String,Object>();List<String> titles = new ArrayList<String>();titles.add("序号");titles.add("客户名称");titles.add("统一社会信用代码");titles.add("计划电量");titles.add("申报年月");titles.add("更新时间");titles.add("状态");dataMap.put("titles", titles);dataMap.put("list", planList);dataMap.put("title_content", "电量申报");dataMap.put("type", "table");//创建文件夹String filePar = null;Date nowTime = new Date();SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");String time = sdf.format(nowTime);//获取当前时间字符串形式filePar = "C:" + File.separator + "electricityplan"+System.nanoTime();// 文件夹路径File myPath = new File( filePar );
// file = File.createTempFile("temp", Long.toString(System.nanoTime()));
// file = new File(filePar+"/"+"电量申报.pdf");if (!myPath.exists()){myPath.mkdir();}file = new File(filePar + File.separator, time+".pdf");PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file));// throws FileNotFoundException,/** 设中文字体*/BaseFont bfChinese = null;// FontFactory.getFont(FontFactory.COURIER,
// 14, Font.BOLD, new CMYKColor(0, 255, 0, 0);//大小,粗细,颜色try {bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);} catch (IOException e) {e.printStackTrace();}try {//加入页码
// setFooter(writer,PDFUtil.bfChinese,10,PageSize.A4);document.open();//图片1String CHARACTOR_FONT_CH_BLACK = Thread.currentThread().getContextClassLoader().getResource("").getPath();String realReadPath = CHARACTOR_FONT_CH_BLACK + "pdfFont/elogo.png";Image image1 = Image.getInstance(realReadPath);//设置图片位置的x轴和y周image1.setAbsolutePosition(50f, 780f);//设置图片的宽度和高度image1.scaleAbsolute(125, 40);//将图片1添加到pdf文件中document.add(image1);// // 加入文字水印
// PdfContentByte waterMar = writer.getDirectContentUnder();
// // 开始设置水印
// waterMar.beginText();
// // 设置水印透明度
// PdfGState gs = new PdfGState();
// // 设置填充字体不透明度为0.4f
// gs.setFillOpacity(0.4f);
// try {
// // 设置水印字体参数及大小 (字体参数,字体编码格式,是否将字体信息嵌入到pdf中(一般不需要嵌入),字体大小)
// waterMar.setFontAndSize(BaseFont.createFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.NOT_EMBEDDED), 60);
// // 设置透明度
// waterMar.setGState(gs);
// // 设置水印对齐方式 水印内容 X坐标 Y坐标 旋转角度
// waterMar.showTextAligned(Element.ALIGN_RIGHT, "国网南京供电公司" , 500, 430, 45);
// // 设置水印颜色
// waterMar.setColorFill(BaseColor.GRAY);
// //结束设置
// waterMar.endText();
// waterMar.stroke();
// } catch (IOException e) {
// e.printStackTrace();
// }finally {
// waterMar = null;
// gs = null;
// }// // 加入图片水印
// PdfContentByte waterMar = writer.getDirectContentUnder();
// // 开始设置水印
// waterMar.beginText();
// // 设置水印透明度
// PdfGState gs = new PdfGState();
// // 设置笔触字体不透明度为0.4f
// gs.setStrokeOpacity(0.2f);
// try {
// String CHARACTOR_FONT_CH_BLACK = Thread.currentThread().getContextClassLoader().getResource("").getPath();
// String realReadPath = CHARACTOR_FONT_CH_BLACK + "pdfFont/elogo.png";
// Image image = Image.getInstance(realReadPath);
// // 设置坐标 绝对位置 X Y
// image.setAbsolutePosition(200, 500);
// // 设置旋转弧度
// image.setRotation(30);// 旋转 弧度
// // 设置旋转角度
// image.setRotationDegrees(45);// 旋转 角度
// // 设置等比缩放
// image.scalePercent(90);// 依照比例缩放
// // image.scaleAbsolute(125,80);//自定义大小
// // 设置透明度
// waterMar.setGState(gs);
// // 添加水印图片
// waterMar.addImage(image);
// // 设置透明度
// waterMar.setGState(gs);
// //结束设置
// waterMar.endText();
// waterMar.stroke();
// } catch (IOException e) {
// e.printStackTrace();
// }finally {
// waterMar = null;
// gs = null;
// }// 标题居中String title_content = (String) dataMap.get("title_content");Paragraph title = PDFUtil.getParagraph(new Chunk(title_content,new Font(PDFUtil.bfChinese,16,Font.BOLD)));title.setAlignment(Paragraph.ALIGN_CENTER);document.add(title);SimpleDateFormat datetimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Paragraph now = PDFUtil.getParagraph(new Chunk(DateUtils.date2Str(DateUtils.getDate(),datetimeFormat) ,new Font(PDFUtil.bfChinese,10,Font.NORMAL)));now.setAlignment(Paragraph.ALIGN_RIGHT);document.add(now);// 表格标题List<String> titless = (List<String>) dataMap.get("titles");int len = titless.size();PdfPTable table = new PdfPTable(len);table.setSpacingBefore(20);table.setSpacingAfter(30);for(int i=0; i<len; i++){ //设置标题String str = titles.get(i);table.addCell(PDFUtil.getParagraph(str));}// 表格数据String type = (String) dataMap.get("type");if ("table".equals(type)){List<ElectricityPlanDTO> logList = (List<ElectricityPlanDTO>) dataMap.get("list");table = logPdf(table, logList);}document.add(table);// 关闭document.close();} catch (DocumentException e) {e.printStackTrace();} finally {document.close();}/*******pdf文件生成结束*********/try {fin = new FileInputStream(file);resp.setCharacterEncoding("utf-8");resp.setContentType("application/pdf");String filename = time;// 设置浏览器以下载的方式处理该文件if (req.getHeader("User-Agent").toUpperCase().indexOf("MSIE") > 0) {filename = URLEncoder.encode(filename, "UTF-8");} else {filename = new String(filename.getBytes("UTF-8"), "ISO8859-1");}//下载使用 删除可用(js2方法)直接在页面显示不下载resp.addHeader("Content-Disposition", "attachment;filename=" + filename + ".pdf");//这里填想要的文件格式out = resp.getOutputStream();byte[] buffer = new byte[512]; // 缓冲区int bytesToRead = -1;// 通过循环将读入的Word文件的内容输出到浏览器中while ((bytesToRead = fin.read(buffer)) != -1) {out.write(buffer, 0, bytesToRead);}} finally {if (fin != null)fin.close();if (out != null)out.close();if (file != null)file.delete(); // 删除临时文件if (myPath != null)myPath.delete();}return null;}public PdfPTable logPdf(PdfPTable table, List<ElectricityPlanDTO> logList){int logCount = logList.size();//定义中文字体大小Font f10 = new Font(PDFUtil.bfChinese, 10, Font.NORMAL);Font f12 = new Font(PDFUtil.bfChinese, 12, Font.NORMAL);Font f26 = new Font(PDFUtil.bfChinese, 26, Font.NORMAL);//一号字体if (logList != null && logCount > 0){for(int i=0; i<logCount; i++){ElectricityPlanDTO plan = logList.get(i);String num=Integer.toString( i+1);table.addCell(PDFUtil.getParagraph(num,f12));String name = plan.getName();table.addCell(PDFUtil.getParagraph(name));String code = plan.getCompanyCode();table.addCell(PDFUtil.getParagraph(code));String power = plan.getScheduledPower();table.addCell(PDFUtil.getParagraph(power));SimpleDateFormat date_sdf = new SimpleDateFormat("yyyy-MM-dd");Date declareTime = plan.getDeclareTime() ;String time= DateUtils.date2Str(declareTime,date_sdf);table.addCell(PDFUtil.getParagraph(time));String updateTime = plan.getUpdateTime() ;table.addCell(PDFUtil.getParagraph(updateTime));String status="";if(plan.getStatus()==0){status="未申报";}else if(plan.getStatus()==1){status="待审核";}else if(plan.getStatus()==2){status="已申报";}table.addCell(PDFUtil.getParagraph(status));}//设置列宽float[] columnWidths = { 1f, 3f, 3f,2f,3f,3f,2f };try {table.setWidths(columnWidths);} catch (DocumentException e) {e.printStackTrace();}}return table;}
工具包PDFUtil
package com.linksaint.defence.electricity.controller;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;import com.itextpdf.text.Chunk;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;/*** @ClassName: PDFUtil* @Description:* @author yangkunpeng* @date 2020年1月7日**/
public class PDFUtil {// 对参数的封装形式比如{name}public static final String BEGIN = "{";public static final String END = "}";// 换行形式{#}public static final String NEW_LINE = "#";// 默认的行间距、首行距离等,自己添加public static final float DEFAULT_LEADING = 20;public static final float DEFAULT_LINE_INDENT = 30;// 基本字体和样式public static BaseFont bfChinese;public static Font fontChinese;public static Font UNDER_LINE = null;static{try {// SIMKAI.TTF 默认系统语言,这里没使用第三方语言包String CHARACTOR_FONT_CH_BLACK = Thread.currentThread().getContextClassLoader().getResource("").getPath();String realReadPath = CHARACTOR_FONT_CH_BLACK + "pdfFont/simhei.ttf";bfChinese = BaseFont.createFont(realReadPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
// bfChinese = BaseFont.createFont("D:/home/java/contract/web/fonts/simsun.ttf",BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);//bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);fontChinese = new Font(bfChinese, 12, Font.NORMAL);UNDER_LINE = new Font(bfChinese, 14,Font.UNDERLINE);} catch (DocumentException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}// 默认样式public static Paragraph getParagraph(String context){return getParagraph(context,fontChinese);}public static Paragraph getParagraph(Chunk chunk){return new Paragraph(chunk);}// 指定字体样式public static Paragraph getParagraph(String context,Font font){return new Paragraph(context,font);}// 获得新行,首行缩进,和行间距public static Paragraph getNewParagraph(String context,float fixedLeading,float firstLineIndent){Paragraph p = getParagraph(context);p.setLeading(fixedLeading);p.setFirstLineIndent(firstLineIndent);return p;}public static Paragraph getParagraph(String content , Font font , float fixedLeading , int alignment){Paragraph p = getParagraph(content);p.setFont(font);p.setLeading(fixedLeading);p.setAlignment(alignment);return p;}// 默认段落样式public static Paragraph getDefaultParagraph(String context){Paragraph p = getParagraph(context);// 默认行间距p.setLeading(DEFAULT_LEADING);// 默认首行空隙p.setFirstLineIndent(DEFAULT_LINE_INDENT);return p;}// 将参数和字符串内容组合成集合public static List<Paragraph> createParagraphs(String context ,Map<String,Object> map){int index = 0;List<Paragraph> list = new ArrayList<Paragraph>();Paragraph p = getDefaultParagraph(null);while((index = context.indexOf(BEGIN)) > -1){String text = context.substring(0,index);context = context.substring(index, context.length());index = context.indexOf(END);String param = null;if(index > 0){param = context.substring(BEGIN.length(),index);}p.add(text);if(!NEW_LINE.equals(param)){Object value = map.get(param);if(value != null){p.add(new Chunk(value.toString(),UNDER_LINE));}else{p.add(new Chunk(""));}}else{list.add(p);p = getDefaultParagraph(null);p.setSpacingBefore(0);}context = context.substring(index+END.length(),context.length());}list.add(p);list.add(getParagraph(context));return list;}
}
前端vue调用
axios
请求
this.$refs.listLayout.getQueryValues()为查询过滤参数
// itextpdfexportPDF() {downFile("sys/electricityPlan/exportPDF",this.$refs.listLayout.getQueryValues() )},/*** 下载文件* @param url* @param parameter* @returns {*}export function downFile (url, parameter) {return axios({url: url,params: parameter,method: 'get',responseType: 'blob'}).then(response=>{if(response != null){const disposition = response.headers["content-disposition"].split(";");const fileName = decodeURI(disposition[disposition.length - 1].split("=")[1]).replace(/^\"|\"$/g, "");const blob = new Blob([response.data])if (window.navigator.msSaveOrOpenBlob) {// 兼容IE10navigator.msSaveBlob(blob,fileName);} else {var a = document.createElement("a");a.href = URL.createObjectURL(blob);;a.download = fileName;a.dispatchEvent(new MouseEvent('click', {bubbles: true, cancelable: true, view: window}));URL.revokeObjectURL(a.href);}}})
}
*/
Java使用itextpdf导出数据为PDF相关推荐
- Java项目如何导出数据为 PDF 文件?
文章目录 Java项目如何导出数据为 PDF 文件? 一.代码结构如下 二.代码说明 1.添加依赖 pom.xml 3.添加字体 4.PDF 导出工具类 三.效果图 结语 Java项目如何导出数据为 ...
- Java通过IText导出word和pdf
最近做的项目中需要用到导出word和pdf的功能(还有图表),在网上找了很多资料,最后敲定用了IText组件,下面是我项目中的一个Demo,记录了一下,希望对需要的人有帮助. 相关jar包下载地址:h ...
- Java后台phantomjs导出复杂图表PDF
当前导出PDF工具 java后端如何导出像前端用echarts那么漂亮而且还有带有图表的PDF呢,或者图片.目前后端导出word或者excel都是有县城的jar,导出简单的图表也有的简单的jfreec ...
- Java+Aspose.diagram,导出数据到Visio
背景:java,家谱图导出,主要包括家庭成员图片以及有关系进行连线 项目环境请参考 https://download.csdn.net/download/weixin_49456013/2008526 ...
- Java使用poi导出数据到excel(包括xls和xlsx两种格式)并通过浏览器下载
情景:将数据导出到excel是java开发常用的功能,数据量不大的时候,xls和xlsx两种格式的文件都行,但是数据量太大的时候就有区别了,xls格式的文件一个sheet页最多只能存六万多条数据,而x ...
- java通过poi导出excel和pdf
[背景] 由于各户的需求,所以需要增加导出excel这个功能,其实大部分系统都需要这个导出功能的,所以这里也就不详细说明具体导出的背景了O(∩_∩)O~ 干完导出excel将现有的导出pdf也进行了独 ...
- java处理word插入数据转PDF及下载PDF
欢迎使用Markdown编辑器 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.引入jar包 二.使用步骤 1.前端上传电子签名图片 2.java下载电子签名图片 ...
- Java实现Oracle导出数据到Excel
1.导入相应的jar包(jxl.jar 和 数据库连接的jar包) 2.写数据库连接的工具类 import java.sql.Connection; import java.sql.DriverMan ...
- java用模板导出数据表格
1.创建表格: 2.编写导出的controller; @PostMapping("/cust/report/customer/export") public void export ...
最新文章
- Ant Design Vue中a-select组件下拉列表在局部滚动时不跟随问题解决方法
- DZX2无法读取会员短消息
- Ubuntu 18.04 更改静态IP
- 用SQL语句添加删除修改字段、一些表与字段的基本操作、数据库备份等
- SpringBatch读文件(FlatFileItemReader)写据库(MyBatisBatchItemWriter)(四)
- 联想小新300加固态_就联想小新 Pro 13 固态硬盘混用一事,官方回应
- java嵌入groovy脚本,java-如何捕获传递给Groovy脚本的参数?
- conda deactivate python3_conda进行python环境隔离
- (大数据工程师学习路径)第二步 Vim编辑器----Vim文档编辑
- 【设计】1359- Umi3 如何实现插件化架构
- uni-app在华为应用市场上架审核无法通过,涉及个人信息:IMEI用户数据收集问题
- matlab rloess,R语言利用loess如何去除某个变量对数据的影响详解
- 吴恩达Coursera深度学习课程 deeplearning.ai (5-2) 自然语言处理与词嵌入--编程作业(二):Emojify表情包
- The Things Network LoRaWAN Stack V3 学习笔记 2.7.1 Web 前端开发调试
- APK应用程序的解包、修改、编辑、打包及应用(三)
- 【优化覆盖】基于matlab粒子群算法优化无人机编队布局求解车载网络通信覆盖优化问题【含Matlab源码 2021期】
- ajax调用第三方web服务,js调用soapWebService服务
- » 别了!我的大郅! 在这个雨夜仅此纪念我心目中那个追风少年!
- 计算机怎么安装俩个操作系统,想安装双操作系统,原来是win7,想再安装一个win10,两个系统能共用电脑里的软件吗?...
- 【机械】基于matlab模拟打桩机运动学仿真附matlab代码