目录
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 文档。
在您具体的用例中,您以以下方式组合这些技术:
您创建一个 HTML 模板,使用 HTML 标记和占位符(用
${}包围的变量)作为 PDF 文档的结构和布局。您使用 FreeMarker 处理 HTML 模板。您向 FreeMarker 提供数据模型(一个带有键值对的 Java 对象),FreeMarker 将 HTML 模板中的占位符替换为实际数据。
处理后的 HTML 内容,其中占位符被数据替换,然后用作 PDF 文档的内容。
最后,使用 iTextPDF 来生成 PDF 文档,基于处理后的 HTML 内容。iTextPDF 可以将 HTML 转换为 PDF,确保您的 PDF 文档保留在 HTML 模板中定义的结构和样式。
这种组合允许您根据 HTML 模板和提供的数据,动态生成具有可变内容、布局和样式的 PDF 文档
-
- <dependency>
- <groupId>com.itextpdfgroupId>
- <artifactId>itextpdfartifactId>
- <version>5.5.13version>
- dependency>
-
-
- <dependency>
- <groupId>org.freemarkergroupId>
- <artifactId>freemarkerartifactId>
- <version>2.3.31version>
- dependency>
-
-
- <dependency>
- <groupId>org.jfreegroupId>
- <artifactId>jfreechartartifactId>
- <version>1.5.3version>
- dependency>
-
- <dependency>
- <groupId>org.xhtmlrenderergroupId>
- <artifactId>flying-saucer-pdf-itext5artifactId>
- <version>9.1.6version>
- dependency>
-
-
-
- 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
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自带字体,线上替换为自己的字体
- 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;
}
引入刚才的字体,显示中文