Java导出pdf格式文件

Java实现导出pdf |word |ppt 格式文件

controller层:

bash 复制代码
 @ApiOperation("导出")
    @GetMapping("/download")
    public void download(@RequestParam("userId") Long userId ,HttpServletResponse response) {
        reportResultService.generateWordXWPFDocument(userId,response);
    }

serviceimpi层:

bash 复制代码
 /**
     * 下载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
            com.itextpdf.text.Document document = new com.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 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);
    }

或者可以使用以下工具类实现

bash 复制代码
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<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 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);
        }

    }


}
相关推荐
confiself12 分钟前
大模型系列——LLAMA-O1 复刻代码解读
java·开发语言
Wlq041517 分钟前
J2EE平台
java·java-ee
XiaoLeisj24 分钟前
【JavaEE初阶 — 多线程】Thread类的方法&线程生命周期
java·开发语言·java-ee
豪宇刘38 分钟前
SpringBoot+Shiro权限管理
java·spring boot·spring
Elaine20239143 分钟前
02多线程基础知识
java·多线程
gorgor在码农1 小时前
Redis 热key总结
java·redis·热key
百事老饼干1 小时前
Java[面试题]-真实面试
java·开发语言·面试
customer081 小时前
【开源免费】基于SpringBoot+Vue.JS医院管理系统(JAVA毕业设计)
java·vue.js·spring boot·后端·spring cloud·开源·intellij-idea
2402_857589361 小时前
SpringBoot框架:作业管理技术新解
java·spring boot·后端