iText导出PDF多表格

简介: iText导出PDF多表格

iText是一种生成PDF报表的Java组件。通过在服务器端使用Jsp或JavaBean生成PDF报表,客户端采用超链接显示或下载得到生成的报表,这样就很好的解决了B/S系统的报表处理问题。在使用iText的过程中,遇到了一下几个问题。


1.中文不显示


2.没有合适的工具类样式


3.用输出流导出可供浏览器下载的问题


几经度娘最终整合了很多代码,终于汇总成了可以简易使用的工具类


1.中文不显示


   主要是itext版本的问题,itext一开始是只有一个itext的jar包,后来升级后拆分成两个jar包,一个是itextpdf一个是itext-asian。我这边使用的版本是itextpdf-5.5.6.jar和itext-asian-5.2.0.jar。确保itext版本匹配。itext-asian中含有中文字体包,可以直接使用这里的中文字体。当然也推荐这种方式,因为其他方式依赖于环境的字体包。

 //1:使用iTextAsian.jar包中的字体
BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Font font = new Font(baseFont);
//2:使用Windows系统字体
BaseFont baseFont_zh = BaseFont.createFont("C:\\Windows\\Fonts\\simsunb.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
Font font_zh = new Font(baseFont_zh);
//3:使用资源字体,也就是自己下载的字体
BaseFont baseFont_resources = BaseFont.createFont("\\font\\方正舒体.TIF",BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
Font font_resources = new Font(baseFont_resources)

2.iText工具类

使用工具类可以快速生成表格、段落、标题、分页,并且对这些元素进行基本的设置。

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.List;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
public class PDFUtil {
  static BaseFont baseFont = null;
  static {
    try {
      baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
    } catch (Exception e) {
      // TODO: handle exception
      e.printStackTrace();
    }
  }
  /**
   * PDF大标题字体
   */
  public static Font PDFTITLEFONT = new Font(baseFont, 16, Font.BOLD);
  /**
   * PDF小标题字体
   */
  public static Font PDFTITLEFONT1 = new Font(baseFont, 13, Font.NORMAL);
  /**
   * 表格宽度百分比
   */
  public static Integer WIDTHPERCENTAGE = 98;
  /**
   * 表格标题字体
   */
  public static Font TITLEFONT = new Font(baseFont, 12, Font.NORMAL);
  /**
   * 翻页加载表头
   */
  public static Integer HEADERROWS = 1;
  /**
   * 翻页不加载表头
   */
  public static Integer NOHEADERROWS = 0;
  /**
   * 表格内容字体
   */
  public static Font CONTENTFONT = new Font(baseFont, 9, Font.NORMAL);
  /**
   * PDF表格样式
   */
  private static PdfPCell cell = new PdfPCell();
  /**
   * 获取表格
   */
  public static PdfPCell getCell() {
    // 水平居中
    cell.setHorizontalAlignment(Element.ALIGN_CENTER);
    // 垂直居中
    cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
    // 边距
    cell.setPadding(1);
    // 行高
    cell.setMinimumHeight(22);
    // 不换行
    // cell.setNoWrap(true);
    // 颜色淡化
    // cell.setBorderColor(Color.decode("#EBEEF5"));
    cell.setBorderColor(new BaseColor(1));
    return cell;
  }
  /**
   * 获取表格并赋值
   */
  public static PdfPCell getCell(Paragraph content) {
    cell = getCell();
    // 设置内容
    cell.setPhrase(content);
    return cell;
  }
  /**
   * @Description 生成PDF表格
   * @param titleNum
   *            列数
   * @param tableWidth
   *            列宽
   * @param titles
   *            标题集合
   * @param contents
   *            内容集合
   * @param headerRows
   *            是否再次加载表头
   * @return
   * @throws Exception
   */
  public static PdfPTable getPDFTable(int[] tableWidth, String[] titles, List<Object> contents, int headerRows)
      throws Exception {
    // 创建表格对象
    // 列数
    PdfPTable table = new PdfPTable(titles.length);
    // 表格宽度百分比
    table.setWidthPercentage(WIDTHPERCENTAGE);
    table.setSpacingBefore(20);
    table.setSpacingAfter(20);
    // 列宽百分比
    if (tableWidth != null)
      table.setWidths(tableWidth);
    // 翻页加载表头
    if (headerRows == HEADERROWS)
      table.setHeaderRows(HEADERROWS);
    // 标题集合
    String[] pdfTitles = titles;
    if (pdfTitles != null && pdfTitles.length > 0) {
      // 标题
      for (String pdfTitle : pdfTitles) {
        PdfPCell title = getCell(new Paragraph(pdfTitle, TITLEFONT));
        table.addCell(title);
      }
    }
    // 内容集合
    if (contents != null && contents.size() > 0) {
      Field[] fields = contents.getClass().getDeclaredFields();
      String[] fieldNames = new String[fields.length];
      for (int i = 0; i < fields.length; i++) {
        fieldNames[i] = fields[i].getName();
      }
    }
    // 内容集合
    if (contents != null && contents.size() > 0) {
      for (Object obj : contents) {
        Field[] fields = obj.getClass().getDeclaredFields();
        String[] fieldNames = new String[fields.length];
        for (int i = 0; i < fields.length; i++) {
          fieldNames[i] = fields[i].getName();
          String firstLetter = fieldNames[i].substring(0, 1).toUpperCase();
          String getter = "get" + firstLetter + fieldNames[i].substring(1);
          Method method = obj.getClass().getMethod(getter, new Class[] {});
          Object value = method.invoke(obj, new Object[] {});
          PdfPCell content = getCell(new Paragraph(String.valueOf(value), CONTENTFONT));
          table.addCell(content);
        }
        // 撑行数,否则最后一行会消失
        table.addCell("");
        table.completeRow();
      }
    }
    return table;
  }
  /**
   * @param content 段落内容
   * @param top 上边距
   * @param bottom 下边距
   * @param align 居中
   * @param type 标题类别
   * @return
   * @throws Exception
   */
  public static Paragraph getPDFParagraph(String content, int top, int bottom, int align, int type) throws Exception {
    Paragraph paragraph = null;
    if (type == 1) {
      paragraph = new Paragraph(content, PDFTITLEFONT);
    } else {
      paragraph = new Paragraph(content, PDFTITLEFONT1);
    }
    paragraph.setSpacingAfter(top);
    paragraph.setSpacingBefore(bottom);
    paragraph.setAlignment(align);
    return paragraph;
  }
}
import com.itextpdf.text.Document;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfPageEventHelper;
import com.itextpdf.text.pdf.PdfTemplate;
import com.itextpdf.text.pdf.PdfWriter;
/**
 * @Description 分页工具
 * @author ry
 * @date 2019年7月12日
 */
public class PDFMaker extends PdfPageEventHelper {
    /** 这个PdfTemplate实例用于保存总页数 */
    public PdfTemplate tpl;
    /** 页码字体 */
    public BaseFont helv;
    @Override
    public void onCloseDocument(PdfWriter writer, Document arg1) {
    tpl.beginText();
    tpl.setFontAndSize(helv, 12);
    tpl.setTextMatrix(0, 0);
    tpl.showText("" + (writer.getPageNumber() - 1));
    tpl.endText();
    }
    /*
     * (non-Javadoc)
     * 
     * @see
     * com.lowagie.text.pdf.PdfPageEventHelper#onEndPage(com.lowagie.text.pdf
     * .PdfWriter, com.lowagie.text.Document)
     */
    @Override
    public void onEndPage(PdfWriter writer, Document document) {
    PdfContentByte cb = writer.getDirectContent();
    cb.saveState();
    String text = " Page " + writer.getPageNumber() + " of ";
    float textSize = helv.getWidthPoint(text, 9);
    float textBase = document.bottom();
    cb.beginText();
    cb.setFontAndSize(helv, 9);
    // for odd pagenumbers, show t
    cb.setTextMatrix(document.left(), textBase);
    cb.showText(text);
    cb.endText();
    cb.addTemplate(tpl, document.left() + textSize, textBase);
    cb.restoreState();
    }
    /*
     * (non-Javadoc)
     * 
     * @see
     * com.lowagie.text.pdf.PdfPageEventHelper#onOpenDocument(com.lowagie.text
     * .pdf.PdfWriter, com.lowagie.text.Document)
     */
    @Override
    public void onOpenDocument(PdfWriter writer, Document arg1) {
    try {
        // initialization of the template
        tpl = writer.getDirectContent().createTemplate(100, 100);
        // tpl.setBoundingBox(new Rectangle(0, 0, 10, 10));
        // initialization of the font
        helv = BaseFont.createFont("Helvetica", BaseFont.WINANSI, false);
    } catch (Exception e) {
    }
    }
}

3.PDF文件流下载

后台返回itext生成的输出流,这里使用工具类生成了多个表格。

public void exportPDFTest() {
    HttpServletRequest request = ServletActionContext.getRequest();
    SysUserInfo user = (SysUserInfo) request.getSession().getAttribute("user");
    try {
      HttpServletResponse response = ServletActionContext.getResponse();
      response.setContentType("text/json");
      String resId = request.getParameter("resId");
      if (resId == null || resId.trim().equals("")) {
        SysLogUtil.saveLog(this.logService, "ID不能为空", user.getAccount(), request,
            String.valueOf(user.getId()));
        return;
      }
      ByteArrayOutputStream baos = new ByteArrayOutputStream();// 构建字节输出流
      // 实例化文档对象
      Document document = new Document(PageSize.A4, 10, 10, 10, 10);
      // 创建 PdfWriter 对象 文件的输出路径+文件的实际名称
      PdfWriter writer = PdfWriter.getInstance(document, baos);// 设置分页
      // writer.setPageEvent(new PDFMaker());
      document.open();// 打开文档
      // 创建一个段落
      document.add(PDFUtil.getPDFParagraph("测试PDF标题", 0, 20, Element.ALIGN_CENTER, 1));
      // 标题
      String[] title = { "ID", "姓名", "年龄", "生日", "出生地", "身份证", "住址" };
      // 列宽
      int tableWidth[] = { 10, 15, 15, 15, 15, 15, 15 };
      Map<String, Object> map = this.service.getPolicyOptimization(Long.parseLong(resId));
      if (map != null) {
        if (map.get("nullList") != null) {
          // 添加一个段落
          document.add(PDFUtil.getPDFParagraph("表格一", 0 ,20, Element.ALIGN_LEFT, 2));
          List list = (List<RawPolicyInfo>) map.get("nullList");
          // 获取PDFTable
          PdfPTable table = PDFUtil.getPDFTable(tableWidth, title, list, 0);
          // 添加进文档
          document.add(table);
        }
        if (map.get("ksList") != null) {
          // 添加一个段落
          document.add(PDFUtil.getPDFParagraph("表格二", 0, 20, Element.ALIGN_LEFT, 2));
          List list = (List<RawPolicyInfo>) map.get("ksList");
          // 获取PDFTable
          PdfPTable table = PDFUtil.getPDFTable(tableWidth, title, list, 0);
          // 添加进文档
          document.add(table);
        }
        if (map.get("ryMap") != null) {
          // 添加一个段落
          document.add(PDFUtil.getPDFParagraph("表格三", 0, 20, Element.ALIGN_LEFT, 2));
          Map maps = (Map)map.get("ryMap");
          maps.values();
          for (Object value : maps.values()) {
            List list = (List<RawPolicyInfo>)value;
            // 获取PDFTable
            PdfPTable table = PDFUtil.getPDFTable(tableWidth, title, list, 0);
            document.add(table);
              }
        }
        if (map.get("hbMap") != null) {
          // 添加一个段落
          document.add(PDFUtil.getPDFParagraph("表格四", 0, 20, Element.ALIGN_LEFT, 2));
          Map maps = (Map)map.get("hbMap");
          maps.values();
          for (Object value : maps.values()) {
            List list = (List<RawPolicyInfo>)value;
            // 获取PDFTable
            PdfPTable table = PDFUtil.getPDFTable(tableWidth, title, list, 0);
            document.add(table);
              }
        }
        if (map.get("ctMap") != null) {
          // 添加一个段落
          document.add(PDFUtil.getPDFParagraph("表格五", 0, 20, Element.ALIGN_LEFT, 2));
          Map maps = (Map)map.get("ctMap");
          maps.values();
          for (Object value : maps.values()) {
            List list = (List<RawPolicyInfo>)value;
            // 获取PDFTable
            PdfPTable table = PDFUtil.getPDFTable(tableWidth, title, list, 0);
            document.add(table);
              }
        }
      }
      // 关闭文档
      if (document != null) {
        document.close();
      }
      if (baos != null) {
        try {
          baos.close();
        } catch (IOException e) {
          e.printStackTrace();
        }
      }
      String fileName = "测试PDF.pdf";
      String agent = (String) request.getHeader("USER-AGENT");
      if (agent != null && agent.indexOf("MSIE") == -1) {
        // FF
        fileName = "=?UTF-8?B?" + (new String(Base64.encodeBase64(fileName.getBytes("UTF-8")))) + "?=";
        response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
      } else {
        // IE
        fileName = new String(fileName.getBytes("GBK"), "ISO-8859-1");
        response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
      }
      OutputStream os = response.getOutputStream();
      // 设置文件大小
      // response.setContentLength((int) f.length());
      os.write(baos.toByteArray());
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
//jsp页面调用
function exportPDF() {
    var url="exportPDFTest.action?resId="+nowSelectedFw;  
    window.location.href=url;
}

4.效果图

20200810170519215.png


目录
相关文章
|
3月前
|
机器学习/深度学习 文字识别 Shell
高效率办公PDF批量处理:批量OCR识别PDF区域文字内容,用PDF内容批量改名或导出表格的货物运单应用案例
针对铁路货运物流单存档需求,本项目基于WPF与飞桨OCR技术,实现批量图片多区域文字识别与自动重命名。用户可自定义识别区域,系统提取关键信息(如车号、批次号)并生成规范文件名,提升档案管理效率与检索准确性,支持PDF及图像文件处理。
442 0
|
9月前
|
存储 JSON API
如何将 Swagger 文档导出为 PDF 文件
你会发现自己可能需要将 Swagger 文档导出为 PDF 或文件,以便于共享和存档。在这篇博文中,我们将指导你完成将 Swagger 文档导出为 PDF 格式的过程。
|
6月前
|
缓存 测试技术 网络安全
05百融云策略引擎项目交付-laravel实战完整交付定义常量分文件配置-独立建立lib类处理-成功导出pdf-优雅草卓伊凡
05百融云策略引擎项目交付-laravel实战完整交付定义常量分文件配置-独立建立lib类处理-成功导出pdf-优雅草卓伊凡
118 0
05百融云策略引擎项目交付-laravel实战完整交付定义常量分文件配置-独立建立lib类处理-成功导出pdf-优雅草卓伊凡
|
7月前
|
人工智能 开发工具 开发者
【HarmonyOS 5】鸿蒙应用实现发票扫描、文档扫描输出PDF图片或者表格的功能
HarmonyOS 系统提供的核心场景化视觉服务,旨在帮助开发者快速实现移动端文档数字化功能。
346 0
|
9月前
|
安全 搜索推荐 iOS开发
WPS Office for Mac 7.3.1 - 写作、表格处理、PPT 制作和 PDF 编辑
WPS Office for Mac 7.3.1 - 写作、表格处理、PPT 制作和 PDF 编辑
521 8
WPS Office for Mac 7.3.1 - 写作、表格处理、PPT 制作和 PDF 编辑
|
人工智能 文字识别 自然语言处理
Vision Parse:开源的 PDF 转 Markdown 工具,结合视觉语言模型和 OCR,识别文本和表格并保持原格式
Vision Parse 是一款开源的 PDF 转 Markdown 工具,基于视觉语言模型,能够智能识别和提取 PDF 中的文本和表格,并保持原有格式和结构。
1596 19
Vision Parse:开源的 PDF 转 Markdown 工具,结合视觉语言模型和 OCR,识别文本和表格并保持原格式
|
11月前
|
人工智能 JSON 搜索推荐
猫步简历 - 开源免费AI简历生成器 | 一键导出PDF/JSON
猫步简历是一款免费开源的AI简历生成器,帮助用户轻松创建独特、专业的简历。支持导出超高清PDF、图片、JSON等多种格式,并提供AI智能创作、润色和多语种切换等功能。拥有海量模板、高度定制化模块及完善的后台管理系统,助力求职者脱颖而出。官网:https://maobucv.com,GitHub开源地址:https://github.com/Hacker233/resume-design。
2522 10
|
11月前
|
文字识别
【PDF提取全自动改名】如何批量提取PDF指定区域的文字内容,用内容批量给PDF命名或者导出表格,学会全自动解放双手
在生活和工作中,我们常需处理大量PDF文件,如银行单据、税收单据等。手动处理效率低下,而使用“咕嘎批量PDF多区域内容提取重命名导表格系统”可快速完成数千份文档的处理,大幅提高效率。该工具通过获取PDF各区域内容坐标,导入并处理文件,最终将信息提取至表格,并根据关键信息对PDF进行重命名,方便管理和查找。
1789 2
|
6月前
|
C#
【PDF提取内容改名】批量提取PDF指定区域内容重命名PDF文件,PDF自动提取内容命名的方案和详细步骤
本工具可批量提取PDF中的合同编号、日期、发票号等关键信息,支持PDF自定义区域提取并自动重命名文件,适用于合同管理、发票处理、文档归档和数据录入场景。基于iTextSharp库实现,提供完整代码示例与百度、腾讯网盘下载链接,助力高效处理PDF文档。
792 40
|
6月前
|
编译器 Python
如何利用Python批量重命名PDF文件
本文介绍了如何使用Python提取PDF内容并用于文件重命名。通过安装Python环境、PyCharm编译器及Jupyter Notebook,结合tabula库实现PDF数据读取与处理,并提供代码示例与参考文献。

热门文章

最新文章