`
LewJun
  • 浏览: 9735 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

使用iText 7 生成pdf

    博客分类:
  • java
阅读更多
  1. pom.xml

 

        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.19</version>
        </dependency>
        <!-- add all iText 7 Community modules -->
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext7-core</artifactId>
            <version>7.1.3</version>
            <type>pom</type>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>html2pdf</artifactId>
            <version>2.0.0</version>
        </dependency>

 

 

2. 添加模板

 

├─base
│  ├─css
│  │      base.css
│  │
│  ├─font
│  │      simhei.ttf
│  │      SIMSUN.TTC
│  │
│  └─images
│          aloner.jpg
│
└─hello
    ├─css
    │      hello.css
    │
    ├─images
    │      csdn.jpg
    │
    └─tpl
            hello.ftl

 

 

base.css

 

@CHARSET "UTF-8";
/*
 * Sunnysoft.com Inc.
 * Copyright (c) 2004-2018 All Rights Reserved.
 */
body {
    font-family: 'SimSun', 'Simhei', 'Serif', serif;
    margin: 0 8px 0 8px;
    padding: 0;
}

table {
    border-collapse: collapse;
    border-spacing: 0;
    border-left: 1px solid grey;
    border-top: 1px solid grey;
    table-layout: fixed;
    word-break: break-strict;
    width: 100%;
}

th, td {
    border-right: 1px solid grey;
    border-bottom: 1px solid grey;
    padding: 5px 15px;
}

th {
    font-weight: bold;
}

 

 

hello2.ftl

 

<#--
功能描述:这个模板主要是用于演示如何使用FreeMarker+iTextPdf生成pdf文件
-->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8"/>
    <meta name="renderer" content="webkit|ie-comp|ie-stand"/>
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
    <meta name="viewport"
          content="width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"/>
    <title>hello</title>
    <link type="text/css" rel="stylesheet" href="/templates/base/css/base.css"/>
    <link type="text/css" rel="stylesheet" href="/templates/hello/css/hello.css"/>
    <style>
        @page {
            size: A3;
            @bottom-center {
                content: "Page " counter(page) " of " counter(pages);
            }
        }
    </style>
</head>
<body>
<div class="pos">
    <a href="https://www.baidu.com" target="_blank">演示链接</a>
</div>
<img alt="演示本地图片" src="${img1}"/>
<img alt="演示网络图片" src="${img2}"/>
<img alt="演示临时图片" src="${img3}"/>
<h3>基本信息</h3>
<table>
    <tr>
        <td width="10%">姓名</td>
        <td width="40%">${emp.aac001}</td>
        <td width="10%">证件号</td>
        <td width="40%">${emp.aac002}</td>
    </tr>

    <tr>
        <td>年龄</td>
        <td>${emp.aac003}</td>
        <td>出生日期</td>
        <td>${emp.aac002}</td>
    </tr>
</table>

<h3>执行信息</h3>
<table>
    <thead>
    <th width="10%">aac001</th>
    <th width="10%">aac002</th>
    <th width="10%">aac003</th>
    <th width="10%">执行案号</th>
    <th width="10%">执行法院</th>
    <th width="20%">执行内容</th>
    <th width="10%">执行状态</th>
    <th width="20%">异议备注</th>
    </thead>

    <tbody>
    <#list empList as emp >
    <tr>
        <td>${emp.aac001}</td>
        <td>${emp.aac002}</td>
        <td>${emp.aac003}</td>
        <td>执行案号</td>
        <td>执行法院</td>
        <td>执行内容</td>
        <td>执行状态</td>
        <td>异议备注</td>
    </tr>
    </#list>
    </tbody>
</table>
<div>This is the first div.</div>
<div style="page-break-before:always">This is the second div.</div>
<div style="page-break-after:always">This is the third div.</div>
<div>This is the fourth div.</div>
<div style="page-break-before:right">This is the fifth div.</div>
<div style="page-break-after:right">This is the sixth div.</div>
<div>This is the last div.</div>
</body>
</html>

 

FreemarkerConfiguration.java

 

 

import freemarker.template.Configuration;

public class FreemarkerConfiguration {
	public static final String PATHPREFIX = "/templates";
	private static Configuration config;

	/*
	 * Static initialization.
	 * 
	 * Initialize the configuration of Freemarker.
	 */
	static {
		config = new Configuration();
		config.setClassForTemplateLoading(FreemarkerConfiguration.class, PATHPREFIX);
	}

	public static Configuration getConfiguation() {
		return config;
	}
}

 

HtmlGenerator.java

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

import java.io.BufferedWriter;
import java.io.StringWriter;
import java.util.Map;

public class HtmlGenerator {

    /**
     * Generate html string.
     *
     * @param template the name of freemarker teamlate.
     * @param dataMap  the data of teamlate.
     * @return htmlStr
     * @throws Exception
     */
    public static String generate(String template, Map<String, Object> dataMap)
            throws Exception {
        Configuration config = FreemarkerConfiguration.getConfiguation();
        Template tp = config.getTemplate(template);
        StringWriter stringWriter = new StringWriter();
        BufferedWriter writer = new BufferedWriter(stringWriter);
        tp.setEncoding("UTF-8");
        tp.process(dataMap, writer);
        String htmlStr = stringWriter.toString();
        writer.flush();
        writer.close();
        return htmlStr;
    }
}

 

PdfGenerator.java

import com.itextpdf.html2pdf.ConverterProperties;
import com.itextpdf.html2pdf.HtmlConverter;
import com.itextpdf.html2pdf.resolver.font.DefaultFontProvider;
import com.itextpdf.io.font.PdfEncodings;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import org.apache.commons.io.IOUtils;

import java.io.*;
import java.util.Map;
import java.util.UUID;

/**
 * @author LewJun
 * @version v0.1 2018/10/16 17:21 LewJun Exp $$
 */
public class PdfGenerator {
    private static String              RESOURCESPATH;
    private static ConverterProperties props;

    static {
        RESOURCESPATH = PdfGenerator.class.getResource("/").getPath();

        DefaultFontProvider fontProvider = new DefaultFontProvider();
        try {
            // 方式1
//            PdfFont f2 = PdfFontFactory.createFont(RESOURCESPATH + "templates/base/font/simhei.ttf",
//                    PdfEncodings.IDENTITY_H,true);
//        方式2 使用ttf字体
//        String fontPath = RESOURCESPATH + "templates/base/font/simhei.ttf";
//        fontProvider.addFont(fontPath);

            // 方式3 使用ttc字体
            PdfFont ttcFont = PdfFontFactory.createTtcFont(RESOURCESPATH + "templates/base/font/SIMSUN.TTC", 1,
                    PdfEncodings.IDENTITY_H, false, true);
            fontProvider.addFont(ttcFont.getFontProgram());
        } catch (IOException e) {
            e.printStackTrace();
        }
        props = new ConverterProperties();
        props.setFontProvider(fontProvider);
    }

    public static InputStream generate(String tpl, Map<String, Object> dataMap) throws Exception {
        String htmlStr = HtmlGenerator.generate(tpl, dataMap);
        File tmpPdfFile = File.createTempFile(System.currentTimeMillis() + "", ".pdf");
        File tmpHtmlFile = new File(RESOURCESPATH + UUID.randomUUID().toString() + ".html");
        OutputStream outfile = new FileOutputStream(tmpHtmlFile);
        IOUtils.write(htmlStr, outfile);
        IOUtils.closeQuietly(outfile);
        HtmlConverter.convertToPdf(tmpHtmlFile, tmpPdfFile, props);
        return new FileInputStream(tmpPdfFile);
    }
}

 

PrintServlet.java

response.setCharacterEncoding("utf-8");
            response.setContentType("application/pdf");
            response.addHeader(
                    "Content-Disposition",
                    "attachment; filename="
                            + String.format("%s.pdf",
                            Long.toString(System.currentTimeMillis())));
            out = response.getOutputStream();

            Map<String, Object> dataMap = new HashMap<>();
            dataMap.put("img1", "/templates/base/images/aloner.jpg");
            dataMap.put("img2", "http://mmbiz.qpic.cn/mmbiz/PiajxSqBRaEIQxibpLbyuSK8jCzLMb60WcYoLMD3nrCodIwbPeds9WFXYcEQapJ88EE4vfAwufMZWH1ZdC49HiaSg/0?wx_fmt=png");
            File tempFile = File.createTempFile(System.currentTimeMillis() + "", ".jpg");
            IOUtils.copy(new FileInputStream("d:/jing.png"), new FileOutputStream(tempFile));
            dataMap.put("img3", tempFile.getPath());
            dataMap.put("emp", new Emp(111, new Date(), 22));
            dataMap.put("empList", CollectionUtil.newArrayList(
                    new Emp(111, new Date(), 234),
                    new Emp(222, new Date(), 523452),
                    new Emp(333, new Date(), 534),
                    new Emp(444, new Date(), 4645),
                    new Emp(555, new Date(), 6456)
                    )
            );

            IOUtils.copy(PdfGenerator.generate("hello/tpl/hello2.ftl", dataMap), out);

 

 

分享到:
评论

相关推荐

    Java 使用iText7生成带页码的PDF文件(同时生成目录,但是不会合并两个PDF)

    本文将深入探讨如何使用iText7这个库在Java环境中生成带有页码和目录的PDF文件。 iText7是一款功能丰富的PDF处理库,它支持创建、编辑、解析和展示PDF文档。在Java中,我们可以利用iText7轻松地生成具有复杂结构的...

    itext 生成pdf 目录

    在使用iText生成PDF目录时,要注意几点: - 确保每个书签都有一个对应的目标位置,否则在PDF中点击书签可能无法正确跳转。 - 避免内存泄漏,尤其是在处理大量书签时,要及时释放资源。 - 书签层次不宜过深,以免影响...

    使用IText生成PDF和WORD文档

    document.add(new Paragraph("这是使用IText生成的PDF文档!")); document.close(); } catch (DocumentException | IOException e) { e.printStackTrace(); } } } ``` 这段代码首先创建了一个`Document`对象...

    Android使用iText生成pdf并读取pdf内容

    在这个场景中,我们将探讨如何利用iText在Android应用中生成PDF以及读取PDF的内容。 首先,我们需要在Android项目中引入iText库。由于Android Studio默认使用Gradle作为构建工具,我们可以在`build.gradle`文件的...

    使用iText生成PDF.doc

    以下是一些关于如何使用iText生成PDF的关键知识点: 1. **安装与获取iText**: 要使用iText,首先需要从其官方源代码托管平台SourceForge下载相应的.jar文件。基础的iText.jar提供了基本的PDF生成功能,但如果你...

    springboot使用itext生成pdf并保存到本地

    总结一下,要实现在Spring Boot应用中使用iText生成带有页眉、页码、水印、目录和二维码的PDF,你需要: 1. 引入iText及相关库。 2. 创建HTML页面并将其转换为PDF。 3. 定制PDF内容,包括添加页眉、页码和水印。 4. ...

    itext5生成PDF(含水印文字及图片)

    itext5生成PDF(含水印文字及图片)的源代码,操作说明详细,代码完整可用。

    itext将图片生成PDF(高清版)

    在IT行业中,生成PDF文档是常见的需求,尤其当需要将图片转换为便于分享和打印的格式时。`iText`是一个强大的Java库,专门用于创建、编辑和处理PDF文档。本教程将详细介绍如何使用`iText`将图片转换为高清PDF,并...

    itext生成pdf并通过证书进行签章

    本文将详细探讨如何使用iText库生成PDF并利用证书进行签章,确保文档的完整性和不可篡改性。 首先,iText是一个强大的开源Java库,专门用于创建、修改和处理PDF文档。它提供了一系列API,使得开发者可以方便地实现...

    itext5.5.10生成PDF

    本文将深入探讨iText 5.5.10在生成PDF方面的核心概念和常用方法,以及如何通过实例来理解和应用这些知识。 首先,生成PDF的基本流程包括创建PdfWriter对象、定义PdfDocument对象和添加内容。在iText中,`PdfWriter`...

    java使用itext实现pdf文件下载

    这是使用Itext生成的PDF文档。")); document.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` 上述代码会在当前目录下生成一个名为"output.pdf"的PDF文件,内容为"Hello, World! 这是使用...

    itext5 生成pdf 使用总结

    itext5 生成pdf 使用总结

    iText7 Create PDF from HTML with pdfHTML

    这将生成PDF文件。 5. **处理异常**:在转换过程中,可能会遇到各种问题,如无效的HTML、缺失的资源或内存限制。确保你的代码能够适当地捕获和处理这些异常。 6. **优化性能**:为了提高大规模HTML转换的效率,...

    C#生成电子发票PDF文件的样例(使用了iText7)

    本示例将探讨如何使用C#编程语言,结合iText7库,来创建符合规范的电子发票PDF文件。iText7是一个功能强大的PDF处理库,支持多种编程语言,包括.NET平台。 首先,`packages.config`文件列出了项目依赖的NuGet包,...

    itextpdf 导出pdf 表格 自动分页中文 目录

    3. **PDF表格自动分页**: 在生成PDF文档时,如果一个表格太长以至于无法在一页内完全显示,iTextPDF可以自动将其分页。通过调整表格属性,如行高、列宽,以及设置分页策略,可以确保表格在每一页上都保持完整的结构...

    iText生成pdf解决中文不显示

    iText生成pdf解决中文不显示字库,pdf凉字不显示,由于生成iText插件生成pdf的时候中文会显示不出来,遇到过的是"凉"字,查到是字体库的原因,网上下载字体库msyh.ttc,生成的时候指定字体库,就可以解决了,小bug一...

    解决Itext生成PDF中文不换行的jar

    为了解决"Java使用Itext生成PDF中文不换行"的问题,我们可以采取以下几种策略: 1. **设置字体和编码**:确保使用支持中文的字体,如SimSun、Arial Unicode MS等,并正确设置PDF的编码为UTF-8。Itext中的`Font`类...

    Android用itext库生成中文PDF文档

    5. **生成PDF**:使用`PdfWriter.getInstance()`创建一个PDF写入器,并将其与`Document`关联。然后,选择一个输出流(如文件流或网络流)来保存PDF。例如: ```java PdfWriter.getInstance(document, new ...

    基于itext7+freemarker模板导出pdf

    在IT领域,生成PDF文档是常见的需求,尤其在报表、合同和文档自动化中。本教程将探讨如何使用iText7和FreeMarker库结合,来创建一个基于模板的PDF生成流程,确保中文支持和图片的正常显示。 首先,iText7是一款强大...

Global site tag (gtag.js) - Google Analytics