当前位置: 首页 > news >正文

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*/@Overridepublic 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();// documentcom.itextpdf.text.Document document = new com.itextpdf.text.Document(PageSize.A4);PdfWriter pdfWriter = PdfWriter.getInstance(document, os);// opendocument.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;}@Overridepublic 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();}}// 打开文档时,创建一个总页数的模版@Overridepublic void onOpenDocument(PdfWriter writer, Document document) {PdfContentByte cb =writer.getDirectContent();totalPage = cb.createTemplate(30, 16);}// 一页加载完成触发,写入页眉和页脚@Overridepublic 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模版写到指定位置@Overridepublic void onCloseDocument(PdfWriter writer,Document document) {String text = "总" + (writer.getPageNumber()) + "页";ColumnText.showTextAligned(totalPage, Element.ALIGN_LEFT, new Paragraph(text,hfFont), 2, 2, 0);}}}
http://www.lryc.cn/news/305537.html

相关文章:

  • Socket、UDP、TCP协议和简单实现基于UDP的客户端服务端
  • 发布订阅模式:观察者模式的一种变体
  • TiDB离线部署、Tiup部署TiDB
  • 10GBase-T万兆电口模块助力数据中心实现高效数据传输
  • 使用Docker中部署GitLab 避坑指南
  • 我的NPI项目之设备系统启动(八) -- Android14的GKI2.0开发步骤和注意事项
  • 鼠标右键助手专业版 MouseBoost PRO for Mac v3.3.6中文破解
  • React学习计划-react-hooks补充
  • KTV点歌系统vue+springboot音乐歌曲播放器系统
  • vue video 多个视频切换后视频不显示的解决方法
  • 多态与代码屎山
  • Git基本操作(2)
  • 编程笔记 Golang基础 023 切片
  • qt 软件发布(Windows)
  • 《汇编语言》- 读书笔记 - 第11章-标志寄存器
  • 1.QT简介(介绍、安装,项目创建等)
  • 【服务器】服务器推荐
  • 信号系统之线性图像处理
  • uniapp腾讯地图JavaScript Api,H5端和原生APP端可用
  • MyBatisPlus:PG数组类型自动映射问题
  • Data-Shape制作UI节点简介
  • kubernetes负载均衡部署
  • NestJS入门6:日志中间件
  • CommonJS、require、moudle实现两个文件传参
  • 关于php、php-fpm的解释
  • 【CMake】(8)包含库文件
  • 【 JS 进阶 】Web APIs (二)
  • 解决弹性布局父元素设置高自动换行,子元素均分高度问题(align-content: flex-start)
  • 什么是负载均衡集群?
  • 【es6】的新特性