- 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);
相关推荐
本文将深入探讨如何使用iText7这个库在Java环境中生成带有页码和目录的PDF文件。 iText7是一款功能丰富的PDF处理库,它支持创建、编辑、解析和展示PDF文档。在Java中,我们可以利用iText7轻松地生成具有复杂结构的...
在使用iText生成PDF目录时,要注意几点: - 确保每个书签都有一个对应的目标位置,否则在PDF中点击书签可能无法正确跳转。 - 避免内存泄漏,尤其是在处理大量书签时,要及时释放资源。 - 书签层次不宜过深,以免影响...
document.add(new Paragraph("这是使用IText生成的PDF文档!")); document.close(); } catch (DocumentException | IOException e) { e.printStackTrace(); } } } ``` 这段代码首先创建了一个`Document`对象...
在这个场景中,我们将探讨如何利用iText在Android应用中生成PDF以及读取PDF的内容。 首先,我们需要在Android项目中引入iText库。由于Android Studio默认使用Gradle作为构建工具,我们可以在`build.gradle`文件的...
以下是一些关于如何使用iText生成PDF的关键知识点: 1. **安装与获取iText**: 要使用iText,首先需要从其官方源代码托管平台SourceForge下载相应的.jar文件。基础的iText.jar提供了基本的PDF生成功能,但如果你...
总结一下,要实现在Spring Boot应用中使用iText生成带有页眉、页码、水印、目录和二维码的PDF,你需要: 1. 引入iText及相关库。 2. 创建HTML页面并将其转换为PDF。 3. 定制PDF内容,包括添加页眉、页码和水印。 4. ...
itext5生成PDF(含水印文字及图片)的源代码,操作说明详细,代码完整可用。
在IT行业中,生成PDF文档是常见的需求,尤其当需要将图片转换为便于分享和打印的格式时。`iText`是一个强大的Java库,专门用于创建、编辑和处理PDF文档。本教程将详细介绍如何使用`iText`将图片转换为高清PDF,并...
本文将详细探讨如何使用iText库生成PDF并利用证书进行签章,确保文档的完整性和不可篡改性。 首先,iText是一个强大的开源Java库,专门用于创建、修改和处理PDF文档。它提供了一系列API,使得开发者可以方便地实现...
本文将深入探讨iText 5.5.10在生成PDF方面的核心概念和常用方法,以及如何通过实例来理解和应用这些知识。 首先,生成PDF的基本流程包括创建PdfWriter对象、定义PdfDocument对象和添加内容。在iText中,`PdfWriter`...
这是使用Itext生成的PDF文档。")); document.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` 上述代码会在当前目录下生成一个名为"output.pdf"的PDF文件,内容为"Hello, World! 这是使用...
itext5 生成pdf 使用总结
这将生成PDF文件。 5. **处理异常**:在转换过程中,可能会遇到各种问题,如无效的HTML、缺失的资源或内存限制。确保你的代码能够适当地捕获和处理这些异常。 6. **优化性能**:为了提高大规模HTML转换的效率,...
本示例将探讨如何使用C#编程语言,结合iText7库,来创建符合规范的电子发票PDF文件。iText7是一个功能强大的PDF处理库,支持多种编程语言,包括.NET平台。 首先,`packages.config`文件列出了项目依赖的NuGet包,...
3. **PDF表格自动分页**: 在生成PDF文档时,如果一个表格太长以至于无法在一页内完全显示,iTextPDF可以自动将其分页。通过调整表格属性,如行高、列宽,以及设置分页策略,可以确保表格在每一页上都保持完整的结构...
iText生成pdf解决中文不显示字库,pdf凉字不显示,由于生成iText插件生成pdf的时候中文会显示不出来,遇到过的是"凉"字,查到是字体库的原因,网上下载字体库msyh.ttc,生成的时候指定字体库,就可以解决了,小bug一...
为了解决"Java使用Itext生成PDF中文不换行"的问题,我们可以采取以下几种策略: 1. **设置字体和编码**:确保使用支持中文的字体,如SimSun、Arial Unicode MS等,并正确设置PDF的编码为UTF-8。Itext中的`Font`类...
5. **生成PDF**:使用`PdfWriter.getInstance()`创建一个PDF写入器,并将其与`Document`关联。然后,选择一个输出流(如文件流或网络流)来保存PDF。例如: ```java PdfWriter.getInstance(document, new ...
在IT领域,生成PDF文档是常见的需求,尤其在报表、合同和文档自动化中。本教程将探讨如何使用iText7和FreeMarker库结合,来创建一个基于模板的PDF生成流程,确保中文支持和图片的正常显示。 首先,iText7是一款强大...