java 生成 pdf,支持中文显示

目录

说明:

[1 pom](#1 pom)

[2 java代码](#2 java代码)

[3 html](#3 html)


​​​​​​​说明:

复制代码
itextpdf + freemarker + html
  • iTextPDF(iText):iText 是一个用于创建和操作 PDF 文档的 Java 库。它提供了广泛的功能,可用于从头开始创建 PDF 文档、操纵现有的 PDF、添加内容等等。在您的用例中,您很可能使用 iTextPDF 来创建和格式化 PDF 文档本身。

  • FreeMarker(模板引擎):FreeMarker 是一种常用的基于 Java 的模板引擎,它允许您动态生成基于文本的输出(如 HTML、XML 和其他标记)。在您的示例中,您使用 FreeMarker 创建一个 HTML 模板,该模板作为 PDF 内容的基础。您可以使用 FreeMarker 在 HTML 模板中插入动态数据,从而更容易生成结构化的内容。

  • HTML(超文本标记语言):HTML 是用于创建网页的标准标记语言,而在这个上下文中,它还充当了 PDF 内容的模板。您创建一个 HTML 模板,其中包含您想要插入动态数据的占位符。FreeMarker 处理这个 HTML 模板,将占位符替换为实际数据,从而创建完整的 HTML 文档。

在您具体的用例中,您以以下方式组合这些技术:

  1. 您创建一个 HTML 模板,使用 HTML 标记和占位符(用 ${} 包围的变量)作为 PDF 文档的结构和布局。

  2. 您使用 FreeMarker 处理 HTML 模板。您向 FreeMarker 提供数据模型(一个带有键值对的 Java 对象),FreeMarker 将 HTML 模板中的占位符替换为实际数据。

  3. 处理后的 HTML 内容,其中占位符被数据替换,然后用作 PDF 文档的内容。

  4. 最后,使用 iTextPDF 来生成 PDF 文档,基于处理后的 HTML 内容。iTextPDF 可以将 HTML 转换为 PDF,确保您的 PDF 文档保留在 HTML 模板中定义的结构和样式。

这种组合允许您根据 HTML 模板和提供的数据,动态生成具有可变内容、布局和样式的 PDF 文档

1 pom

html 复制代码
 <!-- iText -->
            <dependency>
                <groupId>com.itextpdf</groupId>
                <artifactId>itextpdf</artifactId>
                <version>5.5.13</version>
            </dependency>

            <!-- FreeMarker -->
            <dependency>
                <groupId>org.freemarker</groupId>
                <artifactId>freemarker</artifactId>
                <version>2.3.31</version>
            </dependency>

            <!-- JFreeChart -->
            <dependency>
                <groupId>org.jfree</groupId>
                <artifactId>jfreechart</artifactId>
                <version>1.5.3</version>
            </dependency>

        <dependency>
            <groupId>org.xhtmlrenderer</groupId>
            <artifactId>flying-saucer-pdf-itext5</artifactId>
            <version>9.1.6</version>
        </dependency>

2 java代码

java 复制代码
import com.itextpdf.text.pdf.BaseFont;
import freemarker.template.Configuration;
import freemarker.template.Template;
import org.xhtmlrenderer.pdf.ITextRenderer;

import java.io.FileOutputStream;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;

public class PdfGenerator {

    public static void main(String[] args) {
        try {
            // Step 1: Load FreeMarker template
            Configuration cfg = new Configuration(Configuration.VERSION_2_3_31);
            cfg.setClassForTemplateLoading(PdfGenerator.class, "/templates");
            Template template = cfg.getTemplate("PDFtemplate.ftl");

            // Step 2: Prepare data model
            Map<String, Object> dataModel = new HashMap<>();
            dataModel.put("title", "支持中文");




            // Step 3: Generate HTML content
            StringWriter stringWriter = new StringWriter();
            template.process(dataModel, stringWriter);
            String htmlContent = stringWriter.toString();


            // Convert HTML to PDF
            ITextRenderer renderer = new ITextRenderer();
            renderer.setDocumentFromString(htmlContent);
            renderer.getFontResolver().addFont("C:/windows/fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);

            renderer.layout();
            renderer.createPDF(new FileOutputStream("output3.pdf"));


            System.out.println("PDF generated successfully.");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


}
复制代码
PDFtemplate 在resource项目的 templates文件夹中
中文显示:
复制代码
C:/windows/fonts/simsun.ttc
windows自带字体,线上替换为自己的字体

3 html

html 复制代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    <meta http-equiv="Content-Style-Type" content="text/css"/>
    <title></title>
    <style type="text/css">
        body {
            font-family: SimSun;
        }

        .center {
            text-align: center;
            width: 100%;
        }

        .bold {
            font-weight: bold;
        }

        .custom-table {
            border: 1px solid #000000;
        }

        .custom-cell {
            border: 1px solid #000000;
        }

    </style>
</head>


<body>
<h1 class="center">${title}</h1>



</body>

</html>
复制代码
body {
    font-family: SimSun;
}
引入刚才的字体,显示中文
相关推荐
bianshaopeng4 小时前
android 原生加载pdf
android·pdf
卢卡斯2334 小时前
在线PDF怎么转换成JPG图片?分享14种转换操作!
pdf
J不A秃V头A11 小时前
iTextPDF中,要实现表格中的内容在数据长度超过边框时自动换行
java·pdf
嘻嘻仙人1 天前
【杂谈一之概率论】CDF、PDF、PMF和PPF概念解释与分析
pdf·概率论·pmf·cdf
资深前端之路1 天前
vue2 将页面生成pdf下载
前端·vue.js·pdf
Eiceblue1 天前
Python 复制PDF中的页面
vscode·python·pdf
J不A秃V头A2 天前
使用iTextPDF库设置文字为英文样式
java·pdf
Odoo穆尘2 天前
【零散技术】Odoo PDF 打印问题问题合集
pdf·odoo
暮毅2 天前
一、前后端分离及drf的概念
django·pdf·前后端分离
ziyue75752 天前
java将word转pdf
java·pdf·word