iText组件
生成PDF报表的Java组件–iText,通过在服务器端生成PDF报表,客户端采用超链接显示或下载得到生成的报表。
iText组件的下载
maven坐标:
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.9</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
iText的基本使用
public static void main(String[] args) {
//下载pdf文档
try {
//1.创建文档
Document document = new Document();
//2.新建pdf实例
PdfWriter.getInstance(document, new FileOutputStream(new File("f:/hello.pdf")));
//3.打开文档
document.open();
//4.文档中写入内容
document.add(new Paragraph("hello world"));
//5.关闭文档
document.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
}
}
iText的进阶使用
/**
* 导出分区pdf
* @return
* @throws Exception
*/
@Action("subarea_exportPdf")
public String exportPdf() throws Exception{
//1.从数据库查询查询出来的数据列表
//获取业务查询条件
Specification<Subarea> specification = getSubareaSpecifiaction();
//调用业务层查询数据
List<Subarea> subareaList = subareaService.findSubareaList(specification);
//放入响应下载
String downFilename = "分区数据.pdf";
//获取文件类型
String mimeType = ServletActionContext.getServletContext().getMimeType(downFilename);
//将文件类型放入响应
ServletActionContext.getResponse().setContentType(mimeType);
//设置浏览器类型
String agent = ServletActionContext.getRequest().getHeader("user-agent");
//解决附件名编码
downFilename = FileUtils.encodeDownloadFilename(downFilename, agent);
//获取附件名称和下载方式
String contentDisposition = "attachment;filename="+downFilename;
//将附件名称和下载方式放入响应头信息中
ServletActionContext.getResponse().setHeader("Content-Disposition", contentDisposition);
//将文件流写入客户端响应中
HttpServletResponse response = ServletActionContext.getResponse();
//根据数据生成pdf
try {
//1.创建一个文档
Rectangle rectangle = new Rectangle(PageSize.A4);
//设置文档四周间距
Document document = new Document(rectangle,40,40,40,40);
//指定文档的输出位置
PdfWriter.getInstance(document, response.getOutputStream());
//3.打开文档
document.open();
//4.准备写入内容
//参数1:使用宋体来写pdf文档
//参数2:字体编码,gbk
//参数3:是否内置字体:如果不内置:优点:文件个头小,缺点:打开文档的os中没有该字体,可能显示不正常
//如果内置:优点:os不需要有该字体,也能正常显示,缺点:文件个头大
BaseFont baseFontChinese = BaseFont.createFont(AsianFontMapper.ChineseSimplifiedFont, AsianFontMapper.ChineseSimplifiedEncoding_H, BaseFont.NOT_EMBEDDED);
//文档标题
//参数1:相当于字体(宋体)
//参数2:字体大小
//参数3:是否加粗,斜体
//参数4:字体颜色
Font headerFont = new Font(baseFontChinese,30,Font.BOLD,BaseColor.PINK);
//构建一个段落
Paragraph headerParagraph = new Paragraph("分区列表",headerFont);
//文字居中
headerParagraph.setAlignment(Paragraph.ALIGN_CENTER);
//将添加到文档中
document.add(headerParagraph);
//文档副标题
Font header2font = new Font(baseFontChinese,20,Font.ITALIC,BaseColor.CYAN);
//构建一个段落
Paragraph header2Paragraph = new Paragraph("张三",header2font);
//文字居右
header2Paragraph.setAlignment(Paragraph.ALIGN_RIGHT);
//设置行间距
header2Paragraph.setLeading(29f);
//将副标题加入到文档中
document.add(header2Paragraph);
//文档正文
//设置表格头部字体
Font tableHeaderFont = new Font(baseFontChinese,10,Font.BOLD,BaseColor.BLUE);
//设置表格内容字体
Font tablebodyFont = new Font(baseFontChinese,10,Font.NORMAL,BaseColor.BLACK);
//构建一个表格
PdfPTable pdfPTable = new PdfPTable(7);
pdfPTable.setSpacingBefore(29f);//设置表格到上面段落的高度
pdfPTable.setLockedWidth(true);
//设置表格的宽度和高度
pdfPTable.setTotalWidth(800);
pdfPTable.setTotalWidth(new float[]{60,60,60,50,50,50,150});
//水平对其方式
pdfPTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER);
//垂直对其方式
pdfPTable.getDefaultCell().setVerticalAlignment(Element.ALIGN_CENTER);
//Paragraph:段落,换行
//Phrase:一段文字,不换行
//设置表头内容
pdfPTable.addCell(new PdfPCell(new Phrase("分区编号", tableHeaderFont)));
pdfPTable.addCell(new PdfPCell(new Phrase("区域编码", tableHeaderFont)));
pdfPTable.addCell(new PdfPCell(new Phrase("关键字", tableHeaderFont)));
pdfPTable.addCell(new PdfPCell(new Phrase("起始号",tableHeaderFont)));
pdfPTable.addCell(new PdfPCell(new Phrase("结束号",tableHeaderFont)));
pdfPTable.addCell(new PdfPCell(new Phrase("单双号",tableHeaderFont)));
pdfPTable.addCell(new PdfPCell(new Phrase("位置信息",tableHeaderFont)));
//表格内容
PdfPCell cell = new PdfPCell();
cell.setPadding(5f);//设置padding
for (Subarea subarea : subareaList) {
cell.setPhrase(new Phrase(subarea.getId(),tablebodyFont));
pdfPTable.addCell(cell);
cell.setPhrase(new Phrase(subarea.getRegion().getId(),tablebodyFont));
pdfPTable.addCell(cell);
cell.setPhrase(new Phrase(subarea.getAddresskey(),tablebodyFont));
pdfPTable.addCell(cell);
cell.setPhrase(new Phrase(subarea.getStartnum(),tablebodyFont));
pdfPTable.addCell(cell);
cell.setPhrase(new Phrase(subarea.getEndnum(),tablebodyFont));
pdfPTable.addCell(cell);
cell.setPhrase(new Phrase(subarea.getSingle().toString(),tablebodyFont));
pdfPTable.addCell(cell);
cell.setPhrase(new Phrase(subarea.getPosition(),tablebodyFont));
pdfPTable.addCell(cell);
}
//段落添加到文档中
document.add(pdfPTable);
//5.释放资源
document.close();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("PDF文件下载失败!");
}
//响应的是文件流
return NONE;
}