先上pom依赖 用于生成pdf文件
<!--pdf start-->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>kernel</artifactId>
<version>7.0.3</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>io</artifactId>
<version>7.0.3</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>layout</artifactId>
<version>7.0.3</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>font-asian</artifactId>
<version>7.0.3</version>
</dependency>
<!--pdf end-->首先构建 Document对象
//字节输出流(包直接是java.io)
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfWriter writer = new PdfWriter(baos);
PdfDocument pdf = new PdfDocument(writer);
Document document = new Document(pdf);然后构建pdf内容
//添加标题
Paragraph title = new Paragraph("" + "测试名称").setFont(watermark)
.setFontSize(22)//设置字体大小
.setBold()//设置文字为粗体
.setFontColor(new DeviceRgb(0, 0, 0))//设置字体颜色
.setTextAlignment(TextAlignment.CENTER)//文字水平居中
.setFixedLeading(22)//类似于css中的行高
;
//将内容添加到PDF页面上
document.add(title);此处watermark为字体 因为我引入的这个itext默认中文字符字体可能不支持
引入字体代码(我这块是写的绝对路径 建议写相对路径 因为部署到Linux上就没有c盘)
PdfFont watermark = PdfFontFactory.createFont("c://simsun.ttc,1", PdfEncodings.IDENTITY_H, false);到这里我们就把pdf制作完成了
上面构建pdf内容处可根据业务需求制作
将PDF转换为字节添加到ZIP压缩包中
首先 一定要执行
document.close();要执行关闭流操作 不然会拿不到字节数据
//获取PDF字节数组
byte[] xmpMetadata = baos.toByteArray();将数据制作为压缩包
ZipOutputStream zipOutputStream = new ZipOutputStream(response.getOutputStream());
zipOutputStream.putNextEntry(new ZipEntry("pdf李四.pdf"));
zipOutputStream.write(xmpMetadata);
zipOutputStream.flush();
zipOutputStream.putNextEntry(new ZipEntry("pdf王五.pdf"));
zipOutputStream.write(xmpMetadata);
zipOutputStream.flush();
zipOutputStream.close();API信息
* new ZipEntry("压缩包文件名称");
* ZipEntry为压缩包中单个文件 构造参数为单个文件名称
* putNextEntry() 是将文件添加到压缩包中
* 后面紧跟write(字节数组,也就是写入的文件);
* 刷新一下然后就可以添加下一个 以此类推 就可以将批量文件打成压缩包
putNextEntry(new ZipEntry("压缩包文件名称"));上demo和效果图
@Override
public Object downloadPaper(HttpServletResponse response) throws IOException {
String paperId = "";
log.info("paperId: " + paperId);
PdfFont watermark = PdfFontFactory.createFont("c://simsun.ttc,1", PdfEncodings.IDENTITY_H, false);
response.setContentType("application/octet-stream");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfWriter writer = new PdfWriter(baos);
PdfDocument pdf = new PdfDocument(writer);
Document document = new Document(pdf);
//试卷信息
List<PaperDownloadVo> paper = null;
//转码试卷名称
String fileName = URLEncoder.encode("测试试卷", "utf-8");
response.setHeader("Content-Disposition", "attachment;fileName=" + fileName + ".zip");
//添加标题
Paragraph title = new Paragraph("" + "测试名称").setFont(watermark)
.setFontSize(22)//设置字体大小
.setBold()//设置文字为粗体
.setFontColor(new DeviceRgb(0, 0, 0))//设置字体颜色
.setTextAlignment(TextAlignment.CENTER)//文字水平居中
.setFixedLeading(22)//类似于css中的行高
;
//将内容添加到PDF页面上
document.add(title);
document.add(new Paragraph("试卷总分 :" + "测试18分" + " 考试时间:" + "测试时长" + "分钟 ").setFont(watermark)
.setFontSize(14)
.setBold()
.setTextAlignment(TextAlignment.CENTER)
.setFixedLeading(8)
);
System.out.println("--"+Arrays.toString(baos.toByteArray()));
// start
int pbqContextNum = 0;
int choiceCount = 0;
//题目类型
document.add(new Paragraph("测试模板名称").setFont(watermark)
.setFontSize(14)
.setBold()
.setFixedLeading(14));
// //根据题目分组 每一个key对应一道小题
// Map<String, List<PaperDownloadVo>> contexts = papers.stream().collect(Collectors.groupingBy(PaperDownloadVo::getPsqContext));
//
// int serialNumber = 0;
// String pbqContext = null == papers.get(0).getPbqContext() ? "" : papers.get(0).getPbqContext();
int pbqNum = 0;
System.out.println("测试填空");
int serialNumber = 0;
String pbqContext = "测试大题名称";
log.info("====大题信息====");
log.info(pbqContext);
String strPbqContext = pbqContext.trim();
//添加大题
log.info("进入 :" + pbqContext);
document.add(new Paragraph(++pbqNum + "、 " + pbqContext).setFont(watermark)
.setFontSize(13)
.setBold()
.setFixedLeading(14));
pbqContextNum = 0;
//根据题目分组 每一个key对应一道小题
String contextStr = "测试题目名称";
contextStr += "----分值 :" + "测试分值";
document.add(new Paragraph(++choiceCount + ". " + contextStr).setFont(watermark).setBold().setFontSize(12).setFixedLeading(14));
//添加选项
char c = 'A';
String string = String.valueOf(c++);
String psqOptionValue = "测试选项答案";
//带选择题答案的
// String itemStr = typeStr + " " + string + "." + psqOptionValue;
//不带选择题答案
String itemStr = string + "." + psqOptionValue;
document.add(new Paragraph(itemStr).setFont(watermark)
.setFontSize(8)
.setBold()
.setFixedLeading(8));
document.add(new Paragraph(++pbqContextNum + ". " + "测试内容").setFont(watermark).setBold().setFontSize(12).setFixedLeading(14));
document.add(new Paragraph(++pbqContextNum + ". " + contextStr).setFont(watermark).setBold().setFontSize(12).setFixedLeading(14));
document.close();
baos.flush();
byte[] xmpMetadata = baos.toByteArray();
// end
log.info(Arrays.toString(xmpMetadata));
log.info(Arrays.toString(pdf.getXmpMetadata()));
log.info(Arrays.toString(document.getPdfDocument().getXmpMetadata()));
log.info(Arrays.toString(document.getPdfDocument().getXmpMetadata()));
ZipOutputStream zipOutputStream = new ZipOutputStream(response.getOutputStream());
zipOutputStream.putNextEntry(new ZipEntry("pdf李四.pdf"));
zipOutputStream.write(xmpMetadata);
zipOutputStream.flush();
zipOutputStream.putNextEntry(new ZipEntry("pdf王五.pdf"));
zipOutputStream.write(xmpMetadata);
zipOutputStream.flush();
zipOutputStream.close();
// pdf.close();
// writer.flush();
// writer.close();
return null;
}


版权声明:本文为qq_45194508原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。