最近有个项目需要使用pdf在线预览功能,所以小小研究下
开始研究itext的报表生成,但是只能实现附件下载功能,并不能直接调用浏览器预览pdf功能,自然是不爽的。折腾一番,终于捣鼓出来了。下面说下详细步骤
后台引入Itext依赖,注意需要两个包,pdf加密需要三个
<!-- itext依赖 https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13</version>
</dependency>
<!-- 亚洲中文依赖 https://mvnrepository.com/artifact/com.itextpdf/itext-asian -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
根据需要,生成document,并使用response输出流。因为是一个表格,有点冗长,请自行找重点
public void pdfExport(HttpServletRequest request, HttpServletResponse response) throws Exception {
//查询数据
List<DataDict> dataDicts = dataDictService.selectList(new EntityWrapper<>(new DataDict()));
// 创建Document
Document doc = new Document();
//指定输入位置(响应)
PdfWriter.getInstance(doc, response.getOutputStream());
doc.open();
//写出表格 4列
PdfPTable table = new PdfPTable(4);
table.setWidthPercentage(100); // 宽度100%填充
table.setSpacingBefore(10f); // 前间距
table.setSpacingAfter(10f); // 后间距
//字体
BaseFont bfHei = BaseFont.createFont("STSong-Light","UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
Font font = new Font(bfHei, 12);
//段落文本
Paragraph title = new Paragraph("这是pdf段落", font);
doc.add(title);
List<PdfPRow> listRow = table.getRows();
//设置列宽
float[] columnWidths = { 1f, 2f, 5f, 4f };
table.setWidths(columnWidths);
font = new Font(bfHei, 8);
//表头
PdfPCell[] header = new PdfPCell[4];
header[0] = new PdfPCell(new Paragraph("字典ID", font));//单元格内容
header[0].setBorderColor(BaseColor.BLACK);//边框
header[0].setPaddingLeft(20);//左填充20
header[0].setHorizontalAlignment(Element.ALIGN_CENTER);//水平居中
header[0].setVerticalAlignment(Element.ALIGN_MIDDLE);//垂直居中
header[1] = new PdfPCell(new Paragraph("字典名", font));//单元格内容
header[1].setBorderColor(BaseColor.BLACK);//边框
header[1].setPaddingLeft(20);//左填充20
header[1].setHorizontalAlignment(Element.ALIGN_CENTER);//水平居中
header[1].setVerticalAlignment(Element.ALIGN_MIDDLE);//垂直居中
header[2] = new PdfPCell(new Paragraph("字典父ID", font));//单元格内容
header[2].setBorderColor(BaseColor.BLACK);//边框
header[2].setPaddingLeft(20);//左填充20
header[2].setHorizontalAlignment(Element.ALIGN_CENTER);//水平居中
header[2].setVerticalAlignment(Element.ALIGN_MIDDLE);//垂直居中
header[3] = new PdfPCell(new Paragraph("字典注释", font));//单元格内容
header[3].setBorderColor(BaseColor.BLACK);//边框
header[3].setPaddingLeft(20);//左填充20
header[3].setHorizontalAlignment(Element.ALIGN_CENTER);//水平居中
header[3].setVerticalAlignment(Element.ALIGN_MIDDLE);//垂直居中
PdfPRow row = new PdfPRow(header);
listRow.add(row);
for (DataDict dict : dataDicts) {
PdfPCell[] cell = new PdfPCell[4];
//单元格
cell[0] = new PdfPCell(new Paragraph(dict.getId(), font));//单元格内容
cell[0].setBorderColor(BaseColor.BLACK);//边框
cell[0].setPaddingLeft(20);//左填充20
cell[0].setHorizontalAlignment(Element.ALIGN_CENTER);//水平居中
cell[0].setVerticalAlignment(Element.ALIGN_MIDDLE);//垂直居中
cell[1] = new PdfPCell(new Paragraph(dict.getName(), font));//单元格内容
cell[1].setBorderColor(BaseColor.BLACK);//边框
cell[1].setPaddingLeft(20);//左填充20
cell[1].setHorizontalAlignment(Element.ALIGN_CENTER);//水平居中
cell[1].setVerticalAlignment(Element.ALIGN_MIDDLE);//垂直居中
cell[2] = new PdfPCell(new Paragraph(dict.getParentId(), font));//单元格内容
cell[2].setBorderColor(BaseColor.BLACK);//边框
cell[2].setPaddingLeft(20);//左填充20
cell[2].setHorizontalAlignment(Element.ALIGN_CENTER);//水平居中
cell[2].setVerticalAlignment(Element.ALIGN_MIDDLE);//垂直居中
cell[3] = new PdfPCell(new Paragraph(dict.getComment(), font));//单元格内容
cell[3].setBorderColor(BaseColor.BLACK);//边框
cell[3].setPaddingLeft(20);//左填充20
cell[3].setHorizontalAlignment(Element.ALIGN_CENTER);//水平居中
cell[3].setVerticalAlignment(Element.ALIGN_MIDDLE);//垂直居中
PdfPRow r = new PdfPRow(cell);
listRow.add(r);
}
doc.add(table);
//关闭
doc.close();
}
下载pdf.js,请注意拷贝目录下所有文件
下载地址:http://mozilla.github.io/pdf.js/
创建test.html进行测试,一定注意路径问题
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>PDF报表导出</title>
</head>
<body>
<input type="button" onclick="openPDF()" value="点我打开pdf预览"/>
<script>
function openPDF(){
var url="/test/pdfExport";
// 引入的pdf.js文件夹的路径下的web/viewer.html 参数:后台流文件URL+fileName.pdf
//注意路径问题 %3D是“=”号的转义,文件名为预览下载后保存的文件名
window.open("../pdfjs/web/viewer.html?file="+ url + "?fileName%3D打印预览.pdf");
}
</script>
</body>
</html>
效果图:
兼容性:谷歌火狐EDGE浏览器正常,ie失败
欢迎点赞评论及指出问题
20180616老王端午假于广州