Java实现导出pdf格式文件的示例代码

 更新时间:2024年02月25日 16:55:10   作者:@卓越俊逸_角立杰出@  
这篇文章主要为大家详细介绍了Java实现导出pdf格式文件的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

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
            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);
    }

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

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);
        }

    }


}

到此这篇关于Java实现导出pdf格式文件的示例代码的文章就介绍到这了,更多相关Java导出pdf内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • javamail实现注册激活邮件

    javamail实现注册激活邮件

    这篇文章主要为大家详细介绍了javamail实现注册激活邮件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • Java中的自旋锁spinlock详解

    Java中的自旋锁spinlock详解

    这篇文章主要介绍了Java中的自旋锁spinlock详解,自旋锁就是循环尝试获取锁,不会放弃CPU时间片,减伤cup上下文切换,缺点是循环会消耗cpu,需要的朋友可以参考下
    2024-01-01
  • Java中的system.getProperty()的作用及使用方法

    Java中的system.getProperty()的作用及使用方法

    System.getProperty() 方法用于获取系统属性的值,该方法接受一个字符串参数,表示要获取的系统属性的名称,返回值为字符串类型,表示该属性的值,接下来通过本文给大家介绍Java中的system.getProperty()的作用及使用方法,感兴趣的朋友跟随小编一起看看吧
    2023-05-05
  • Spring配置数据源的三种方式(小结)

    Spring配置数据源的三种方式(小结)

    本文主要介绍了Spring配置数据源的三种方式,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • Java连接Vmware中的redis

    Java连接Vmware中的redis

    这篇文章主要为大家介绍了Java连接Vmware中的redis
    2016-01-01
  • javac、java打jar包命令实例

    javac、java打jar包命令实例

    这篇文章主要演示Java中使用命令打jar包的实例过程,很实用,希望能给大家做一个参考。
    2016-06-06
  • Java中的多线程一定就快吗?

    Java中的多线程一定就快吗?

    这篇文章主要介绍了Java 多线程的相关资料,帮助大家是否选择开启多线程,感兴趣的朋友可以了解下
    2020-09-09
  • Java计算球从100米高度自由落下问题

    Java计算球从100米高度自由落下问题

    这篇文章主要介绍了Java球从100米高度自由落下问题,需要的朋友可以参考下
    2017-02-02
  • 关于springboot集成swagger3时spring-plugin-core报错的问题

    关于springboot集成swagger3时spring-plugin-core报错的问题

    这篇文章主要介绍了关于springboot集成swagger3时spring-plugin-core报错的问题,本文给大家分享解决方法,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • Spring Boot实现邮件服务(附:常见邮箱的配置)

    Spring Boot实现邮件服务(附:常见邮箱的配置)

    这篇文章主要给大家介绍了关于Spring Boot实现邮件服务的相关资料,文中还附上了常见邮箱的配置,通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12

最新评论