【JAVA】PDF导出

  • 一、问题描述
  • 二、解决方案:itextpdf
  • 1. 创建文档
  • 2. 设置中文字体和大小
  • 3. 创建表格
  • 4. 创建单元格,加入表格,表格加入文档
  • 5. 关闭表格,刷新输出流
  • 三、注意事项
  • 1. 如果一个PDF有多个表格
  • 2. 文档用表格进行布局
  • 四、实例代码


一、问题描述

案例:工单对应的作业指导书导出pdf文档

二、解决方案:itextpdf

1. 创建文档
OutputStream outputStream = new BufferedOutputStream(response.getOutputStream());
com.itextpdf.text. Document document = new Document();
 document.setPageSize(PageSize.A4);
com.itextpdf.text.pdf. PdfWriter.getInstance(document, outputStream);
 document.open();
2. 设置中文字体和大小
BaseFont bfChinese = BaseFont.createFont(“STSong-Light”, “UniGB-UCS2-H”,BaseFont.NOT_EMBEDDED);
 Font font = new Font(bfChinese, 11, Font.NORMAL);
3. 创建表格
PdfPTable table = new PdfPTable(2); // 表格列数2
 table.setWidthPercentage(100); // 宽度100%填充
 table.setSpacingAfter(10f); // 后间距
 table.setSpacingBefore(10f); // 前间距
 float[] columnWidths = {0.2f, 0.8f}; // 列宽的比重
 table.setWidths(columnWidths);
4. 创建单元格,加入表格,表格加入文档
PdfPCell cell = new PdfPCell();
 cell.setMinimumHeight(22); // 设置单元格高度
 cell.setUseAscender(true); // 设置可以居中
 cell.setHorizontalAlignment(Cell.ALIGN_CENTER); // 设置水平居中
 cell.setVerticalAlignment(Cell.ALIGN_MIDDLE); // 设置垂直居中
 cell.setPhrase(new Phrase(“作业标准名称”, font)); // 设置单元格文本内容
 table.addCell(cell); // 单元格添加至表格
 cell.setPhrase(new Phrase(dto.getStanName(), font));
 table.addCell(cell);
 document.add(table); // 表格添加至文档
5. 关闭表格,刷新输出流
document.close();
 outputStream.flush();
 finally outputStream.close();

三、注意事项

1. 如果一个PDF有多个表格

表格另起一页的方法:document.newPage();

2. 文档用表格进行布局

table套table

表格中直接内嵌表格,会导致表格边框无法影藏,问题如下:

红色框为PdfPCell,黑色框为PdfPTable。

java导出pdf旋转 java实现pdf导出_java导出pdf旋转


解决办法

表格中套一个单元格,单元格中在放表格;

设置单元格内边距为0:myCell.setPadding(0);

单元格添加元素myCell.addElement(myTable);

最终效果如下:

java导出pdf旋转 java实现pdf导出_中文字体_02

四、实例代码

pom加依赖

<dependency>
	<groupId>com.itextpdf</groupId>
	<artifactId>itextpdf</artifactId>
	<version>5.5.3</version>
</dependency>
<dependency>
	<groupId>com.itextpdf</groupId>
	<artifactId>itext-asian</artifactId>
	<version>5.2.0</version>
</dependency>

自动引入

package com.XXX;

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import com.lowagie.text.Cell;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

实例代码

@Override
    public void workExport(String orderId, HttpServletRequest request, HttpServletResponse response) {
        OutputStream outputStream = null;
        String pdfName = "作业指导书报告.PDF";
        try {
            // 防止中文乱码,针对IE或者以IE为内核的浏览器
            String userAgent = request.getHeader("User-Agent");
            if (userAgent.contains("MSIE") || userAgent.contains("Trident")) {
                pdfName = java.net.URLEncoder.encode(pdfName, "UTF-8");
            } else {
                // 非IE浏览器的处理
                pdfName = new String(pdfName.getBytes("UTF-8"), "ISO-8859-1");
            }
            response.reset();
            response.setHeader("Content-Disposition", "attachment; filename=\"" + pdfName + "\"");
            response.setContentType("application/octet-stream;charset=UTF-8");
            outputStream = new BufferedOutputStream(response.getOutputStream());

            Document document = new Document();
            document.setPageSize(PageSize.A4);
            PdfWriter.getInstance(document, outputStream);
            document.open();

            BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);// 设置中文字体
            Font font = new Font(bfChinese, 11, Font.NORMAL);// 设置字体大小

            TaskFormRelationDTO relationDTO = new TaskFormRelationDTO();
            relationDTO.setMoudelObjectId(orderId);
            List<TaskFormRelationDTO> list = taskFormRelationService.queryList(relationDTO);

            if (list != null) {
                for (TaskFormRelationDTO taskFormRelationDTO : list) {
                    document.newPage();
                    LibWorkStandardDto dto = (LibWorkStandardDto) libWorkStandardService.queryById(taskFormRelationDTO.getTfVersionId());

                    // 标题行
                    PdfPTable table = new PdfPTable(2);
                    table.setWidthPercentage(100); // 宽度100%填充
//                    table.setSpacingAfter(10f); // 后间距
                    table.setSpacingBefore(10f); // 前间距
                    float[] columnWidths = {0.2f, 0.8f};
                    table.setWidths(columnWidths);

                    PdfPCell cell = new PdfPCell();
                    cell.setMinimumHeight(22); // 设置单元格高度
                    cell.setUseAscender(true); // 设置可以居中
                    cell.setHorizontalAlignment(Cell.ALIGN_CENTER); // 设置水平居中
                    cell.setVerticalAlignment(Cell.ALIGN_MIDDLE); // 设置垂直居中
                    cell.setPhrase(new Phrase("作业标准名称", font));
                    table.addCell(cell);
                    cell.setPhrase(new Phrase(dto.getStanName(), font));
                    table.addCell(cell);
                    document.add(table);

                    // 类别编码、作业类型、作业周期行
                    table = new PdfPTable(6);
                    table.setWidthPercentage(100); // 宽度100%填充
//                    table.setSpacingBefore(10f); // 前间距
//                    table.setSpacingAfter(10f); // 后间距
                    float[] columnWidths2 = {0.16f, 0.16f, 0.16f, 0.16f, 0.16f, 0.2f};
                    table.setWidths(columnWidths2);
                    cell.setPhrase(new Phrase("类别编码", font));
                    table.addCell(cell);
                    ClassifyVO classifyVO = libClassifyAppService.queryById(dto.getClassifyId());
                    if (classifyVO != null) {
                        cell.setPhrase(new Phrase(classifyVO.getClassifyCode(), font));
                    } else {
                        cell.setPhrase(new Phrase("", font));
                    }
                    table.addCell(cell);
                    cell.setPhrase(new Phrase("作业类型", font));
                    table.addCell(cell);
                    List<Map<String, String>> typeMaps = WorkType.toList();
                    for (Map<String, String> map : typeMaps) {
                        if (dto.getWorkType() != null && dto.getWorkType().equals(map.get("id"))) {
                            String workTypeStr = map.get("text");
                            if (workTypeStr != null) {
                                cell.setPhrase(new Phrase(workTypeStr, font));
                            } else {
                                cell.setPhrase(new Phrase("", font));
                            }
                        }
                    }
                    table.addCell(cell);
                    cell.setPhrase(new Phrase("作业周期", font));
                    table.addCell(cell);
                    List<Map<String, String>> cycleMaps = WorkCycle.toList();
                    for (Map<String, String> map : cycleMaps) {
                        if (dto.getWorkCycle() != null && dto.getWorkCycle().equals(map.get("id"))) {
                            String workCycleStr = map.get("text");
                            if (workCycleStr != null) {
                                cell.setPhrase(new Phrase(workCycleStr, font));
                            } else {
                                cell.setPhrase(new Phrase("", font));
                            }
                        }
                    }
                    table.addCell(cell);
                    document.add(table);
                }
            }
            
            // 省略中间业务一万行代码。。。
            
            document.close();
            outputStream.flush();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (outputStream != null) {
                    outputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }