java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java导出pdf

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

作者:@卓越俊逸_角立杰出@

这篇文章主要为大家详细介绍了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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文