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})

  • %24%7Bvar.ksh%7D.jpg

    ${var.seatNum} ${var.name}

第${rooCode}考场 (个数:${fn:length(list)})

  • mg_photo.jpg

    ${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语言中文社区相关推荐

  1. java工程 p2p通讯_java实现P2P通信-Go语言中文社区

    区块链中的消息传播离不p2p通信 java实现一个简单的p2p通信demo 工具:   idea   jdk1.8   maven 1  :  idea新建maven项目,导入p2p所需要的jar包 ...

  2. 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 ...

  3. java oval 入门_java开源验证框架OVAL-Go语言中文社区

    @Length,@MaxLength,@MinLength maxLength,minLength只有value属性,表示和value进行比较 min和max是Length的属性 汉字算一个长度 @N ...

  4. java 电子发票_java电子发票管理系统-Go语言中文社区

    目录 引言 这是当时学完SpringBoot后写的一个小项目,当时EasyUI学了一点,而且个人感觉EasyUI用起来是挺好用的,但页面感觉不是很好看,所以这个项目表格用的是EasyUI的,页面用的B ...

  5. 最牛逼的java代码_分享史上java最牛逼 最简短的代码-Go语言中文社区

    也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 确实是12306的最核心代码呀 确实牛public class Test{    static{       System.ou ...

  6. grpc java 泛型_关于使用GRPC遇到的BUG-Go语言中文社区

    GRPC获取服务器数据是耗时操作,不能写在UI主线程中,可以写在子线程或使用AsyncTask实现获取数据,但实测,仅仅是获取少量数据,可以写在UI主线程中(虽然不推荐这么做).目前博主在AsyncT ...

  7. 像素鸟多线程java_用java Swing做的小游戏像素鸟-Go语言中文社区

    最终效果 整个项目都是基于swing实现的.窗是口将图片加载到JPanel面板,然后将面板添加到到JFrame窗口实现显示. 这个类是选择几只像素鸟的类,也是main函数里执行的方法,代码有详细的注释 ...

  8. c 语言 网络唤醒,Java网络编程————UDP实现ThinkPad S5网络唤醒-Go语言中文社区...

    功能要求:通过Java程序实现ThinkPad S5 笔记本网络唤醒 必备知识: 一.定义:网络唤醒,通过局域网.互联网或通讯网络,以有线网卡的形式,向目标电脑发送魔法包(Magic Packet), ...

  9. java word 题目导入_Java导入导出Excel和Word

    目的 实现Excel/Word导入导出,分以下步骤 导入 上传文件 解析Excel/Word里面的内容 导出 生成Excel/Word文件 文件下载 如何实现 上传文件----------Common ...

最新文章

  1. 【Java Web开发指南】redis笔记
  2. 作为Leader如何与团队成员更好地沟通?
  3. Microsoft Dynamics CRM server 2013   一般销售流程之 订单 简单介绍
  4. python 3.5opencv 环境搭建_Python3.5+openCv进行人脸识别的环境搭建(Windows下)
  5. ARM中 __IO的作用解析
  6. 华软linux虚拟机密码,Linux_账户和组管理
  7. 算法训练 最长字符串 java
  8. SAP 电商云 Spartacus UI quick order 搜索结果的索引设置实现
  9. DrawImage内存不足问题
  10. 正则表达式匹配手机4位尾号
  11. 面试题1:赋值运算符函数
  12. [转]Thrift连接池实现
  13. Lightroom Classic 教程,如何在 Lightroom 中更高效的获取快速提示?
  14. 创建数据库常用SQL语句
  15. SEAIR传染病模型及其开源代码
  16. 用matlab进行函数插值的几种方法
  17. RxJava学习 - 6. Disposing
  18. PS 一寸照换底
  19. for(int i = 0;i 10;i++)和int i;for(i = 0;i 10;i++)
  20. RFE -- 用户活跃度模型

热门文章

  1. 数字语音信号处理学习笔记——语音信号的同态处理(3)
  2. 理解SetCapture、ReleaseCapture、GetCapture(控制了消息发往哪个窗口,是理解消息的关键)
  3. qt web混合编程_QT做界面真是绝美,并且还可嵌入HTML与JS做界面(许多案例)
  4. layui设置按钮不可点击_(eblog)7、博客发布收藏、用户中心的设置
  5. java atomiclong 使用_java并发:原子类之AtomicLong
  6. 英语语法---动名词短语详解
  7. 第四范式获批工信部工业和信息化人才培养工程培训基地
  8. python源码精要(7)-CPython编译
  9. python3源码精要(1)-C源代码取得与基本特征
  10. 【效率】推荐一款Markdown神器 ! ! !