Thymeleaf企业级真实应用:将HTML界面数据转换为PDF输出

本文源自Recently祝祝,创自Recently祝祝。转载请标注出处。

Thymeleaf企业级真实应用:将HTML界面数据转换为PDF输出
Thymeleaf企业级真实应用:将HTML界面数据转换为PDF输出

目录

1.Thymeleaf阐明

1.1什么是Thymeleaf

1.2Thymeleaf具有特色

2.将HTML界面数据转化为PDF输出逻辑阐明

2.1中心思想

2.2操作阐明

2.3详细步骤

3.详细完成

3.1增加依靠

3.2界说HTML模板

3.3html 模板烘托东西

3.4 读取html 模板烘托成果而且转化为Base64字符串

3.4.1 库:ITextRenderer阐明

3.4.2 类:ITextFontResolver阐明

3.4.3转化为Base64总结阐明

3.5 base64转成PDF后回来当时pdf的途径

3.5.1ByteArrayOutputStream阐明

3.6 办法整合运用


Thymeleaf模板引擎运用,Java又一神器

1.Thymeleaf阐明

1.1什么是Thymeleaf

Thymeleaf是一种现代化的服务器端Java模板引擎,能够用于Web和独立环境中的HTML、XML、JavaScript、CSS和文本。在实践开发中,Thymeleaf能够用于生成动态的HTML页面,支撑将数据与模板进行绑定,生成终究的HTML内容。它是一个开源的软件,选用Apache许可证2.0进行发布。

1.2Thymeleaf具有特色

与其他服务器端Java模板引擎相比,Thymeleaf具有以下特色:

  • 语法简略易懂,支撑自然的HTML标签
  • 支撑HTML5的规范和特性
  • 支撑CSS款式的绑定和操作
  • 支撑表达式言语(Expression Language,简称EL)和Spring表达式言语(Spring Expression Language,简称SpEL)
  • 支撑规范和Spring MVC的多种模板烘托方式
  • 支撑多种模板缓存策略
  • 支撑可扩展的引擎架构

在实践开发中,Thymeleaf能够用于生成动态的HTML页面,支撑将数据与模板进行绑定,生成终究的HTML内容。它能够作为Web应用程序的模板引擎,也能够作为其他应用程序的模板引擎。因为其简略易用的语法和强大的功用,Thymeleaf已经成为Java领域中最受欢迎的模板引擎之一。

2.将HTML界面数据转化为PDF输出逻辑阐明

2.1中心思想

运用模板引擎的模板文件和数据模型。模板文件界说了终究输出的PDF页面的结构和款式,而数据模型则供给了模板中要填充的动态数据。

详细来说,Thymeleaf运用Java目标作为数据模型,能够通过Spring的控制器将数据注入到数据模型中。然后,Thymeleaf将数据模型与模板文件结合起来,生成HTML内容。最后,运用PDF生成库将HTML内容转化为PDF输出。

2.2操作阐明

在完成PDF输出功用时,能够运用Spring Boot供给的spring-boot-starter-thymeleaf依靠,该依靠包含了Thymeleaf、PDF生成库以及其他必需的依靠项。能够在控制器中运用Thymeleaf的TemplateEngine目标将数据模型和模板文件合并,生成HTML内容。然后,能够运用PDF生成库将HTML内容转化为PDF格局。

需求注意的是,PDF输出或许需求一些特定的CSS款式和HTML标记,以便正确呈现和格局化PDF页面。因此,在生成PDF输出之前,或许需求对模板文件进行调整和优化,以保证输出的PDF页面具有所需的外观和布局。

2.3详细步骤

  1. 界说HTML模板,需求输出的数据以HTML格局创立一个模板,生成.HTML文件
  2. 引进Thymeleaf中TemplateEngine-》生成文本输出的Java模板引擎框架、Context-》Web应用程序的上下文目标。生成html 模板烘托东西。处理上边我们界说的模板。得到一个String类的成果
  3. 读取这个成果byte[],将byte数组 转化为 Base64字符串
  4. 最后将Base64字符串转化为PDF格局的数据,输出途径

3.详细完成

3.1增加依靠

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

Thymeleaf企业级真实应用:将HTML界面数据转换为PDF输出

3.2界说HTML模板

Thymeleaf企业级真实应用:将HTML界面数据转换为PDF输出
Thymeleaf企业级真实应用:将HTML界面数据转换为PDF输出​修改

<html>
    <head>
        <title>Hello World!</title>
    </head>
    <body>
        <h1>Hello, ${name}!</h1>
        <p>You are ${age} years old.</p>
    </body>
</html>

Thymeleaf企业级真实应用:将HTML界面数据转换为PDF输出

3.3html 模板烘托东西

import org.springframework.stereotype.Component;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import javax.annotation.Resource;
import java.util.Map;
/**
 * html 模板烘托东西
 */
@Component
public class HtmlTemplate {
    @Resource
    private TemplateEngine templateEngine;
    /**
     * 运用 Thymeleaf 烘托 HTML
     * @param template HTML模板
     * @param params 参数
     * @return
     * @throws Exception
     */
    public String render(String template, Map<String,Object> params) throws Exception {
        // 创立模板上下文
        Context context = new Context();
        // 设置变量
        context.setVariables(params);
        //将数据填充到模板里,开端处理模板
        return templateEngine.process(template, context);
    }
}

Thymeleaf企业级真实应用:将HTML界面数据转换为PDF输出

3.4 读取html 模板烘托成果而且转化为Base64字符串

字体途径

Thymeleaf企业级真实应用:将HTML界面数据转换为PDF输出
Thymeleaf企业级真实应用:将HTML界面数据转换为PDF输出​修改

PdfUtils

import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;
import java.io.ByteArrayOutputStream;
public class PdfUtils {
    public static String getPdfBase64ByHtml(String html) throws Exception {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();//构建字节输出流
        ITextRenderer renderer = new ITextRenderer();
        ITextFontResolver fontResolver = renderer.getFontResolver();
        //指定文件字体增加到PDF库,指定字体不作为内部字体,而是外部字体被加载
        fontResolver.addFont("pdf/font/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        renderer.setDocumentFromString(html);
        renderer.layout();
        renderer.createPDF(baos);
        return Base64Utils.encode(baos.toByteArray());
    }
}

Thymeleaf企业级真实应用:将HTML界面数据转换为PDF输出

在增加了字体文件后,能够运用setDocumentFromString()办法将HTML文档设置到烘托器中,并运用layout()办法对文档进行排版布局。接下来,运用createPDF()办法将文档烘托为PDF,并输出到输出流中。

注意,在增加字体文件时,需求保证字体文件的途径正确,而且字体文件能够被读取到。此外,还需求保证字体文件的格局正确,能够运用BaseFont.IDENTITY_H指定字体编码,运用BaseFont.NOT_EMBEDDED指定字体文件是否嵌入到PDF文件中。

Base64Utils


import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import java.io.*;
/**
 * Base64 转化东西
 */
public class Base64Utils {
    /**
     * byte数组 转化为 Base64字符串
     */
    public static String encode(byte[] data) {
        return new BASE64Encoder().encode(data);
    }
    /**
     * Base64字符串 转化为 byte数组
     */
    public static byte[] decode(String base64) {
        try {
            return new BASE64Decoder().decodeBuffer(base64);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return new byte[0];
    }
    /**
     * 把文件内容编码为 Base64字符串, 只能编码小文件(例如文本、图片等)
     */
    public static String encodeFile(File file) throws Exception {
        InputStream in = null;
        ByteArrayOutputStream bytesOut = null;
        try {
            in = new FileInputStream(file);
            bytesOut = new ByteArrayOutputStream((int) file.length());
            byte[] buf = new byte[1024];
            int len = -1;
            while ((len = in.read(buf)) != -1) {
                bytesOut.write(buf, 0, len);
            }
            bytesOut.flush();
            return encode(bytesOut.toByteArray());
        } finally {
            close(in);
            close(bytesOut);
        }
    }
    /**
     * 把 Base64字符串 转化为 byte数组, 保存到指定文件
     */
    public static void decodeFile(String base64, File file) throws Exception {
        OutputStream fileOut = null;
        try {
            fileOut = new FileOutputStream(file);
            fileOut.write(decode(base64));
            fileOut.flush();
        } finally {
            close(fileOut);
        }
    }
    private static void close(Closeable c) {
        if (c != null) {
            try {
                c.close();
            } catch (IOException e) {
                // nothing
            }
        }
    }
}

Thymeleaf企业级真实应用:将HTML界面数据转换为PDF输出

3.4.1 库:ITextRenderer阐明

ITextRenderer是一个基于iText库的Java库,它能够将HTML、XHTML或XML等文档烘托成为PDF、XLS、PNG、JPEG等格局的文件。

ITextRenderer库供给了一个ITextRenderer类,该类供给了丰富的API,用于将HTML、XHTML或XML文档转化成为PDF等格局的文件。该类内部运用了iText库的PDF生成和操作功用,一起也支撑运用Flying Saucer库对文档进行烘托和布局。

运用ITextRenderer库进行PDF输出的根本流程如下:

  1. 创立一个ITextRenderer目标;
  2. 运用setDocument()办法将要转化的文档设置到烘托器中;
  3. 运用layout()办法对文档进行排版布局;
  4. 运用createPDF()办法将文档烘托为PDF,并输出到输出流或文件中。

3.4.2 类:ITextFontResolver阐明

ITextFontResolver是ITextRenderer库中的一个类,它用于办理和解析字体文件,为PDF生成供给字体支撑。

在ITextRenderer库中,当运用HTML文档生成PDF时,因为PDF不支撑HTML中运用的所有字体,因此需求在生成PDF之前将HTML中的字体替换为PDF支撑的字体。ITextFontResolver供给了一个**addFont()办法,该办法用于将字体文件增加到ITextFontResolver中进行办理,以便在PDF生成时运用。**

DEMO阐明:

// 创立一个ITextRenderer目标
ITextRenderer renderer = new ITextRenderer();
// 创立一个ITextFontResolver目标
ITextFontResolver fontResolver = renderer.getFontResolver();
// 增加字体文件
fontResolver.addFont("pdf/font/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

Thymeleaf企业级真实应用:将HTML界面数据转换为PDF输出

首要创立了一个ITextRenderer目标,然后通过getFontResolver()办法获取了ITextFontResolver目标,并将要运用的字体文件增加到了ITextFontResolver目标中。

3.4.3转化为Base64总结阐明

Base64是一种用于将二进制数据转化成文本数据的编码方式,通过Base64编码能够将图片、音频、视频等二进制数据转化成文本数据,然后便利在网络上传输。

3.5 base64转成PDF后回来当时pdf的途径

public class Base64Util {
    public static String base64StringToPDF(String base64, String path) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        String fileAdd = sdf.format(new Date());
        //先判断文件是否存在
        path = path + "/" + fileAdd;
        String fileName = path + "/" + System.currentTimeMillis() + ".pdf";//新的文件名
        BufferedInputStream bin = null;
        FileOutputStream fout = null;
        BufferedOutputStream bout = null;
        BASE64Decoder decoder = new BASE64Decoder();
        try {
            byte[] bytes = decoder.decodeBuffer(base64);
            ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
            // 创立从底层输入流中读取数据的缓冲输入流目标
            bin = new BufferedInputStream(bais);
            //获取文件夹途径
            File file = new File(path);
            //假如文件夹不存在则创立
            if (!file.exists() && !file.isDirectory()) {
                file.mkdirs();
            }
            // 创立到指定文件的输出流
            fout = new FileOutputStream(fileName);
            // 为文件输出流对接缓冲输出流目标
            bout = new BufferedOutputStream(fout);
            byte[] buffers = new byte[1024];
            int len = bin.read(buffers);
            while (len != -1) {
                bout.write(buffers, 0, len);
                len = bin.read(buffers);
            }
            // 改写此输出流并强制写出所有缓冲的输出字节,有必要这行代码,否则有或许有问题
            bout.flush();
            //回来存储的途径
            return fileName;
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                bin.close();
                fout.close();
                bout.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return "";
    }
}

Thymeleaf企业级真实应用:将HTML界面数据转换为PDF输出

3.5.1ByteArrayOutputStream阐明

ByteArrayOutputStream是Java IO库中的一个类,它供给了一个缓存区,能够将数据写入到内存中的字节数组中。 当数据写入缓存区时,假如缓存区的巨细不足,ByteArrayOutputStream会主动扩展缓存区的巨细,以容纳更多的数据。

ByteArrayOutputStream的首要作用是在内存中创立一个可变长度的字节数组,将数据写入到字节数组中,然后通过调用toByteArray()办法获取完好的字节数组。通常情况下,ByteArrayOutputStream用于缓存中心成果,以便在后续的操作中运用。

3.6 办法整合运用

@Autowired
private HtmlTemplate htmlTemplate;
@Override
public String changeTaskReport() throws Exception {
        Map<String, Object> map = new HashMap();
        StringBuffer sb = new StringBuffer();
        data.put("name", "Alice");
        data.put("age", 20);
        String html = htmlTemplate.render("Template.html", map);
        String base64 = PdfUtils.getPdfBase64ByHtml(html);
        String pdfAdd = Base64Util.base64StringToPDF(base64, fileConfig.getPdfAdd());
        return pdfAdd;
}

Thymeleaf企业级真实应用:将HTML界面数据转换为PDF输出

慢便是快,时间关于开发来说不是数据,是哲学