锋盈数科-知识库 Logo
首页
软件开发
计算机基础
Hello Halo
新手必读
关于本知识库
登录 →
锋盈数科-知识库 Logo
首页 软件开发 计算机基础 Hello Halo 新手必读 关于本知识库
登录
  1. 首页
  2. 软件开发
  3. JAVA
  4. Spring boot 使用iText导出PDF 几种方式

Spring boot 使用iText导出PDF 几种方式

0
  • JAVA
  • 发布于 2024-08-13
  • 0 次阅读
黄健
黄健

本文由 简悦 SimpRead 转码, 原文地址 blog.csdn.net

1、 iText 介绍

       iText 是用于生成 PDF 文档的一个 java 类库。通过 iText 不仅可以生成 PDF 或 rtf 的文档,而且可以将 XML、Html 文件转化为 PDF 文件。官网地址 http://itextpdf.com。

2、Spring boot 项目 iText 依赖

itextpdf.jar 是 iText 的核心库,提供了用于创建和操作 PDF 文档的基本功能,itext-asian.jar 是 itext 库中关于亚洲编码的类库,特别适用于处理中文字符,处理中文乱码。

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

3、实现方式 

  3.1 一般性(不复杂 PDF)处理

下面写了 junit 测试。

@Test
public void testPdf() {
    try {
        Document document = new Document();
        PdfWriter writer PdfWriter.getInstance(document, new 
          FileOutputStream("d:/hello.pdf"));
        document.open();
        Element element = new Paragraph("helloword!");
        document.add(element);
        document.close();
    } catch (DocumentException e) {
        e.printStackTrace();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }finally {
                doc.close();
                writer.close();
     }
}

如果要实现 Http 导出 PDF,代码如下

public void exportPdf(HttpServletResponse response) {
    try {
        Document document = new Document();
        OutputStream out = response.getOutputStream();
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        PdfWriter writer PdfWriter.getInstance(document, new 
         baos);
        document.open();
        Element element = new Paragraph("helloword!");
        document.add(element);
        response.setContentType("application/pdf");
        response.setHeader("Content-Disposition", "inline; file);
        out.write(baos.toByteArray());
        out.flush();
    } catch (DocumentException e) {
        e.printStackTrace();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }finally {   
                 // 关闭流....
                
 
     }
}

3.2 格式、样式复杂的 Pdf 处理

    在处理格式和样式复杂的 pdf 时候,为排版的美观,需要拼接 html,再将 html 转成 pdf。我这里手动拼接 html,此时需要依赖 xmlworker 包,

<dependency>
            <groupId>com.itextpdf.tool</groupId>
            <artifactId>xmlworker</artifactId>
            <version>5.5.13.2</version>
  </dependency>

     形成 html 方法定义,这里可以定义很多格式和样式,实现自由扩展。

private  String createHtml(String base64,Map<String,Object> headMap,List data){
        StringBuffer stringBuffer = new StringBuffer();
        createHtmlPic(stringBuffer,base64);
       // 传入headMap,是为了支持动态表头
        createHtmlTableHead(stringBuffer,headMap);
        createHtmlTableData(stringBuffer,data);
        return  stringBuffer.toString() ;
    }

   生成 pdf 方法

public void exportPdfData(String base64,Map<String,Object> headMap,List data,String dir) {
        File outFile = new File(dir);
        // 创建动态html
        String strHtml =  createHtml( base64, headMap, data);
        //html 转pdf
        BaseFont bfChinese = null;
        try {
            bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
  
 
        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }catch (Exception e){
            e.printStackTrace();
            e.printStackTrace();
        }
        Font font = new Font(bfChinese, 9, Font.NORMAL);
        font1.setColor(new BaseColor(255,255,255));
        Document doc = new Document(new RectangleReadOnly(842F, 595F));
        PdfWriter writer =null;
        try {
            writer = PdfWriter.getInstance(doc,new FileOutputStream(dir));
        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
 
        //设置页面边距
        doc.setMargins(20, 15, 20, 55);
        if (writer != null){
            writer.setPageEvent(new PageMarker());
        }
        doc.open();
        try {
            XMLWorkerHelper.getInstance().parseXHtml(writer, doc, new ByteArrayInputStream(strHtml.getBytes("UTF-8")), Charset.forName("UTF-8"),new FontProvider() {
                @Override
                public boolean isRegistered(String arg0) {
                    return false;
                }
                @Override
                public Font getFont(String fontFamily, String charset, boolean arg2, float size, int style, BaseColor color) {
                    if("STSongStd-Light1".equals(fontFamily)){
                        return  font1 ;
                    }else {
                        return font1 ;
                    }
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            doc.close();
            writer.close();
        }
    
    }

入要 http 生成并且导出 pdf,请参照 3.1,本例子是我手动代码拼接 html。

3.3、使用 iText-Html-Freemarker 实现 pdf

     其实 3.3 和 3.2 原理是一样的(都是将 html 转 pdf),只是 3.3 加入模板引擎支持,可以使用 FreeMarker。需要加入如下依赖。

<dependency>
 
         <groupId>org.freemarker</groupId>
 
         <artifactId>freemarker</artifactId>
 
         <version>2.3.19</version>
 
     </dependency>

 添加模板 freemarker.html   

<!DOCTYPE html>
 
     <html lang="en">
 
         <head>
 
             <meta charset="UTF-8"/>
 
             <title>freemarker渲染HTML演示</title>
 
         </head>
 
         <body>
 
              <div>${studentName}</div>
               <div>${age}</div>
         </body>
 
     </html>

 读取模板转出动态 html

Configuration freemarkerConfig = new Configuration();
 
            //设置freemarker模板目录
 
              freemarkerConfig.setDirectoryForTemplateLoading(new File("/export/pdf/"));
 
            //获取指定的模板文件
 
            Template template = freemarkerConfig.getTemplate("freemarker.html");
 
            //设置编码方式
 
            template.setEncoding("UTF-8");
 
            //合并数据模型与模板,将合并后的数据和模板写入到流中,这里使用的字符流
 
            Writer out = new StringWriter();
 
            template.process(data, out);
 
            out.flush();
 
            String content = out.toString();

 生产 pdf

public void exportPdfData(String strHtml String dir) {
        File outFile = new File(dir);
           BaseFont bfChinese = null;
        try {
            bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
  
 
        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }catch (Exception e){
            e.printStackTrace();
            e.printStackTrace();
        }
        Font font = new Font(bfChinese, 9, Font.NORMAL);
        font1.setColor(new BaseColor(255,255,255));
        Document doc = new Document(new RectangleReadOnly(842F, 595F));
        PdfWriter writer =null;
        try {
            writer = PdfWriter.getInstance(doc,new FileOutputStream(dir));
        } catch (DocumentException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
 
        //设置页面边距
        doc.setMargins(20, 15, 20, 55);
        if (writer != null){
            writer.setPageEvent(new PageMarker());
        }
        doc.open();
        try {
            XMLWorkerHelper.getInstance().parseXHtml(writer, doc, new ByteArrayInputStream(strHtml.getBytes("UTF-8")), Charset.forName("UTF-8"),new FontProvider() {
                @Override
                public boolean isRegistered(String arg0) {
                    return false;
                }
                @Override
                public Font getFont(String fontFamily, String charset, boolean arg2, float size, int style, BaseColor color) {
                    if("STSongStd-Light1".equals(fontFamily)){
                        return  font1 ;
                    }else {
                        return font1 ;
                    }
                }
            });
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            doc.close();
            writer.close();
        }
    
    }

4 、注意

      如果已经导入 itext-asian 依赖之后,还是出现中文乱码。可能是你使用的字体在你部署的服务上不存在。一般在 windows 机器找到对应的字体, 复制到对应目录,如果部署在 linux 要复制 / usr/share/fonts 目录。 一般要修改此目录的权限,并且执行 sudo fc-cache -fv  命令,是字体生效。

标签: #JAVA 991
相关文章

Spring 实现 3 种异步接口 2024-10-18 09:07

大家好,我是苏三~ 如何处理比较耗时的接口? 这题我熟,直接上异步接口,使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。 但这些方法有局限性,处理结果仅返回单个值。在某些场景下,如果需要接口异步处理的同时,还持续不断地

重学SpringBoot3-集成Redis(五)之布隆过滤器 2024-10-08 11:24

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(五)之布隆过滤器 1. 什么是布隆过滤器? * 基本概念 适用场景 2. 使用 Redis 实现布隆过滤器 * 项目依赖 Redis 配置

SpringBoot整合异步任务执行 2024-10-08 11:24

同步任务: 同步任务是在单线程中按顺序执行,每次只有一个任务在执行,不会引发线程安全和数据一致性等 并发问题 同步任务需要等待任务执行完成后才能执行下一个任务,无法同时处理多个任务,响应慢,影响用 户体验 异步任务: 异步任务是在多线程中同时执行,多个任务可以并发执行,同时处理多个请求,响应快,资源

springboot kafka多数据源,通过配置动态加载发送者和消费者 2024-10-08 11:24

前言 最近做项目,需要支持kafka多数据源,实际上我们也可以通过代码固定写死多套kafka集群逻辑,但是如果需要不修改代码扩展呢,因为kafka本身不处理额外逻辑,只是起到削峰,和数据的传递,那么就需要对架构做一定的设计了。 准备test kafka本身非常容易上手,如果我们需要单元测试,引入ja

SpringBoot 集成 Redis 2024-10-08 11:24

一:SpringBoot 集成 Redis ①Redis是一个 NoSQL(not only)数据库, 常作用缓存 Cache 使用。 ②Redis是一个中间件、是一个独立的服务器;常用的数据类型: string , hash ,set ,zset , list ③通过Redis客户端可以使用多种语

SpringBoot整合QQ邮箱 2024-10-08 11:24

SpringBoot可以通过导入依赖的方式集成多种技术,这当然少不了我们常用的邮箱,现在本章演示SpringBoot整合QQ邮箱发送邮件…. 下面按步骤进行: 1.获取QQ邮箱授权码 1.1 登录QQ邮箱 1.2 开启SMTP服务 找到下图中的SMTP服务区域,如果当前账号未开启的话自己手动开启。

目录

IT 外包服务商

  • 意见投递
  • zyf6619

软件开发应用

主菜单

  • 首页
  • 软件开发
  • 计算机基础
  • Hello Halo
  • 新手必读
  • 关于本知识库
Copyright © 2024 your company All Rights Reserved. Powered by Halo.