itext 生成pdf 输出特殊符号_文件系统(01):基于SpringBoot管理Excel和PDF

一、文档类型简介

1、Excel文档

Excel一款电子表格软件。直观的界面、出色的计算功能和图表工具,在系统开发中,经常用来把数据转存到Excel文件,或者Excel数据导入系统中,这就涉及数据转换问题。

2、PDF文档

PDF是可移植文档格式,是一种电子文件格式,具有许多其他电子文档格式无法相比的优点。PDF文件格式可以将文字、字型、格式、颜色及独立于设备和分辨率的图形图像等封装在一个文件中。该格式文件还可以包含超文本链接、声音和动态影像等电子信息,支持特长文件,集成度和安全可靠性都较高。

二、Excel文件管理

1、POI依赖

Apache POI是Apache软件基金会的开源类库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。

org.apache.poi    poi    3.9org.apache.poi    poi-ooxml    3.9

2、文件读取

public static List> readExcel(String path) throws Exception {    File file = new File(path) ;    List> list = new LinkedList<>();    XSSFWorkbook xwb = new XSSFWorkbook(new FileInputStream(file));    // 读取 Sheet1 表格内容    XSSFSheet sheet = xwb.getSheetAt(0);    // 读取行数:不读取Excel表头    for (int i = (sheet.getFirstRowNum()+1); i <= (sheet.getPhysicalNumberOfRows()-1); i++) {        XSSFRow row = sheet.getRow(i);        if (row == null) { continue; }        List linked = new LinkedList<>();        for (int j = row.getFirstCellNum(); j <= row.getLastCellNum(); j++) {            XSSFCell cell = row.getCell(j);            if (cell == null) { continue; }            Object value ;            // 这里需根据实际业务情况处理            switch (cell.getCellType()) {                case XSSFCell.CELL_TYPE_NUMERIC:                    //处理数值带{.0}问题                    value = Double.valueOf(String.valueOf(cell)).longValue() ;                    break;                default:                    value = cell.toString();            }            linked.add(value);        }        if (linked.size()!= 0) {            list.add(linked);        }    }    return list;}

3、文件创建

public static void createExcel(String excelName, String[] headList,List> dataList)        throws Exception {    // 创建 Excel 工作簿    XSSFWorkbook workbook = new XSSFWorkbook();    XSSFSheet sheet = workbook.createSheet();    // 创建表头    XSSFRow row = sheet.createRow(0);    for (int i = 0; i < headList.length; i++) {        XSSFCell cell = row.createCell(i);        cell.setCellType(XSSFCell.CELL_TYPE_STRING);        cell.setCellValue(headList[i]);    }    //添加数据    for (int line = 0; line < dataList.size(); line++) {        XSSFRow rowData = sheet.createRow(line+1);        List data = dataList.get(line);        for (int j = 0; j < headList.length; j++) {            XSSFCell cell = rowData.createCell(j);            cell.setCellType(XSSFCell.CELL_TYPE_STRING);            cell.setCellValue((data.get(j)).toString());        }    }    FileOutputStream fos = new FileOutputStream(excelName);    workbook.write(fos);    fos.flush();    fos.close();}

4、文件导出

public static void exportExcel(String[] headList, List> dataList,                               OutputStream outputStream) throws Exception {    // 创建 Excel 工作簿    XSSFWorkbook workbook = new XSSFWorkbook();    XSSFSheet sheet = workbook.createSheet();    // 创建表头    XSSFRow row = sheet.createRow(0);    for (int i = 0; i < headList.length; i++) {        XSSFCell cell = row.createCell(i);        cell.setCellType(XSSFCell.CELL_TYPE_STRING);        cell.setCellValue(headList[i]);    }    //添加数据    for (int line = 0; line < dataList.size(); line++) {        XSSFRow rowData = sheet.createRow(line+1);        List data = dataList.get(line);        for (int j = 0; j < headList.length; j++) {            XSSFCell cell = rowData.createCell(j);            cell.setCellType(XSSFCell.CELL_TYPE_STRING);            cell.setCellValue((data.get(j)).toString());        }    }    workbook.write(outputStream);    outputStream.flush();    outputStream.close();}

5、文件导出接口

@RestControllerpublic class ExcelWeb {    @RequestMapping("/web/outExcel")    public void outExcel (HttpServletResponse response) throws Exception {        String exportName = "2020-01-user-data" ;        response.setContentType("application/vnd.ms-excel");        response.addHeader("Content-Disposition", "attachment;filename="+                             URLEncoder.encode(exportName, "UTF-8") + ".xlsx");        List> dataList = ExcelUtil.readExcel("F:file-typeuser-excel.xlsx") ;        String[] headList = new String[]{"用户ID", "用户名", "手机号"} ;        ExcelUtil.exportExcel(headList,dataList,response.getOutputStream()) ;    }}

三、PDF文件管理

1、IText依赖

iText是一种生成PDF报表的Java组件。通过在服务器端使用页面或API封装生成PDF报表,客户端可以通过超链接直接显示或下载到本地,在系统开发中通常用来生成比较正式的报告或者合同类的电子文档。

com.itextpdf    itextpdf    5.5.11com.itextpdf.tool    xmlworker    5.5.11

2、API二次封装

首先对于Itext提供的API做一下表格、段落、图片等基础样式的二次封装,可以更好的适配业务。

public class PdfFontUtil {    private PdfFontUtil(){}    /**     * 段落样式获取     */    public static Paragraph getParagraph (String content, Font font,Integer alignment){        Paragraph paragraph = new Paragraph(content,font) ;        if (alignment != null && alignment >= 0){            paragraph.setAlignment(alignment);        }        return paragraph ;    }    /**     * 图片样式     */    public static Image getImage (String imgPath,float width,float height) throws Exception {        Image image = Image.getInstance(imgPath);        image.setAlignment(Image.MIDDLE);        if (width > 0 && height > 0){            image.scaleAbsolute(width, height);        }        return image ;    }    /**     * 表格生成     */    public static PdfPTable getPdfPTable01 (int numColumns,float totalWidth) throws Exception {        // 表格处理        PdfPTable table = new PdfPTable(numColumns);        // 设置表格宽度比例为%100        table.setWidthPercentage(100);        // 设置宽度:宽度平均        table.setTotalWidth(totalWidth);        // 锁住宽度        table.setLockedWidth(true);        // 设置表格上面空白宽度        table.setSpacingBefore(10f);        // 设置表格下面空白宽度        table.setSpacingAfter(10f);        // 设置表格默认为无边框        table.getDefaultCell().setBorder(0);        table.setPaddingTop(50);        table.setSplitLate(false);        return table ;    }    /**     * 表格内容     */    public static PdfPCell getPdfPCell (Phrase phrase){        return new PdfPCell (phrase) ;    }    /**     * 表格内容带样式     */    public static void addTableCell (PdfPTable dataTable,Font font,List cellList){        for (String content:cellList) {            dataTable.addCell(getParagraph(content,font,-1));        }    }}

3、生成PDF文件

这里基于上面的工具类,画一个PDF页面作为参考。

public class PdfPage01 {    // 基础配置    private static String PDF_SITE = "F:file-typePDF页面2020-01-15.pdf" ;    private static String FONT = "C:/Windows/Fonts/simhei.ttf";    private static String PAGE_TITLE = "PDF数据导出报告" ;    // 基础样式    private static Font TITLE_FONT = FontFactory.getFont(FONT, BaseFont.IDENTITY_H,20, Font.BOLD);    private static Font NODE_FONT = FontFactory.getFont(FONT, BaseFont.IDENTITY_H,15, Font.BOLD);    private static Font BLOCK_FONT = FontFactory.getFont(FONT, BaseFont.IDENTITY_H,13, Font.BOLD, BaseColor.BLACK);    private static Font INFO_FONT = FontFactory.getFont(FONT, BaseFont.IDENTITY_H,12, Font.NORMAL,BaseColor.BLACK);    private static Font CONTENT_FONT = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);    private static void createPdfPage () throws Exception {        // 创建文档        Document document = new Document();        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(PDF_SITE));        document.open();        // 报告标题        document.add(PdfFontUtil.getParagraph(PAGE_TITLE,TITLE_FONT,1)) ;        document.add(PdfFontUtil.getParagraph("商户名称:XXX科技有限公司",INFO_FONT,-1)) ;        document.add(PdfFontUtil.getParagraph("生成时间:2020-01-15",INFO_FONT,-1)) ;        // 报告内容        // 段落标题 + 报表图        document.add(PdfFontUtil.getParagraph("城市数据分布统计",NODE_FONT,-1)) ;        document.add(PdfFontUtil.getParagraph("· 可视化图表",BLOCK_FONT,-1)) ;        // 设置图片宽高        float documentWidth = document.getPageSize().getWidth() - document.leftMargin() - document.rightMargin();        float documentHeight = documentWidth / 580 * 320;        document.add(PdfFontUtil.getImage("F:file-typemyChart.jpg",documentWidth-80,documentHeight-80)) ;        // 数据表格        document.add(PdfFontUtil.getParagraph("· 数据详情",BLOCK_FONT,-1)) ;        PdfPTable dataTable = PdfFontUtil.getPdfPTable01(4,400) ;        // 设置表格        List tableHeadList = tableHead () ;        List> tableDataList = getTableData () ;        PdfFontUtil.addTableCell(dataTable,CONTENT_FONT,tableHeadList);        for (List tableData : tableDataList) {            PdfFontUtil.addTableCell(dataTable,CONTENT_FONT,tableData);        }        document.add(dataTable);        document.add(PdfFontUtil.getParagraph("· 报表描述",BLOCK_FONT,-1)) ;        document.add(PdfFontUtil.getParagraph("数据报告可以监控每天的推广情况," +                "可以针对不同的数据表现进行分析,以提升推广效果。",CONTENT_FONT,-1)) ;        document.newPage() ;        document.close();        writer.close();    }    private static List> getTableData (){        List> tableDataList = new ArrayList<>() ;        for (int i = 0 ; i < 3 ; i++){            List tableData = new ArrayList<>() ;            tableData.add("浙江"+i) ;            tableData.add("杭州"+i) ;            tableData.add("276"+i) ;            tableData.add("33.3%") ;            tableDataList.add(tableData) ;        }        return tableDataList ;    }    private static List tableHead (){        List tableHeadList = new ArrayList<>() ;        tableHeadList.add("省份") ;        tableHeadList.add("城市") ;        tableHeadList.add("数量") ;        tableHeadList.add("百分比") ;        return tableHeadList ;    }    public static void main(String[] args) throws Exception {        createPdfPage () ;    }}

4、页面效果

f71c84374ed3abf01811a2328983f814.png

四、网页转PDF

1、页面Jar包依赖

org.springframework.boot    spring-boot-starter-thymeleaforg.springframework.boot    spring-boot-starter-freemarker

2、编写页面样式

    Title项目信息:
名称:${name}
作者:${author}


3、核心配置类

public class PageConfig {    private static final String DEST = "F:file-typeHTML页面2020-01-15.pdf";    private static final String HTML = "/pdf_page_one.html";    private static final String FONT = "C:/Windows/Fonts/simsun.ttc";    private static Configuration freemarkerCfg = null ;    static {        freemarkerCfg = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);        //freemarker的模板目录        try {            String path = "TODO:模板路径{自定义}" ;            freemarkerCfg.setDirectoryForTemplateLoading(new File(path));        } catch (IOException e) {            e.printStackTrace();        }    }    /**     * 创建文档     */    private static void createPdf(String content,String dest) throws Exception {        Document document = new Document();        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));        document.open();        XMLWorkerFontProvider fontImp = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);        fontImp.register(FONT);        XMLWorkerHelper.getInstance().parseXHtml(writer, document,                new ByteArrayInputStream(content.getBytes()), null, Charset.forName("UTF-8"), fontImp);        document.close();    }    /**     * 页面渲染     */    private static String freeMarkerRender(Map data, String htmlTmp) throws Exception {        Writer out = new StringWriter();        Template template = freemarkerCfg.getTemplate(htmlTmp,"UTF-8");        template.process(data, out);        out.flush();        out.close();        return out.toString();    }    /**     * 方法入口     */    public static void main(String[] args) throws Exception {        Map data = new HashMap<> ();        data.put("name","smile");        data.put("author","知了") ;        String content = PageConfig.freeMarkerRender(data,HTML);        PageConfig.createPdf(content,DEST);    }}

4、转换效果图

091cb3e4fb9b4a464f3d1c6a6b82fa2d.png

推荐阅读:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
iText 是一个开源的 Java PDF 库,可以用来创建、操作和处理 PDF 文件。以下是基于 iText 生成 PDF 文件的简单示例: 1. 添加 iText 依赖 在项目的 pom.xml 文件添加如下依赖: ```xml <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.13</version> </dependency> ``` 2. 创建 PDF 文件 使用 iText 创建 PDF 文件的步骤如下: ```java // 创建 PDF 文档对象 Document document = new Document(); // 创建 PDF 输出PdfWriter.getInstance(document, new FileOutputStream("output.pdf")); // 打开文档 document.open(); // 添加内容 document.add(new Paragraph("Hello, World!")); // 关闭文档 document.close(); ``` 在上面的代码,首先创建了一个 Document 对象,然后使用 PdfWriter 创建一个 PDF 输出流,将输出流与 Document 对象关联。接下来打开文档,添加内容,最后关闭文档。 3. 添加表格和图片 除了文本,iText 还支持添加表格和图片等元素。以下是添加表格和图片的示例代码: ```java // 创建 PDF 文档对象 Document document = new Document(); // 创建 PDF 输出PdfWriter.getInstance(document, new FileOutputStream("output.pdf")); // 打开文档 document.open(); // 添加表格 PdfPTable table = new PdfPTable(3); table.addCell("Name"); table.addCell("Age"); table.addCell("Gender"); table.addCell("John Doe"); table.addCell("30"); table.addCell("Male"); document.add(table); // 添加图片 Image image = Image.getInstance("image.png"); document.add(image); // 关闭文档 document.close(); ``` 在上面的代码,首先创建了一个 PdfPTable 对象,添加了表头和数据,然后将表格添加到 PDF 文档。接下来添加了一张图片,最后关闭文档。 以上是基于 iText 生成 PDF 文件的简单示例,iText 还支持更丰富的 PDF 操作,如添加书签、水印、表单等功能。详细的示例可以参考 iText 官方文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值