Java实现导出pdf |word |ppt 格式文件
controller层:
@ApiOperation("导出")
@GetMapping("/download")
public void download(@RequestParam("userId") Long userId ,HttpServletResponse response) {
reportResultService.generateWordXWPFDocument(userId,response);
}
serviceimpi层:
/**
* 下载word
* @param userId
* @param response
*/
// @Override
// public void generateWordXWPFDocument(Long userId,HttpServletResponse response) {
// try {
// XWPFDocument doc = new XWPFDocument();
// List<ReportDetail> ReportDetail = reportResultMapper.reportDetails(userId);
// createParagraph(doc, ReportDetail.get(0).getReport());
// response.reset();
// response.setContentType("application/octet-stream");
// response.setHeader("Content-disposition",
// "attachment;filename=user_word_" + System.currentTimeMillis() + ".docx");
// OutputStream os = response.getOutputStream();
// doc.write(os);
// os.close();
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
/**
* 下载pdf
* @param userId
* @param response
*/
@Override
public void generateWordXWPFDocument(Long userId,HttpServletResponse response) {
try {
response.reset();
response.setContentType("application/octet-stream");
response.setHeader("Content-disposition", "attachment;filename=user_pdf_" + System.currentTimeMillis() + ".pdf");
OutputStream os = response.getOutputStream();
// document
***.itextpdf.text.Document document = new ***.itextpdf.text.Document(PageSize.A4);
PdfWriter pdfWriter = PdfWriter.getInstance(document, os);
// open
document.open();
List<ReportDetail> reportDetails = reportResultMapper.reportDetails(userId);
if (!reportDetails.isEmpty()) {
String report = reportDetails.get(0).getReport();
document.add(createParagraph(report));
}
document.close();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 下载word
* @param doc
* @param content
*/
private void createParagraph(XWPFDocument doc, String content) {
XWPFParagraph actType = doc.createParagraph();
XWPFRun runText2 = actType.createRun();
runText2.setText(content);
runText2.setFontSize(11);
// 设置段落对齐方式
actType.setAlignment(ParagraphAlignment.CENTER); // 居中对齐
actType.setVerticalAlignment(TextAlignment.CENTER); // 垂直居中对齐
}
/**
* 下载pdf
* @param content
* @return
* @throws IOException
* @throws DocumentException
*/
private ***.itextpdf.text.Paragraph createParagraph(String content) throws IOException, DocumentException {
Font font = new Font(getBaseFont(), 12, Font.NORMAL);
Paragraph paragraph = new Paragraph(content, font);
paragraph.setAlignment(Element.ALIGN_LEFT);
paragraph.setIndentationLeft(12); //设置左缩进
paragraph.setIndentationRight(12); //设置右缩进
paragraph.setFirstLineIndent(24); //设置首行缩进
paragraph.setLeading(20f); //行间距
paragraph.setSpacingBefore(5f); //设置段落上空白
paragraph.setSpacingAfter(10f); //设置段落下空白
return paragraph;
}
private BaseFont getBaseFont() throws IOException, DocumentException {
return BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
}
或者可以使用以下工具类实现
package ***.zllms.***mon.utils.poi;
import ***.itextpdf.text.*;
import ***.itextpdf.text.pdf.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.***mons.lang3.StringUtils;
import java.io.IOException;
import java.util.List;
import java.util.Objects;
/**
* @Author: wangjj
* @Date: 2020/11/4 15:53
* @Description pdf生成工具类
*/
@Slf4j
public class PdfCreateUtil {
/**
* @Author Yangy
* @Description 创建document
* @Date 16:24 2020/11/5
* @Param []
* @return ***.itextpdf.text.Document
**/
public static Document getDocumentInstance(){
//此处方法可以初始化document属性,document默认A4大小
Document document = new Document();
return document;
}
/**
* @Author Yangy
* @Description 设置document基本属性
* @Date 16:24 2020/11/5
* @Param [document]
* @return ***.itextpdf.text.Document
**/
public static Document setDocumentProperties(Document document,String title,String author,String subject,String keywords,String creator){
// 标题
document.addTitle(title);
// 作者
document.addAuthor(author);
// 主题
document.addSubject(subject);
// 关键字
document.addKeywords(keywords);
// 创建者
document.addCreator(creator);
return document;
}
/**
* @Author Yangy
* @Description 创建段落,可设置段落通用格式
* @Date 16:24 2020/11/5
* @Param []
* @return ***.itextpdf.text.Paragraph
**/
public static Paragraph getParagraph(String content,Font fontStyle,int align,int lineIdent,float leading){
//设置内容与字体样式
Paragraph p = new Paragraph(content,fontStyle);
//设置文字居中 0=靠左,1=居中,2=靠右
p.setAlignment(align);
//首行缩进
p.setFirstLineIndent(lineIdent);
//设置左缩进
// p.setIndentationLeft(12);
//设置右缩进
// p.setIndentationRight(12);
//行间距
p.setLeading(leading);
//设置段落上空白
p.setSpacingBefore(5f);
//设置段落下空白
p.setSpacingAfter(10f);
return p;
}
/**
* @Author Yangy
* @Description 获取图片
* @Date 16:39 2020/11/5
* @Param [imgUrl]
* @return ***.itextpdf.text.Image
**/
public static Image getImage(String imgUrl,int align,int percent){
Image image = null;
try {
image = Image.getInstance(imgUrl);
} catch (BadElementException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//设置图片位置
image.setAlignment(align);
//依照比例缩放
image.scalePercent(percent);
return image;
}
/**
* @Author Yangy
* @Description 创建表格
* @Date 16:43 2020/11/5
* @Param [dataList=数据集合,maxWidth=表格最大宽度,align=位置(0,靠左 1,居中 2,靠右)
* @return ***.itextpdf.text.pdf.PdfPTable
**/
public static PdfPTable getTable(List<List<String>> dataList,int maxWidth,int align,Font font){
if(Objects.isNull(dataList) || dataList.size() == 0){
log.warn("data list is empty when create table");
return null;
}
int columns = dataList.get(0).size();
PdfPTable table = new PdfPTable(columns);
table.setTotalWidth(maxWidth);
table.setLockedWidth(true);
table.setHorizontalAlignment(align);
//设置列边框
table.getDefaultCell().setBorder(1);
//此处可自定义表的每列宽度比例,但需要对应列数
// int width[] = {10,45,45};//设置每列宽度比例
// table.setWidths(width);
table.setHorizontalAlignment(Element.ALIGN_CENTER);//居中
//边距:单元格的边线与单元格内容的边距
table.setPaddingTop(1f);
//间距:单元格与单元格之间的距离
table.setSpacingBefore(0);
table.setSpacingAfter(0);
for (int i = 0; i < dataList.size(); i++) {
for (int j = 0; j < dataList.get(i).size(); j++) {
table.addCell(createCell(dataList.get(i).get(j),font));
}
}
return table;
}
/**
* @Author Yangy
* @Description 自定义表格列样式属性
* @Date 16:54 2020/11/5
* @Param [value, font]
* @return ***.itextpdf.text.pdf.PdfPCell
**/
private static PdfPCell createCell(String value, Font font) {
PdfPCell cell = new PdfPCell();
//设置列纵向位置,居中
cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
//设置列横向位置,居中
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
cell.setPhrase(new Phrase(value, font));
return cell;
}
/**
* @Author Yangy
* @Description 获取自定义字体
* @Date 11:38 2020/11/6
* @Param [size=字大小, style=字风格, fontFamily=字体, color=颜色]
* @return ***.itextpdf.text.Font
**/
public static Font setFont(float size, int style, String fontFamily, BaseColor color)
throws IOException, DocumentException {
//设置中文可用
BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Font font = new Font(bfChinese,size,style);
font.setFamily(fontFamily);
font.setColor(color);
return font;
}
/**
* @Author Yangy
* @Description 创建水印设置
* @Date 12:04 2020/11/6
* @Param [markContent]
* @return xxx.xxx.data.util.PdfCreateUtil.Watermark
**/
public static Watermark createWaterMark(String markContent) throws IOException, DocumentException {
return new Watermark(markContent);
}
/**
* @Author Yangy
* @Description 设置水印
* @Date 12:03 2020/11/6
* @Param
* @return
**/
public static class Watermark extends PdfPageEventHelper {
Font FONT = PdfCreateUtil.setFont(30f, Font.BOLD, "",new GrayColor(0.95f));
private String waterCont;//水印内容
public Watermark() throws IOException, DocumentException {
}
public Watermark(String waterCont) throws IOException, DocumentException {
this.waterCont = waterCont;
}
@Override
public void onEndPage(PdfWriter writer, Document document) {
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
ColumnText.showTextAligned(writer.getDirectContentUnder(),
Element.ALIGN_CENTER,
new Phrase(StringUtils.isEmpty(this.waterCont) ? "" : this.waterCont, FONT),
(50.5f + i * 350),
(40.0f + j * 150),
writer.getPageNumber() % 2 == 1 ? 45 : -45);
}
}
}
}
public static HeaderFooter createHeaderFooter(){
return new HeaderFooter();
}
/**
* @Author Yangy
* @Description 页眉/页脚
* @Date 12:25 2020/11/6
* @Param
* @return
**/
public static class HeaderFooter extends PdfPageEventHelper {
// 总页数
PdfTemplate totalPage;
Font hfFont;
{
try {
hfFont = setFont(8, Font.NORMAL,"",BaseColor.BLACK);
} catch (DocumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
// 打开文档时,创建一个总页数的模版
@Override
public void onOpenDocument(PdfWriter writer, Document document) {
PdfContentByte cb =writer.getDirectContent();
totalPage = cb.createTemplate(30, 16);
}
// 一页加载完成触发,写入页眉和页脚
@Override
public void onEndPage(PdfWriter writer, Document document) {
PdfPTable table = new PdfPTable(3);
try {
table.setTotalWidth(PageSize.A4.getWidth() - 100);
table.setWidths(new int[] { 24, 24, 3});
table.setLockedWidth(true);
table.getDefaultCell().setFixedHeight(-10);
table.getDefaultCell().setBorder(Rectangle.BOTTOM);
table.addCell(new Paragraph("我是页眉/页脚", hfFont));
table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT);
table.addCell(new Paragraph("第" + writer.getPageNumber() + "页/", hfFont));
// 总页数
PdfPCell cell = new PdfPCell(Image.getInstance(totalPage));
cell.setBorder(Rectangle.BOTTOM);
table.addCell(cell);
// 将页眉写到document中,位置可以指定,指定到下面就是页脚
table.writeSelectedRows(0, -1, 50,PageSize.A4.getHeight() - 20, writer.getDirectContent());
} catch (Exception de) {
throw new ExceptionConverter(de);
}
}
// 全部完成后,将总页数的pdf模版写到指定位置
@Override
public void onCloseDocument(PdfWriter writer,Document document) {
String text = "总" + (writer.getPageNumber()) + "页";
ColumnText.showTextAligned(totalPage, Element.ALIGN_LEFT, new Paragraph(text,hfFont), 2, 2, 0);
}
}
}