文档章节

使用freemarker和itext导出pdf文件

阿信sxq
 阿信sxq
发布于 09/27 11:18
字数 746
阅读 3
收藏 0

要实现的效果是这样的:给定一个对象列表,对于列表中的每一个对象使用pdf中的一页进行呈现,同时需要使用一些图片。

首先,引入maven依赖

<properties>
    <itextpdf.version>5.5.13</itextpdf.version>
    <freemarker.version>2.3.28</freemarker.version>
    <slf4j.version>1.7.25</slf4j.version>
</properties>

<dependencies>
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itextpdf</artifactId>
        <version>${itextpdf.version}</version>
    </dependency>
    <dependency>
        <groupId>com.itextpdf.tool</groupId>
        <artifactId>xmlworker</artifactId>
        <version>${itextpdf.version}</version>
    </dependency>
    <dependency>
        <groupId>org.freemarker</groupId>
        <artifactId>freemarker</artifactId>
        <version>${freemarker.version}</version>
    </dependency>

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${slf4j.version}</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-nop</artifactId>
        <version>${slf4j.version}</version>
    </dependency>
</dependencies>

使用用户信息来作为演示,其实体模型类

public class User {

    private String username;
    private String password;

    public User() {
    }

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    getter/setter

}

生成pdf分为两个步骤:使用freemarker生成出文字内容(xhtml);使用itext的xml转换器生成pdf文件。

测试样例类

import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorkerFontProvider;
import com.itextpdf.tool.xml.XMLWorkerHelper;

import cn.songxinqiang.example.model.User;
import cn.songxinqiang.example.util.PathUtil;

import freemarker.template.Configuration;
import freemarker.template.Template;

/**
 *
 * @author 阿信sxq
 *
 */
public class JavaToPdfHtmlFreeMarker {

    private static final Logger logger = LoggerFactory.getLogger(JavaToPdfHtmlFreeMarker.class);

    private static final String DEST = "/tmp/itext_target.pdf";
    private static final String HTML = "freemarker-template.html";
    private static final String FONT = "simhei.ttf";

    private static Configuration freemarkerCfg = null;
    private static String classPath;

    static {
        freemarkerCfg = new Configuration(Configuration.VERSION_2_3_28);
        // freemarker的模板目录
        try {
            //XXX 工具类获取类文件的当前路径,也可以使用文件系统绝对路径
            classPath = PathUtil.getCurrentPath();
            freemarkerCfg.setDirectoryForTemplateLoading(new File(classPath));
//            freemarkerCfg.setDirectoryForTemplateLoading(new File("/opt/chaos"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws IOException, DocumentException {
        List<User> userList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            userList.add(new User("name " + i, "passwd " + i));
        }

        JavaToPdfHtmlFreeMarker render = new JavaToPdfHtmlFreeMarker();
        String content = render.freeMarkerRender(userList, HTML);
        logger.info("content:{}", content);
        render.createPdf(content, DEST);
    }

    public void createPdf(String content, String dest) throws IOException, DocumentException {
        // step 1
        Document document = new Document();
        // step 2
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));
        // step 3
        document.open();
        // step 4
        XMLWorkerFontProvider fontImp =
                new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
        fontImp.register(FONT);
        XMLWorkerHelper.getInstance()
                .parseXHtml(writer, document, new ByteArrayInputStream(content.getBytes()), null,
                        Charset.forName("UTF-8"), fontImp);
        // step 5
        document.close();

    }

    /**
     * freemarker渲染html
     */
    public String freeMarkerRender(List<?> list, String htmlTmp) {
        Map<String, Object> data = new HashMap<>();
        data.put("list", list);
        data.put("locationPath", classPath);
        Writer out = new StringWriter();
        try {
            // 获取模板,并设置编码方式
            Template template = freemarkerCfg.getTemplate(htmlTmp);
            // 合并数据模型与模板
            template.process(data, out); // 将合并后的数据和模板写入到流中,这里使用的字符流
            out.flush();
            return out.toString();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                out.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
        return null;
    }

}

freemarker模板

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Title</title>
<style>
body {
    font-family: SimHei;
}
.pageNext{
    page-break-after: always;
}
</style>
</head>
<body>
    <#list list as user>
        用户名:${user.username}<br/>
        密码:${user.password}<br/>
        插入图片:<br/>
        <img width="100px" src="file://${locationPath}/github.png"/>
        <span class="pageNext"></span>
    </#list>
</body>
</html>

这里需要使用xhtml的语法,所有标签都需要闭合,因为经过处理得到的内容会使用itext的xml处理器去处理。

而且对于汉字需要指定汉字字体。

对于代码,已经托管到码云:https://gitee.com/songxinqiang/BlogExampleCode

写的不好,望大家批评指正

© 著作权归作者所有

共有 人打赏支持
阿信sxq

阿信sxq

粉丝 226
博文 82
码字总数 72407
作品 1
成都
后端工程师
私信 提问
利用itext导出word表格,处理图片

在实际的项目开发中我们需要将后台大量数据导出为word或者是excel方便用户操作,当然能完成这一功能的有freemarker,itext,poi等技术,本文讲述以itext导出word。 首先我们需要明白的是无论...

小夜的传说
06/26
0
0
FreeMarker(二):利用FreeMarker转pdf

设计需求 订票成功后,生成一个pdf 文件,用户打印入场票,门票大致如下所示: 2. 设计思想 1). 使用FreeMarker 转换 ftl(就是FreeMarker 魔板文件),生成HTML 2). 使用jtidy库将 HTML转换...

AHUSKY
04/17
0
0
java操作PDF(PDFBOX和Itext框架)

java有很多可以操作pdf的框架,pdfbox和itext就是其中的两种 pdfbox有如下作用 提取文本,包括Unicode字符。 和Jakarta Lucene等文本搜索引擎的整合过程十分简单。 加密/解密PDF文档。 从PDF...

王小明123
2013/07/24
0
0
使用iText库创建PDF文件

原文地址:使用iText库创建PDF文件 阅读目录 前言 iText库概述 iText库常用类 iText Hello World示例 给PDF文件设置文件属性 PDF中添加图片 PDF中创建表格 PDF中创建列表 PDF中设置样式/格式...

spinachgit
2017/10/24
0
0
Freemarker + XML 导出Word

1、创建Word模板文档,如 2、设置Word模板的常量值(以Map形式输出,这里设置其key值),如 3、将Word模板文档另存为XML格式,如 4、将xml文件后缀名,转为ftl,即andy.ftl。ftl文件可以用“...

Andy市民
2014/06/18
0
1

没有更多内容

加载失败,请刷新页面

加载更多

什么是自然语言处理技术

自然语言处理(NLP)是计算机科学,人工智能,语言学关注计算机和人类(自然)语言之间的相互作用的领域。自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计...

本宫没空2
4分钟前
0
0
移动端关闭虚拟键盘

那么document.activeElement.blur()为什么可以阻止虚拟键盘弹出呢?原因是:当你点击input的时候,document.activeElement获得了DOM中被聚焦的元素,也就是你点击的input,而调用.blur()方法...

niuhongxia
4分钟前
0
0
Ubuntu18.04安装RabbitMQ(正确安装)

1、安装erlang 由于rabbitMq需要erlang语言的支持,在安装rabbitMq之前需要安装erlang sudo apt-get install erlang-nox 2、安装Rabbitmq 更新源 sudo apt-get update 安装 sudo apt-get ins...

hansonwong
14分钟前
0
0
如何在以太坊开发发行自己的ERC-20数字货币

今天我将向你展示如何在以太坊区块链上开发你自己的加密货币并将其出售!我将向你展示如何使用以太坊智能合约逐步创建自己的ERC-20代币和众筹销售,如何测试智能合约,如何将智能合约部署到以...

geek12345
14分钟前
0
0
Vlock用于有多个用户访问控制台的共享 Linux 系统

当你在共享的系统上工作时,你可能不希望其他用户偷窥你的控制台中看你在做什么。如果是这样,我知道有个简单的技巧来锁定自己的会话,同时仍然允许其他用户在其他虚拟控制台上使用该系统。 ...

linuxprobe16
15分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部