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;
}
引入刚才的字体,显示中文
相关推荐
CodeCraft Studio9 小时前
PDF处理控件Aspose.PDF教程:在 C# 中更改 PDF 页面大小
前端·pdf·c#
_oP_i13 小时前
提取 PDF 文件中的文字以及图片中的文字
pdf
集成显卡19 小时前
图片压缩工具 | 图片生成PDF文档
图像处理·pdf
一路向北North19 小时前
PDF.js无法显示数字签名
开发语言·javascript·pdf
开开心心就好1 天前
高效视频倍速播放插件推荐
python·学习·游戏·pdf·计算机外设·电脑·音视频
IT小农工2 天前
如何生成和制作PDF文件
pdf
北十南2 天前
VueScan Pro v9.8.45.08 一款图像扫描软件,中文绿色便携版
pdf·电脑
空谷有来人2 天前
推荐一款PDF压缩的工具
pdf·pdf压缩
开开心心_Every2 天前
免费且好用的PDF水印添加工具
android·javascript·windows·智能手机·pdf·c#·娱乐
aloha_7892 天前
论文中pdf图片文件太大怎么办
图像处理·pdf·论文笔记