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 = 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

com.itextpdf.text.Document document = new com.itextpdf.text.Document(PageSize.A4);

PdfWriter pdfWriter = PdfWriter.getInstance(document, os);

// open

document.open();

List 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 com.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 com.zllms.common.utils.poi;

import com.itextpdf.text.*;

import com.itextpdf.text.pdf.*;

import lombok.extern.slf4j.Slf4j;

import org.apache.commons.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 com.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 com.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 com.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 com.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 com.itextpdf.text.pdf.PdfPTable

**/

public static PdfPTable getTable(List> 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 com.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 com.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);

}

}

}

参考链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。