java导出pdf集合_java实现导出pdf-Go语言中文社区
1.添加Maven依赖
org.xhtmlrenderer
flying-saucer-pdf
9.0.3
com.itextpdf
itextpdf
5.5.10
2.工具类
package com.dzqc.dz.common.util;
import com.itextpdf.text.pdf.BaseFont;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class PdfUtils {
/**
* 把URL转换为PDF
* @return
* @throws Exception
*/
public static boolean htmlToPdf2(String outputFile, String url)
throws Exception {
File outFile = new File(outputFile);
if (!outFile.exists()) {
outFile.getParentFile().mkdirs();
}
OutputStream os = new FileOutputStream(outputFile);
ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(url);
String fontPath="/simsun.ttc";
// 解决中文支持问题
ITextFontResolver fontResolver = renderer.getFontResolver();
fontResolver.addFont(fontPath, BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
renderer.layout();
renderer.createPDF(os);
os.flush();
os.close();
System.out.println("文件转换成功");
return true;
}
}
3.Controller层
/**
* 批量导出座次表
*
* @param roomId
* @return
*/
@RequestMapping("/exportSeatNumPlanPDF")
@ResponseBody
public MyAjaxResult exportSeatNumPlanPDF(String roomId,String subjectId, HttpServletRequest request, HttpServletResponse response) {
String path1 = System.getProperty("root") + File.separator + "resources" + File.separator + "PDF" + File.separator;
File file = new File(path1);
if (!file.exists() && !file.isDirectory()) {
System.out.println("//不存在");
file.mkdir();
}
if (subjectId==null||"".equals(subjectId)) {
return MyAjaxResult.fail_300("考试科目id不能为空");
}
BufferedOutputStream out = null;
BufferedInputStream in = null;
String[] split = null;
if (null != roomId && !"".equals(roomId)) {
split = roomId.split(",");
}
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");//设置日期格式
String format = df.format(new Date());
String ip = SystemConstants.get("ip");
SystemConstants.get("ip");
String port = SystemConstants.get("port");
try {
System.out.println(roomId);
boolean b = PdfUtils.htmlToPdf2(path1 + format+"-座次表.pdf", "http://"+ip+":" + port + request.getContextPath() + "/stuexamroom/selectRoomDoorPDF?path=zdbpzcb&roomId=" + roomId+"&subjectId="+subjectId);
System.err.println(b);
if (b) {
File f = new File(path1 + format+"-座次表.pdf");
out = new BufferedOutputStream(response.getOutputStream());
in = new BufferedInputStream(new FileInputStream(f));
response.setContentType(new MimetypesFileTypeMap().getContentType(f));// 设置response内容的类型
String filename = format+"-座次表";
if (isMSBrowsers.isMSBrowser(request)) {
filename = URLEncoder.encode(filename, "UTF-8");
} else {
filename = new String(filename.getBytes("utf-8"), "ISO8859-1");
}
response.setHeader("Content-disposition", "attachment;filename=" + filename + "." + "pdf");// 设置头部信息
byte[] buffer = new byte[1024];
int length = 0;
while ((length = in.read(buffer)) > 0) {
out.write(buffer, 0, length);
}
out.flush();
}
} catch (Exception e) {
e.printStackTrace();
return MyAjaxResult.fail_500("网络异常");
} finally {
try {
out.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return MyAjaxResult.success("下载成功");
}
@RequestMapping("/selectRoomDoorPDF")
public ModelAndView selectRoomDoorPDF(String path, String roomId,String subjectId) {
String[] split = null;
if (!"".equals(roomId)&& !"null".equals(roomId)) {
split = roomId.split(",");
}
List stuExamRoom = null;
try {
stuExamRoom = stuExamRoomService.selectRoomDoorPDF(split,subjectId);
System.out.println(stuExamRoom);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Map ma = new HashMap<>(16);
ma.put("stuExamRooms", stuExamRoom);
return new ModelAndView("pages/dzBackEnd/" + path, ma);
}
4.页面
pageEncoding="UTF-8" isELIgnored="false" %>
座次表
@page {
size: A4;
margin: 0;
}
html, body {
margin: 0;
padding: 0;
}
h2, h4 {
text-align: center;
}
.wrap {
width: 794px;
/* height: 1123px; */
height: auto;
margin: 0 auto;
}
ul {
width: 100%;
margin: 0;
padding: 0;
overflow: hidden;
}
li {
list-style: none;
width: 20%;
height: auto;
float: left;
margin-bottom: 3px;
text-align: center;
}
li img {
width: 120px;
}
li p {
margin: 0;
text-align: center;
}
第${room.roomCode}考场 (个数:${roompage})
-
${var.seatNum} ${var.name}
第${rooCode}考场 (个数:${fn:length(list)})
-
${var.sear} ${var.name}
--%>
5.效果
6.注意点
1.div的文字换行
在生成的pdf中,默认不会换行;实现换行在div的style中加入 word-wrap:break-word;
2.在转换pdf的时候对html文件的格式要求比较严格,标签必需有结束标签,否则将会报一系列错误
例如:换行只有一个
标签
则会报异常:
ERROR: '元素类型 "br" 必须由匹配的结束标记 "" 终止。'
如果是
则不会报异常。
java导出pdf集合_java实现导出pdf-Go语言中文社区相关推荐
- java工程 p2p通讯_java实现P2P通信-Go语言中文社区
区块链中的消息传播离不p2p通信 java实现一个简单的p2p通信demo 工具: idea jdk1.8 maven 1 : idea新建maven项目,导入p2p所需要的jar包 ...
- java io读取doc内容_Java word 内容读取-Go语言中文社区
1.添加依赖关系(网上好多帖子没有写依赖,害我找半天) org.apache.poi poi 4.0.0 org.apache.poi poi-ooxml 4.0.0 org.apache.poi p ...
- java oval 入门_java开源验证框架OVAL-Go语言中文社区
@Length,@MaxLength,@MinLength maxLength,minLength只有value属性,表示和value进行比较 min和max是Length的属性 汉字算一个长度 @N ...
- java 电子发票_java电子发票管理系统-Go语言中文社区
目录 引言 这是当时学完SpringBoot后写的一个小项目,当时EasyUI学了一点,而且个人感觉EasyUI用起来是挺好用的,但页面感觉不是很好看,所以这个项目表格用的是EasyUI的,页面用的B ...
- 最牛逼的java代码_分享史上java最牛逼 最简短的代码-Go语言中文社区
也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 确实是12306的最核心代码呀 确实牛public class Test{ static{ System.ou ...
- grpc java 泛型_关于使用GRPC遇到的BUG-Go语言中文社区
GRPC获取服务器数据是耗时操作,不能写在UI主线程中,可以写在子线程或使用AsyncTask实现获取数据,但实测,仅仅是获取少量数据,可以写在UI主线程中(虽然不推荐这么做).目前博主在AsyncT ...
- 像素鸟多线程java_用java Swing做的小游戏像素鸟-Go语言中文社区
最终效果 整个项目都是基于swing实现的.窗是口将图片加载到JPanel面板,然后将面板添加到到JFrame窗口实现显示. 这个类是选择几只像素鸟的类,也是main函数里执行的方法,代码有详细的注释 ...
- c 语言 网络唤醒,Java网络编程————UDP实现ThinkPad S5网络唤醒-Go语言中文社区...
功能要求:通过Java程序实现ThinkPad S5 笔记本网络唤醒 必备知识: 一.定义:网络唤醒,通过局域网.互联网或通讯网络,以有线网卡的形式,向目标电脑发送魔法包(Magic Packet), ...
- java word 题目导入_Java导入导出Excel和Word
目的 实现Excel/Word导入导出,分以下步骤 导入 上传文件 解析Excel/Word里面的内容 导出 生成Excel/Word文件 文件下载 如何实现 上传文件----------Common ...
最新文章
- 【Java Web开发指南】redis笔记
- 作为Leader如何与团队成员更好地沟通?
- Microsoft Dynamics CRM server 2013 一般销售流程之 订单 简单介绍
- python 3.5opencv 环境搭建_Python3.5+openCv进行人脸识别的环境搭建(Windows下)
- ARM中 __IO的作用解析
- 华软linux虚拟机密码,Linux_账户和组管理
- 算法训练 最长字符串 java
- SAP 电商云 Spartacus UI quick order 搜索结果的索引设置实现
- DrawImage内存不足问题
- 正则表达式匹配手机4位尾号
- 面试题1:赋值运算符函数
- [转]Thrift连接池实现
- Lightroom Classic 教程,如何在 Lightroom 中更高效的获取快速提示?
- 创建数据库常用SQL语句
- SEAIR传染病模型及其开源代码
- 用matlab进行函数插值的几种方法
- RxJava学习 - 6. Disposing
- PS 一寸照换底
- for(int i = 0;i 10;i++)和int i;for(i = 0;i 10;i++)
- RFE -- 用户活跃度模型
热门文章
- 数字语音信号处理学习笔记——语音信号的同态处理(3)
- 理解SetCapture、ReleaseCapture、GetCapture(控制了消息发往哪个窗口,是理解消息的关键)
- qt web混合编程_QT做界面真是绝美,并且还可嵌入HTML与JS做界面(许多案例)
- layui设置按钮不可点击_(eblog)7、博客发布收藏、用户中心的设置
- java atomiclong 使用_java并发:原子类之AtomicLong
- 英语语法---动名词短语详解
- 第四范式获批工信部工业和信息化人才培养工程培训基地
- python源码精要(7)-CPython编译
- python3源码精要(1)-C源代码取得与基本特征
- 【效率】推荐一款Markdown神器 ! ! !