Java实现HTML代码生成PDF文档
java html转pdf 原理
java html转pdf 原理摘要:本文将介绍Java HTML转PDF的原理,以及如何实现这个功能。
我们将从HTML结构、CSS样式、JavaScript交互性以及Java处理这几个方面来探讨。
一、HTML结构HTML(超文本标记语言)是一种用于创建网页内容的标准标记语言。
PDF (便携式文档格式)是一种用于传输和显示电子文档的跨平台文件格式。
将HTML内容转换为PDF的过程实际上是将HTML文档的结构和样式转换为PDF 文档的结构和样式。
二、CSS样式CSS(层叠样式表)是一种用于描述HTML元素在浏览器中如何呈现的样式语言。
在HTML转PDF的过程中,CSS样式起到了关键作用。
CSS样式决定了HTML元素的布局、颜色、字体等视觉属性。
将HTML内容转换为PDF的过程中,需要将CSS样式应用到PDF元素上,以实现与HTML文档相似的视觉效果。
三、JavaScript交互性JavaScript是一种用于实现网页交互功能的脚本语言。
在HTML转PDF的过程中,JavaScript交互性可能需要进行处理。
这是因为PDF文档是一种静态文件格式,不支持直接在PDF上执行JavaScript代码。
为了解决这个问题,可以在将HTML内容转换为PDF之前,先将JavaScript代码执行并获取相应的数据,然后在PDF中呈现这些数据。
四、Java处理Java是一种广泛应用于开发企业级应用的编程语言。
将HTML内容转换为PDF的过程可以通过Java来实现。
Java提供了许多处理PDF文档的库和工具,如iText、Apache PDFBox等。
通过使用这些库和工具,可以方便地将HTML文档的结构和样式转换为PDF文档的结构和样式,同时处理JavaScript交互性。
具体实现步骤如下:1. 将HTML文档解析为DOM(文档对象模型)结构。
2. 将CSS样式应用到DOM结构上,生成初始的PDF内容。
3. 执行JavaScript代码,获取所需的交互性数据。
链接转pdf java
在Java中将链接转换为PDF文件,通常需要使用一些第三方库,如Jsoup 用于抓取网页内容,然后使用iText或PDFBox等库将HTML内容转换为PDF 格式。
以下是一个基本的步骤示例:
1. 添加依赖项:
对于Jsoup:在你的Maven或Gradle构建文件中添加Jsoup依赖。
对于iText或PDFBox:添加相应的PDF生成库依赖。
2. 使用Jsoup抓取网页内容:
java代码:
3. 将HTML内容转换为PDF:
如果使用iText:
java代码:
如果使用PDFBox:
java代码:
注意:上述PDFBox示例中并没有直接将HTML转换为PDF,因为PDFBox 本身并不直接支持HTML到PDF的转换。
你可能需要结合使用Flying Saucer 或Apache FOP等其他库来实现这一功能。
请根据你的具体需求和环境选择合适的库和方法进行链接转PDF的操作。
同时,由于网络抓取和PDF生成可能会涉及到版权和许可问题,确保你在进行此类操作时遵守相关法律法规和网站的使用条款。
使用模板引擎生成pdf的几种方法
使用模板引擎生成pdf的几种方法
使用模板引擎生成PDF有以下几种方法:
1. 使用Java生成PDF:利用Freemarker模板引擎生成HTML,然后使用iText包进行转换,转换过程需要解决中文显示问题,需要在Freemarker模板文件中设置<body style="font-family:SimSun;">以解决该问题。
2. 使用Spring Boot和FreeMarker:通过在applicationproperties 中配置后缀、设置模板文件路径和覆盖默认属性值,可在SpringBoot 中使用FreeMarker生成Web应用。
3. 使用wkhtmltopdf:这是一种高性能的工具,可以将HTML转换为PDF,可以生成美观且实用的界面。
4. 使用SwingUI和JFreePDF:利用SwingUI生成用户界面,再使用JFreePDF将生成的HTML转换为PDF。
虽然这种方法可以生成PDF,但界面样式难看且不兼容太新的js语言。
5. 使用art-template:这是一种新的高性能JavaScript模板引擎,可以将数据与HTML模板更加友好地结合起来,支持服务器端和浏览器端使用,并使用标准语法进行渲染。
需要注意的是,不同的方法可能适用于不同的需求和场景,具体选择哪一种方法需要根据实际情况进行权衡和评估。
html转换为pdf案例的一些总结
html转换为pdf案例的一些总结
这篇文章主要介绍了关于html转换为pdf的案例,wkhtmltopdf测试PhantomJS测试 IText和Flying Sauser等一些学问点都做了具体解释,详细操作步骤大家可查看下文的具体讲解,感爱好的小伙伴们可以参考一下。
因为工作所需,最近花时光讨论了html转换为pdf的功能。
html转换为pdf的关键技术是如何处理网页中复杂的css样式,通过在网上收集资料,发觉目前html 转换为pdf的解决计划主要分为三类:客户端模式:前后台调用客户端程序,利用客户端程序的功能完成pdf 文件转换。
本次测试工具有:wkhtmltopdf和PhantomJS。
java jar 包解析类模式:java代码解析css样式,翻译html文件为pdf文件。
本次测试类有:IText,Flying Sauser,PD4ML。
js 前端解析模式:js前端解析html文件为pdf文件,本次测试案例有:html2canvas。
本次针对网上介绍的计划,结合实际项目的需求,做一一测试,在性能和功能方面做如下分析。
1.测试页面介绍
第1页共10页。
poihtml转pdf 带表格
poihtml转pdf 带表格传统的办公转换文件工具仍然是非常重要的。
POIHtml转PDF带表格是其中一种。
本篇文章将为读者介绍如何使用POIHtml转换器,将HTML文件带表格的内容转为PDF格式。
第一步:下载并安装POIHtml转换器工具POIHtml转换器是一个Java开发工具,任何具有Java环境的计算机都可以运行。
在网上搜索并下载POIHtml转换器程序包,将其解压并创建一个文件夹。
在文件夹中将包含POIHtml转换器的“jar”文件和一个例子HTML文件。
第二步:准备HTML文件和表格在POIHtml转换器工具的文件夹中,打开“example.html”文件并使用HTML标记创建一个包含表格的文件。
这个表格可以有一个或多个行和列。
第三步:编写Java代码在一个文本编辑器中打开一个新文件,输入以下代码:```javaimport java.io.*;import com.lowagie.text.*;import com.lowagie.text.pdf.*;import org.xhtmlrenderer.pdf.ITextRenderer;public class HtmlToPDF {public static void main(String[] args) throws DocumentException, IOException {OutputStream os = new FileOutputStream("example.pdf"); //创建PDF文件ITextRenderer renderer = new ITextRenderer();renderer.setDocument(new File("example.html"));yout();renderer.createPDF(os);}}```将“example.html”中的内容转换为PDF,将其保存为“example.pdf”。
html2pdf 方法
html2pdf是一个JavaScript库,可以将HTML文档转换为PDF文件。
以下是使用html2pdf方法的步骤:1. 引入html2pdf库文件```html<script src="/ajax/libs/html2pdf.js/0.9.3/html2pdf.bundle.min.js"></script>```2. 创建一个HTML元素,将要转换的内容放入其中```html<div id="content"><h1>Hello World</h1><p>This is a sample HTML content that will be converted to PDF.</p></div>```3. 在JavaScript代码中调用html2pdf方法,将HTML元素转换为PDF并下载```javascriptfunction downloadPDF() {var element = document.getElementById('content'); // 获取要转换的HTML元素var opt = {margin: 1,filename: 'sample.pdf',image: { type: 'jpeg', quality: 0.98 },html2canvas: { scale: 2 },jsPDF: { unit: 'in', format: 'letter', orientation: 'portrait' }};html2pdf().set(opt).from(element).save(); // 调用html2pdf方法,将HTML元素转换为PDF 并下载}```在上面的代码中,我们首先获取了要转换的HTML元素,然后定义了一些选项,如页面边距、文件名、图片质量等。
Java将Html转为PDF(二)
Java将Html转为PDF(⼆)前⾯介绍了如何,该⽅法需要使⽤Spire.PDF for Java 3.6.6或者之后的新版本,可根据⾃⼰的系统选择不同插件来实现转换。
本⽂提供另外⼀种转换⽅法,需要使⽤Spire.Doc for Java 3.9.4或者之后的新版本。
关于Jar包下载及导⼊⽅法1:。
解压,找到lib⽂件夹的Spire.Doc.jar⽂件,并在Java程序中导⼊jar⽂件⽅法2:在Maven程序中配置Pom.xml⽂件,如下(需要指定Maven仓库路径以及Spire.Doc的依赖):<repositories><repository><id>com.e-iceblue</id><url>/repository/maven-public/</url></repository></repositories><dependencies><dependency><groupId> e-iceblue </groupId><artifactId>spire.doc</artifactId><version>3.9.4</version></dependency></dependencies>完成配置后,导⼊jar。
详细步骤可参考官⽅⽂档。
Html转PDF⽅法转换时可以将Html String或者Html file转为PDF,参见以下代码⽅法:1. 将Html String转为PDF创建Word⽂档,将Html String添加到Word段落,通过saveToFile()保存为PDF⽂档。
import com.spire.doc.*;import java.io.BufferedReader;import java.io.FileReader;import java.io.IOException;public class HtmlToPDF1 {public static void main(String[] args) throws IOException{String inputHtml = "InputHtml.txt";//新建Document对象Document doc = new Document();//添加sectionSection sec = doc.addSection();String htmlText = readTextFromFile(inputHtml);//添加段落并写⼊HTML⽂本sec.addParagraph().appendHTML(htmlText);//将⽂档另存为PDFdoc.saveToFile("HTMLstringToPDF.pdf", FileFormat.PDF);doc.dispose();}public static String readTextFromFile(String fileName) throws IOException {StringBuffer sb = new StringBuffer();BufferedReader br = new BufferedReader(new FileReader(fileName));String content;while ((content = br.readLine()) != null) {sb.append(content);}return sb.toString();}}2. 将Html file转为PDF加载Html⽂件,通过saveToFile()⽅法直接保存为PDF。
Java实现HTML转PDF的总结
Java实现HTML转PDF的总结Java实现HTML转PDF的⼏种⽅法—主要解决中⽂乱码问题第⼀:同事在做HTML转PDF中遇到乱码问题*****************************************************************她采⽤的itext⽅法实现HTML转存为PDF,代码如下:1import java.io.FileInputStream;2import java.io.FileOutputStream;34import com.itextpdf.text.Document;5import com.itextpdf.text.PageSize;6import com.itextpdf.text.pdf.PdfWriter;7import com.itextpdf.tool.xml.XMLWorkerHelper;89public class HtmlToPDF {10public static final String HTML = "D:/printEnforcement.htm";11public static void main(String[] args) {12try {1314 Document document = new Document(PageSize.LETTER);15 PdfWriter pdfWriter = PdfWriter.getInstance(document,16new FileOutputStream("d://testpdf.pdf"));17 document.open();18 document.addAuthor("test");19 document.addCreator("test");20 document.addSubject("test");21 document.addCreationDate();22 document.addTitle("XHTML to PDF");2324 XMLWorkerHelper worker = XMLWorkerHelper.getInstance();2526 worker.parseXHtml(pdfWriter, document, new FileInputStream(HTML), null, new AsianFontProvider());27 document.close();28 System.out.println("Done.");29 } catch (Exception e) {30 e.printStackTrace();31 }32 }3334 }1import com.itextpdf.text.BaseColor;2import com.itextpdf.text.Font;3import com.itextpdf.text.pdf.BaseFont;4import com.itextpdf.tool.xml.XMLWorkerFontProvider;56public class AsianFontProvider extends XMLWorkerFontProvider {78public Font getFont(final String fontname, final String encoding,9final boolean embedded, final float size, final int style,10final BaseColor color) {11 BaseFont bf = null;12try {13 bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",14 BaseFont.NOT_EMBEDDED);15 } catch (Exception e) {16 e.printStackTrace();17 }18 Font font = new Font(bf, size, style, color);19 font.setColor(color);20return font;21 }22 }代码的思路很简单的,⼀个pdfwriter类负责输出pdf参数,⼀个document作为⽅法中的参数,⼀个xmlworkhelper负责将html转化为pdf⽂档;在另⼀个类中XMLWorkerFontProvider⽬前主要写的是关于字体参数的设置。
html导出pdf的四种方式
html导出pdf的四种⽅式将html页⾯导出为pdf⽂件并打印,可以直接在windows下使⽤Ctrl + P,苹果下⌘ + P。
如果需要⽤代码实现,可以考虑jsPDF、iText、wkhtmltopdf等⽅式。
以下是三种⽅式代码对⽐:⽅式优点缺点分页图⽚表格链接中⽂特殊字符、样式jsPDF 1、整个过程在客户端执⾏(不需要服务器参与),调⽤简单1、⽣成的pdf为图⽚形式,且内容失真⽀持⽀持⽀持不⽀持⽀持⽀持iText 1、功能基本可以实现,⽐较灵活2、⽣成pdf质量较⾼1、对html标签严;格,少⼀个结束标签就会报错;2、后端实现复杂,服务器需要安装字体;3、图⽚渲染⽐较复杂(暂时还没解决)⽀持⽀持⽀持⽀持⽀持⽀持wkhtmltopdf 1、调⽤⽅式简单(只需执⾏⼀⾏脚本);2、⽣成pdf质量较⾼1、服务器需要安装wkhtmltopdf环境;2、根据⽹址⽣成pdf,对于有权限控制的页⾯需要在拦截器进⾏处理⽀持⽀持⽀持⽀持⽀持⽀持从实⽤和质量综合考虑,个⼈推荐使⽤iText。
⽣成各种票据等⽂件质量好,代码也并不复杂。
以下是我使⽤三种⽅式测试的例⼦,IDE使⽤IDEA,Spring Boot结合Freemarker。
1.iTextiText是⼀个第三⽅报表java插件,可以在后端利⽤java随意⽣成、转化pdf⽂件,提供了很多api,⽐较灵活。
<!--PDF--><dependency><groupId>org.eclipse.birt.runtime.3_7_1</groupId><artifactId>com.lowagie.text</artifactId><version>2.1.7</version></dependency><dependency><groupId>org.xhtmlrenderer</groupId><artifactId>flying-saucer-pdf</artifactId><version>9.0.8</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.4.2</version></dependency><!--PDF end-->使⽤iText需要下载字体⽂件/*** iText⽣成PDF 需要字体⽀持** @param args* @throws IOException* @throws DocumentException*/public static void main(String[] args) throws IOException, DocumentException {ITextRenderer renderer = new ITextRenderer();ITextFontResolver fontResolver = renderer.getFontResolver();fontResolver.addFont("E:/下载/simsunttc/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);OutputStream os = new FileOutputStream("E:/create/" + UUID.randomUUID() + ".pdf");String htmlstr = "<!DOCTYPE html>\n" +"<html lang=\"en\">\n" +"<head>\n" +" <title>Title</title>\n" +"</head>\n" +"<body>\n" +"<table border=\"1\">\n" +" <tr>\n" +" <td>row 1, cell 1</td>\n" +" <td>row 1, cell 2</td>\n" +" </tr>\n" +" <tr>\n" +" <td>row 2, cell 1</td>\n" +" <td>row 2, cell 2</td>\n" +" </tr>\n" +"</table>\n" +"</body>\n" +"</html>";renderer.setDocumentFromString(htmlstr);yout();renderer.createPDF(os);}使⽤Itext可以⽅便的根据写好的html模板来填充内容,设置标题页眉添加背景图⽚等操作。
java html转pdf方案
java html转pdf方案在 Java 中,可以使用第三方库来实现将 HTML 转换为 PDF。
以下是一个使用Flying Saucer 和 iText 库的示例:1. 首先,需要在项目中添加 Flying Saucer 和 iText 的依赖:```java<dependency><groupId>org.xhtmlrenderer</groupId><artifactId>flying-saucer-pdf</artifactId><version>9.1.22</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13.2</version></dependency>```2. 创建一个 HTML 文件,例如 `example.html`,并保存到本地文件系统中。
3. 使用以下代码将 HTML 文件转换为 PDF 文件:```javaimport java.io.File;import java.io.FileOutputStream;import java.io.OutputStream;import org.xhtmlrenderer.pdf.ITextRenderer;public class HtmlToPdfConverter {public static void main(String[] args) throws Exception {// 输入 HTML 文件路径和输出 PDF 文件路径String inputPath = "example.html";String outputPath = "example.pdf";// 创建 ITextRenderer 对象并设置 PDF 输出流ITextRenderer renderer = new ITextRenderer();OutputStream outputStream = new FileOutputStream(new File(outputPath));renderer.setDocument(new File(inputPath));renderer.setOutputStream(outputStream);// 渲染 PDF 并关闭输出流yout();renderer.close();outputStream.close();}}```在上述代码中,我们创建了一个 `ITextRenderer` 对象,并将其配置为从输入HTML 文件渲染 PDF 文件,并将输出流设置为一个文件输出流。
电子凭证——Java生成Pdf
电⼦凭证——Java⽣成PdfJava⽣成Pdf技术⽅案,通过Html模板引擎进⾏数据渲染,通过iText⽣成Pdf,通过Jpedal⽣成图⽚。
解决CSS样式兼容问题,中⽂字体问题等。
1.背景在某些业务场景中,需要提供相关的电⼦凭证,⽐如⽹银/⽀付宝中转账的电⼦回单,签约的电⼦合同等。
⽅便⽤户查看,下载,打印。
⽬前常⽤的解决⽅案是,把相关数据信息,⽣成对应的pdf⽂件返回给⽤户。
本⽂源码:2.iTextiText是著名的开放源码的站点sourceforge⼀个项⽬,是⽤于⽣成PDF⽂档的⼀个java类库。
通过iText不仅可以⽣成PDF或rtf的⽂档,⽽且可以将XML、Html⽂件转化为PDF⽂件。
iText 开发⽂档:来个最简单的例⼦:添加依赖:<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.11</version></dependency>测试代码:JavaToPdfpackage com.lujianing.test;import com.itextpdf.text.Document;import com.itextpdf.text.DocumentException;import com.itextpdf.text.Paragraph;import com.itextpdf.text.pdf.PdfWriter;import java.io.FileNotFoundException;import java.io.FileOutputStream;/*** Created by lujianing on 2017/5/7.*/public class JavaToPdf {private static final String DEST = "target/HelloWorld.pdf";public static void main(String[] args) throws FileNotFoundException, DocumentException { Document document = new Document();PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(DEST));document.open();document.add(new Paragraph("hello world"));document.close();writer.close();}}运⾏结果:3.iText-中⽂⽀持iText默认是不⽀持中⽂的,因此需要添加对应的中⽂字体,⽐如⿊体simhei.ttf可参考⽂档:测试代码:JavaToPdfCNpackage com.lujianing.test;import com.itextpdf.text.Document;import com.itextpdf.text.DocumentException;import com.itextpdf.text.Font;import com.itextpdf.text.FontFactory;import com.itextpdf.text.Paragraph;import com.itextpdf.text.pdf.BaseFont;import com.itextpdf.text.pdf.PdfWriter;import java.io.FileNotFoundException;import java.io.FileOutputStream;/*** Created by lujianing on 2017/5/7.*/public class JavaToPdfCN {private static final String DEST = "target/HelloWorld_CN.pdf";private static final String FONT = "simhei.ttf";public static void main(String[] args) throws FileNotFoundException, DocumentException {Document document = new Document();PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(DEST));document.open();Font f1 = FontFactory.getFont(FONT, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); document.add(new Paragraph("hello world,我是鲁家宁", f1));document.close();writer.close();}}输出结果:4.iText-Html渲染在⼀些⽐较复杂的pdf布局中,我们可以通过html去⽣成pdf可参考⽂档:添加依赖:<dependency><groupId>com.itextpdf.tool</groupId><artifactId>xmlworker</artifactId><version>5.5.11</version></dependency>添加模板:template.html<!DOCTYPE html><html><head><meta charset="UTF-8"/><title>Title</title><style>body{font-family:SimHei;}.red{color: red;}</style></head><body><div>你好,鲁家宁</div></body></html>测试代码:JavaToPdfHtmlpackage com.lujianing.test;import com.itextpdf.text.Document;import com.itextpdf.text.DocumentException; import com.itextpdf.text.pdf.PdfWriter;import com.itextpdf.tool.xml.XMLWorkerFontProvider; import com.itextpdf.tool.xml.XMLWorkerHelper; import com.lujianing.test.util.PathUtil;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.nio.charset.Charset;/*** Created by lujianing on 2017/5/7.*/public class JavaToPdfHtml {private static final String DEST = "target/HelloWorld_CN_HTML.pdf";private static final String HTML = PathUtil.getCurrentPath()+"/template.html";private static final String FONT = "simhei.ttf";public static void main(String[] args) throws IOException, DocumentException {// step 1Document document = new Document();// step 2PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(DEST));// step 3document.open();// step 4XMLWorkerFontProvider fontImp = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS); fontImp.register(FONT);XMLWorkerHelper.getInstance().parseXHtml(writer, document,new FileInputStream(HTML), null, Charset.forName("UTF-8"), fontImp);// step 5document.close();}}输出结果:需要注意:1.html中必须使⽤标准的语法,标签⼀定需要闭合2.html中如果有中⽂,需要在样式中添加对应字体的样式5.iText-Html-Freemarker渲染在实际使⽤中,html内容都是动态渲染的,因此我们需要加⼊模板引擎⽀持,可以使⽤FreeMarker/Velocity,这⾥使⽤FreeMarker举例添加FreeMarke依赖:<dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.19</version></dependency>添加模板:template_freemarker.html<!DOCTYPE html><html><head><meta charset="UTF-8"/><title>Title</title><style>body{font-family:SimHei;}.blue{color: blue;}</style></head><body><div>你好,${name}</div></body></html>测试代码:JavaToPdfHtmlFreeMarkerpackage com.lujianing.test;import com.itextpdf.text.Document;import com.itextpdf.text.DocumentException;import com.itextpdf.text.pdf.PdfWriter;import com.itextpdf.tool.xml.XMLWorkerFontProvider;import com.itextpdf.tool.xml.XMLWorkerHelper;import com.lujianing.test.util.PathUtil;import freemarker.template.Configuration;import freemarker.template.Template;import java.io.ByteArrayInputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.StringWriter;import java.io.Writer;import java.nio.charset.Charset;import java.util.HashMap;import java.util.Map;/*** Created by lujianing on 2017/5/7.*/public class JavaToPdfHtmlFreeMarker {private static final String DEST = "target/HelloWorld_CN_HTML_FREEMARKER.pdf";private static final String HTML = "template_freemarker.html";private static final String FONT = "simhei.ttf";private static Configuration freemarkerCfg = null;static {freemarkerCfg =new Configuration();//freemarker的模板⽬录try {freemarkerCfg.setDirectoryForTemplateLoading(new File(PathUtil.getCurrentPath())); } catch (IOException e) {e.printStackTrace();}}public static void main(String[] args) throws IOException, DocumentException {Map<String,Object> data = new HashMap();data.put("name","鲁家宁");String content = JavaToPdfHtmlFreeMarker.freeMarkerRender(data,HTML);JavaToPdfHtmlFreeMarker.createPdf(content,DEST);}public static void createPdf(String content,String dest) throws IOException, DocumentException {// step 1Document document = new Document();// step 2PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));// step 3document.open();// step 4XMLWorkerFontProvider fontImp = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS); fontImp.register(FONT);XMLWorkerHelper.getInstance().parseXHtml(writer, document,new ByteArrayInputStream(content.getBytes()), null, Charset.forName("UTF-8"), fontImp);// step 5document.close();}/*** freemarker渲染html*/public static String freeMarkerRender(Map<String, Object> data, String htmlTmp) {Writer out = new StringWriter();try {// 获取模板,并设置编码⽅式Template template = freemarkerCfg.getTemplate(htmlTmp);template.setEncoding("UTF-8");// 合并数据模型与模板template.process(data, out); //将合并后的数据和模板写⼊到流中,这⾥使⽤的字符流out.flush();return out.toString();} catch (Exception e) {e.printStackTrace();} finally {try {out.close();} catch (IOException ex) {ex.printStackTrace();}}return null;}}输出结果:⽬前为⽌,我们已经实现了iText通过Html模板⽣成Pdf的功能,但是实际应⽤中,我们发现iText并不能对⾼级的CSS样式进⾏解析,⽐如CSS中的position属性等,因此我们要引⼊新的组件6.Flying Saucer-CSS⾼级特性⽀持Flying Saucer is a pure-Java library for rendering arbitrary well-formed XML (or XHTML) using CSS 2.1 for layout and formatting, output to Swing panels, PDF, and images.Flying Saucer是基于iText的,⽀持对CSS⾼级特性的解析。
java根据模板动态生成PDF实例
java根据模板动态⽣成PDF实例⼀、需求说明:根据业务需要,需要在服务器端⽣成可动态配置的PDF⽂档,⽅便数据可视化查看。
⼆、解决⽅案:iText+FreeMarker+JFreeChart⽣成可动态配置的PDF⽂档iText有很强⼤的PDF处理能⼒,但是样式和排版不好控制,直接写PDF⽂档,数据的动态渲染很⿇烦。
FreeMarker能配置动态的html模板,正好解决了样式、动态渲染和排版问题。
JFreeChart有这⽅便的画图API,能画出简单的折线、柱状和饼图,基本能满⾜需要。
三、实现功能:1、能动态配置PDF⽂档内容2、能动态配置中⽂字体显⽰3、设置⾃定义的页眉页脚信息4、能动态⽣成业务图⽚5、完成PDF的分页和图⽚的嵌⼊四、主要代码结构说明:1、component包:PDF⽣成的组件对外提供的是PDFKit⼯具类和HeaderFooterBuilder接⼝,其中PDFKit负责PDF的⽣成,HeaderFooterBuilder负责⾃定义页眉页脚信息。
2、builder包:负责PDF模板之外的额外信息填写,这⾥主要是页眉页脚的定制。
3、chart包:JFreeChart的画图⼯具包,⽬前只有⼀个线形图。
4、test包:测试⼯具类5、util包:FreeMarker等⼯具类。
五、关键代码说明:1、模板配置<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="/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: pingfang sc light;}.center{text-align: center;width: 100%;}</style></head><body><!--第⼀页开始--><div class="page" ><div class="center"><p>${templateName}</p></div><div><p>iText官⽹:${ITEXTUrl}</p></div><div><p>FreeMarker官⽹:${freeMarkerUrl}</p></div><div><p>JFreeChart教程:${JFreeChartUrl}</p></div><div>列表值:</div><div><#list scores as item><div><p>${item}</p></div></#list></div></div><!--第⼀页结束--><!---分页标记--><span style="page-break-after:always;"></span><!--第⼆页开始--><div class="page"><div>第⼆页开始了</div><!--外部链接--><p>百度图标</p><div><img src="${imageUrl}" alt="百度图标" width="270" height="129"/></div><!--动态⽣成的图⽚--><p>⽓温变化对⽐图</p><div><img src="${picUrl}" alt="我的图⽚" width="500" height="270"/></div></div><!--第⼆页结束--></body></html>2、获取模板内容并填充数据/*** @description 获取模板*/public static String getContent(String fileName,Object data){String templatePath=getPDFTemplatePath(fileName);//根据PDF名称查找对应的模板名称String templateFileName=getTemplateName(templatePath);String templateFilePath=getTemplatePath(templatePath);if(StringUtils.isEmpty(templatePath)){throw new FreeMarkerException("templatePath can not be empty!");}try{Configuration config = new Configuration(Configuration.VERSION_2_3_25);//FreeMarker配置config.setDefaultEncoding("UTF-8");config.setDirectoryForTemplateLoading(new File(templateFilePath));//注意这⾥是模板所在⽂件夹,不是⽂件 config.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);config.setLogTemplateExceptions(false);Template template = config.getTemplate(templateFileName);//根据模板名称获取对应模板StringWriter writer = new StringWriter();template.process(data, writer);//模板和数据的匹配writer.flush();String html = writer.toString();return html;}catch (Exception ex){throw new FreeMarkerException("FreeMarkerUtil process fail",ex);}}3、导出模板到PDF⽂件/*** @description 导出pdf到⽂件* @param fileName 输出PDF⽂件名* @param data 模板所需要的数据**/public String exportToFile(String fileName,Object data){String htmlData= FreeMarkerUtil.getContent(fileName, data);//获取FreeMarker的模板数据if(StringUtils.isEmpty(saveFilePath)){saveFilePath=getDefaultSavePath(fileName);//设置PDF⽂件输出路径}File file=new File(saveFilePath);if(!file.getParentFile().exists()){file.getParentFile().mkdirs();}FileOutputStream outputStream=null;try{//设置输出路径outputStream=new FileOutputStream(saveFilePath);//设置⽂档⼤⼩Document document = new Document(PageSize.A4);//IText新建PDF⽂档PdfWriter writer = PdfWriter.getInstance(document, outputStream);//设置⽂档和输出流的关系//设置页眉页脚PDFBuilder builder = new PDFBuilder(headerFooterBuilder,data);builder.setPresentFontSize(10);writer.setPageEvent(builder);//输出为PDF⽂件convertToPDF(writer,document,htmlData);}catch(Exception ex){throw new PDFException("PDF export to File fail",ex);}finally{IOUtils.closeQuietly(outputStream);}return saveFilePath;}4、测试⼯具类public String createPDF(Object data, String fileName){//pdf保存路径try {//设置⾃定义PDF页眉页脚⼯具类PDFHeaderFooter headerFooter=new PDFHeaderFooter();PDFKit kit=new PDFKit();kit.setHeaderFooterBuilder(headerFooter);//设置输出路径kit.setSaveFilePath("/Users/fgm/Desktop/pdf/hello.pdf”);//设置出书路径String saveFilePath=kit.exportToFile(fileName,data);return saveFilePath;} catch (Exception e) {log.error("PDF⽣成失败{}", ExceptionUtils.getFullStackTrace(e));return null;}}public static void main(String[] args) {ReportKit360 kit=new ReportKit360();TemplateBO templateBO=new TemplateBO();//配置模板数据templateBO.setTemplateName("Hello iText! Hello freemarker! Hello jFreeChart!");templateBO.setFreeMarkerUrl("/chm/freemarker2_3_24/ref_directive_if.html");templateBO.setITEXTUrl("/examples-itext5");templateBO.setJFreeChartUrl("/jfreechart/jfreechart_referenced_apis.html");templateBO.setImageUrl("https:///5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png"); List<String> scores=new ArrayList<String>();scores.add("90");scores.add("95");scores.add("98");templateBO.setScores(scores);List<Line> lineList=getTemperatureLineList();TemperatureLineChart lineChart=new TemperatureLineChart();String picUrl=lineChart.draw(lineList,0);//⾃定义的数据画图templateBO.setPicUrl(picUrl);String path= kit.createPDF(templateBO,"hello.pdf");System.out.println(path);}六、⽣成效果图:七、项⽬完整代码⼋、遇到的坑:1、FreeMarker配置模板⽂件样式,在实际PDF⽣成过程中,可能会出现⼀些不⼀致的情形,⽬前解决⽅法,就是换种⽅式调整样式。
Java实现HTML页面转PDF解决方案(转)
Java实现HTML页⾯转PDF解决⽅案(转)public boolean convertHtmlToPdf(String inputFile, String outputFile)throws Exception {OutputStream os = new FileOutputStream(outputFile);ITextRenderer renderer = new ITextRenderer();String url = new File(inputFile).toURI().toURL().toString();renderer.setDocument(url);// 解决中⽂⽀持问题ITextFontResolver fontResolver = renderer.getFontResolver();fontResolver.addFont("C:/Windows/Fonts/SIMSUN.TTC", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//解决图⽚的相对路径问题renderer.getSharedContext().setBaseURL("file:/D:/");yout();renderer.createPDF(os);os.flush();os.close();return true;}上⾯这段代码是这样的,输⼊⼀个HTML地址URL = inputFile,输⼊⼀个要输出的地址,就可以在输出的PDF地址中⽣成这个PDF。
注意事项:1.输⼊的HTML页⾯必须是标准的XHTML页⾯。
页⾯的顶上必须是这样的格式:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="/1999/xhtml">并且HTML页⾯的语法必须是⾮常严谨的,所有标签都必须闭合等等(由于flying-Saucer做了XML解析的⼯作,不严谨会报错的。
Java HTML直接导出PDF
Java HTML直接导出PDFJava HTML直接导出PDF对于java中如何从html中直接导出pdf,有很多的开源代码,这里个人用itext转。
首先需要的包有:core-renderer-1.0.jarcore-renderer-R8pre1.jarcore-renderer.jariText-2.0.8.jarjtidy-4aug2000r7-dev.jarTidy.jariTextAsian.jarjava代码的话就比较简单了。
具体是先用Tidy将html转换为xhtml,将xhtml转换为其它各种格式的。
虽然在转化到pdf时也是用的iText。
代码如下:Java代码//struts1.x中Java代码elseif("Html2Pdf".equalsIgnoreCase(action)){ exportPdfF ile("http://localhost:8080/jsp/test.jsp"); return null; } // 导出pdf add by huangt 2012.6.1 public File exportPdfFile(String urlStr) throws BaseException{ // String outputFile = this.fileRoot + "/" +// ServiceConstants.DIR_PUBINFO_EXPORT + "/" + getFileName() + ".pdf"; String outputFile = "d:/test3.pdf"; OutputStream os; try { os = new FileOutputStream(outputFile); ITextRenderer renderer = new ITextRenderer();String str = getHtmlFile(urlStr);renderer.setDocumentFromString(str); ITextFontResolver fontResolver =renderer.getFontResolver();fontResolver.addFont("C:/WINDOWS/Fonts/SimSun.ttc",B aseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);// 宋体字fontResolver.addFont("C:/WINDOWS/Fonts/Arial.ttf",Base Font.IDENTITY_H, BaseFont.NOT_EMBEDDED);// 宋体字yout();renderer.createPDF(os);System.out.println("转换成功!"); os.flush(); os.close(); return newFile(outputFile); } catch (FileNotFoundException e) { // logger.error("不存在文件!" +e.getMessage()); throw new BaseException(e); } catch (DocumentExceptione) { // logger.error("生成pdf时出错了!" + e.getMessage()); throw new BaseException(e); } catch (IOException e){ // logger.error("pdf出错了!" +e.getMessage()); throw new BaseException(e); } } // 读取页面内容add by huangt 2012.6.1 public String getHtmlFile(String urlStr) throws BaseException{ URL url; try { if (urlStr.indexOf("?") != -1) { urlStr = urlStr + "&locale=" + LocaleContextHolder.getLocale().toString();} else { urlStr = urlStr + "?locale="+LocaleContextHolder.getLocale().toString();} url = new URL(urlStr); URLConnection uc = url.openConnection();InputStream is = uc.getInputStream();Tidy tidy = new Tidy(); OutputStream os2 = new ByteArrayOutputStream();tidy.setXHTML(true); // 设定输出为xhtml(还可以输出为xml)tidy.setCharEncoding(Configuration.UTF8); // 设定编码以正常转换中文tidy.setTidyMark(false); // 不设置它会在输出的文件中给加条meta信息tidy.setXmlPi(true); // 让它加上<?xml version="1.0"?> tidy.setIndentContent(true); // 缩进,可以省略,只是让格式看起来漂亮一些tidy.parse(is, os2);is.close(); // 解决乱码--将转换后的输出流重新读取改变编码String temp; StringBuffer sb = new StringBuffer();BufferedReader in = new BufferedReader(new InputStreamReader( new ByteArrayInputStream( (( ByteArrayOutputStream) os2).toByteArray()),"utf-8")); while ((temp = in.readLine()) != null){ sb.append(temp); } return sb.toString(); } catch (IOException e) { // logger.error("读取客户端网页文本信息时出错了" + e.getMessage()); throw new BaseException(e); } }为了解决包的问题,加上Maven <!-- pdf导出-->Xml代码<dependency><groupId>com.lowagie</groupId><artifactId>itext</artifactId><version>2.1.7</version> </dependency> <dependency><groupId>org.xhtmlrenderer.flyingsaucer</groupId& gt; <artifactId>pdf-renderer</artifactId><version>1.0</version> </dependency> <dependency><groupId>jtidy</groupId><artifactId>jtidy</artifactId><version>4aug2000r7-dev</version><type>jar</type><scope>compile</scope> </dependency> <dependency><groupId>net.sf.barcode4j</groupId><artifactId>barcode4j-light</artifactId><version>2.0</version> </dependency> <dependency><groupId>avalon-framework</groupId><artifactId>avalon-framework-impl</artifactId> <version>4.2.0</version> </dependency><!-- pdf -->另外附上稍微复杂的PDFUtils.java文件,由于没时间就不做整理解释了!见下载附件!。
PDF技术-Java实现Html转PDF文件
PDF 技术-Java 实现Html 转PDF ⽂件html 转换为pdf 的关键技术是如何处理⽹页中复杂的css 样式、以及中⽂乱码处理。
各实现对⽐表于Windows 平台进⾏测试: 基于IText 基于FlyingSaucer 基于WKHtmlToPdf 基于pd4ml 跨平台性跨平台跨平台跨平台跨平台是否安装软件否否需安装WKHtmlToPdf 否是否收费免费免费免费收费转换Html效率速度快未测速度慢。
相⽐URL 来说,效率较慢。
能忽略⼀些html 语法或资源是否存在问题。
速度快。
部分CSS 样式不⽀持。
效果存在样式失真问题。
对html 语法有⼀定要求存在样式失真问题。
对html 语法有较⾼要求。
失真情况较⼩⼤部分⽹页能按Chome 浏览器显⽰的页⾯转部分CSS 样式有问题。
转换URL 效率未测未测效率不是特别⾼未测效果未测未测部分⽹页由于其限制,或将出现html ⽹页不完整。
未测优点不需安装软件、转换速度快不需安装软件、转换速度快⽣成PDF 质量⾼不需要安装软件、转换速度快缺点对html 标签严格,少⼀个结束标签就会报错;服务器需要安装字体对html 标签严格,少⼀个结束标签就会报错;服务器需要安装字体需要安装软件、时间效率不⾼对部分CSS 样式不⽀持。
评价综合:使⽤WKHtmlToPdf 效果(样式)最好。
但速度较慢(对于⽂件来说)。
其余均有⼤⼤⼩⼩的失真问题。
分页图⽚表格链接中⽂特殊字符整体样式速度IText ⽀持⽀持⽀持⽀持⽀持⽀持失真问题快FlyingSaucer 未知未知未知未知未知未知未知快WKHtmlToPdf ⽀持⽀持⽀持⽀持⽀持⽀持很好慢pd4ml ⽀持⽀持⽀持⽀持⽀持⽀持失真问题快html ⽹页完整转换为pdf ,所有的⽅案均有不⾜。
itext 有时并不能满⾜需求,不能兼容html 的样式,且从html 页⾯导出的图⽚到pdf 中也并不好处理。
Flying Sauser 实现html2pdf ,纠错能⼒差,⽀持多种中⽂字体(部分样式不能识别),且对html 的格式也是⼗分的严格,如果⽤⼀种模版的话⽤Flying Sauser 技术倒是不错的选择,但对于不规则的html 导出pdf 就并不是那么的适⽤。
html转pdf复选框
要将HTML转换为PDF并添加复选框,可以使用JavaScript库`html2pdf.js`。
首先,需要在HTML文件中引入该库:```html<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>HTML转PDF</title><script src="XX"></script></head><body><!-- 在这里编写你的HTML内容--><div id="content"><h1>标题</h1><p>这是一个段落。
</p><input type="checkbox" id="myCheckbox"> 复选框</div><button onclick="convertToPdf()">转换为PDF</button><script>function convertToPdf() {const element = document.getElementById('content');html2pdf().from(element).save();}</script></body></html>```在这个例子中,我们创建了一个包含标题、段落和复选框的HTML内容。
html模板结合itextpdf生成pdf文档--demo
html模板结合itextpdf⽣成pdf⽂档--demo这段时间,接到⼀个需求,是将doc⽂档⽣成pdf⽂档。
因为doc⽂档还挺复杂的,按照⽹上的⽰例使⽤java代码⼀个⼀个⽣成,那就太复杂了,所以就想到使⽤html模板来⽣成pdf⽂档。
⽂章结束附代码链接(下载pdf,pdf添加⽔印⽂字图⽚,poi导出excel,freemarker导出excel)。
步骤:1.wps打开doc⽂档,⽂件另存为html格式2.将⽣成的html复制进项⽬,如果有图⽚,则把同名⽂件中的图⽚复制进项⽬3.把html中的图⽚路径替换成正确的路径4.检查html中的标签是否都正确结束。
5.下载调试,如果有表格等,可能会导致有些边框出不来,所以需要调试table的td标签的border属性。
代码链接:图⽚是我使⽤demo代码测试导出的⽂件:⽣成的⽔印⽂字,⽀持多页⽣成:可能遇到的坑:⼀、报错信息: The document has no pages.原因1:在⽣成PDF时,需要⽣成PDF的内容,标签有误,在使⽤itextpdf下载pdf的时候,⼀定要保证标签有开始,有结束才⾏。
⽐如⽣成的html⽂件中的meta标签,img标签;解决:<meta http-equiv=Content-Type content="text/html; charset=UTF-8"/><meta name=ProgId content=Word.Document/><meta name=Generator content="Microsoft Word 14"/><meta name=Originator content="Microsoft Word 14"/><img src=""/>原因2:使⽤新版的wps⽣成的html⽂档中含有itextPdf不识别的内容,我这次就因为这个搞了我⼏天。
JavaScript+Java实现HTML页面转为PDF文件保存的方法
JavaScript+Java实现HTML页⾯转为PDF⽂件保存的⽅法需求是⼀个导出pdf的功能,多⽅奔⾛终于实现了,⾛了不少弯路,⽽且怀疑现在这个⽅法仍是弯的。
有个jsPDF 插件可以在前端直接⽣成pdf,很简便,但不⽀持IE。
前端:⾸先引⼊ html2canvas.jshtml2canvas(document.body, { //截图对象//此处可配置详细参数onrendered: function(canvas) { //渲染完成回调canvascanvas.id = "mycanvas";// ⽣成base64图⽚数据var dataUrl = canvas.toDataURL('image/png'); //指定格式,也可不带参数var formData = new FormData(); //模拟表单对象formData.append("imgData",convertBase64UrlToBlob(dataUrl)); //写⼊数据var xhr = new XMLHttpRequest(); //数据传输⽅法xhr.open("POST", "../bulletin/exportPdf"); //配置传输⽅式及地址xhr.send(formData);xhr.onreadystatechange = function(){ //回调函数if(xhr.readyState == 4){if (xhr.status == 200) {var back = JSON.parse(xhr.responseText);if(back.success == true){alertBox({content: 'Pdf导出成功!',lock: true,drag: false,ok: true});}else{alertBox({content: 'Pdf导出失败!',lock: true,drag: false,ok: true});}}}};}});//将以base64的图⽚url数据转换为Blobfunction convertBase64UrlToBlob(urlData){//去掉url的头,并转换为bytevar bytes=window.atob(urlData.split(',')[1]);//处理异常,将ascii码⼩于0的转换为⼤于0var ab = new ArrayBuffer(bytes.length);var ia = new Uint8Array(ab);for (var i = 0; i < bytes.length; i++) {ia[i] = bytes.charCodeAt(i);}return new Blob( [ab] , {type : 'image/png'});}兼容性:Firefox 3.5+, Chrome, Opera, IE10+不⽀持:iframe,浏览器插件,Flash跨域图⽚需要在跨域服务器header加上允许跨域请求access-control-allow-origin: * access-control-allow-credentials: truesvg图⽚不能直接⽀持,已经有补丁包了,不过我没有试过。
java xhtmlrenderer 使用指南
文章标题:Java XHTMLRenderer 使用指南在软件开发领域,Java语言拥有广泛的应用,尤其在Web开发和企业级应用开发中,Java是首选的语言之一。
而在Java开发中,XHTMLRenderer是一个非常重要的工具,它可以将XML和HTML文件转换为PDF格式,为企业级应用提供了便利的文档输出功能。
接下来,我将带你深入了解Java XHTMLRenderer的使用指南。
在本指南中,我们将按照从简到繁、由浅入深的方式,来帮助你更好地理解和应用Java XHTMLRenderer。
1. 什么是Java XHTMLRenderer?Java XHTMLRenderer是一个用于将XML和HTML文件转换为PDF 格式的开源工具库。
它基于Java语言和iText库,可以在Java应用中方便地实现将动态生成的HTML内容转换为PDF文件的功能。
使用Java XHTMLRenderer,开发人员可以轻松地创建高质量的PDF文档,为企业级应用的文档输出提供了便利和灵活性。
2. 如何使用Java XHTMLRenderer?在使用Java XHTMLRenderer之前,首先需要导入相应的依赖库,包括XHTMLRenderer和iText。
可以通过几行简单的代码来实现将HTML内容转换为PDF文件的功能。
以下是一个简单的示例代码:```javaString htmlContent = "<html><body><h1>Hello,World!</h1></body></html>";String outputFile = "output.pdf";OutputStream os = new FileOutputStream(outputFile); ITextRenderer renderer = new ITextRenderer();renderer.setDocumentFromString(htmlContent);yout();renderer.createPDF(os);os.close();```通过上述代码,我们可以将一个简单的HTML内容转换为PDF文件。
freemarker html转pdf 循环表格
freemarker html转pdf 循环表格FreeMarker 是一个用于生成文本输出(例如HTML、XML、JSON 等)的模板引擎。
要将HTML 转换为PDF 并在其中包含循环表格,你可以使用FreeMarker 生成HTML 模板,然后使用PDF 生成库(例如iText、Apache PDFBox)将其转换为PDF。
下面是一个简单的示例,演示了如何使用FreeMarker 和iText 创建一个包含循环表格的HTML 模板并将其转换为PDF:1. 导入依赖库:请确保你的项目中包含FreeMarker 和iText 的依赖库。
```xml<!-- FreeMarker --><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.31</version></dependency><!-- iText --><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13</version></dependency>```2. 创建FreeMarker 模板文件(template.ftl):```html<!DOCTYPE html><html><head><title>PDF Generation with FreeMarker</title></head><body><h1>Table Example</h1><table border="1"><thead><tr><th>Header 1</th><th>Header 2</th><th>Header 3</th></tr></thead><tbody><#list data as row><tr><td>${row.column1}</td><td>${row.column2}</td><td>${row.column3}</td></tr></#list></tbody></table></body></html>```3. 创建Java 代码:```javaimport freemarker.template.Configuration;import freemarker.template.Template;import freemarker.template.TemplateException;import java.io.*;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import com.itextpdf.text.Document;import com.itextpdf.text.DocumentException;import com.itextpdf.text.pdf.PdfWriter;public class HtmlToPdf {public static void main(String[] args) {try {// Load FreeMarker configurationConfiguration cfg = new Configuration(Configuration.VERSION_2_3_31);cfg.setClassForTemplateLoading(HtmlToPdf.class, "/"); // Set the template file path// Load the FreeMarker templateTemplate template = cfg.getTemplate("template.ftl");// Create data for the templateList<Map<String, String>> data = new ArrayList<>();Map<String, String> row1 = new HashMap<>();row1.put("column1", "Value 1-1");row1.put("column2", "Value 1-2");row1.put("column3", "Value 1-3");data.add(row1);Map<String, String> row2 = new HashMap<>();row2.put("column1", "Value 2-1");row2.put("column2", "Value 2-2");row2.put("column3", "Value 2-3");data.add(row2);// Create a PDF documentDocument document = new Document();PdfWriter.getInstance(document, new FileOutputStream("output.pdf"));document.open();// Process the FreeMarker template and write HTML content to the PDF documentStringWriter stringWriter = new StringWriter();template.process(createDataModel(data), stringWriter);document.add(newcom.itextpdf.text.html.simpleparser.HTMLWorker(document).parse(newStringReader(stringWriter.toString())));// Close the documentdocument.close();System.out.println("PDF generated successfully.");} catch (IOException | DocumentException | TemplateException e) {e.printStackTrace();}}private static Map<String, Object> createDataModel(List<Map<String, String>> data) { Map<String, Object> root = new HashMap<>();root.put("data", data);return root;}}```这个例子中,`template.ftl` 文件包含了一个简单的HTML模板,其中包含一个表格,通过FreeMarker 的`#list` 指令循环输出数据。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、IText实现html2pdf,速度快,纠错能力差,支持中文(要求HTML使用unicode编码),但中支持一种中文字体,开源。
2、Flying Sauser实现html2pdf,纠错能力差,支持多种中文字体(部分样式不能识别),开源。
3、PD4ML实现html2pdf,速度快,纠错能力强,支持多种中文字体,商业。
(一)IText官网:/测试案例:TestIText.java依赖jar包:iText-2.0.8.jar、iTextAsian.jar(支持中文)下面只是一个小的测试案例,如果项目中使用到了该组件可以参考API完成项目组中相应的功能![c-sharp]view plaincopyprint?1.import java.io.FileOutputStream;2.import java.io.FileReader;3.import java.util.ArrayList;4.import com.lowagie.text.Document;5.import com.lowagie.text.Element;6.import com.lowagie.text.Font;7.import com.lowagie.text.PageSize;8.import com.lowagie.text.Paragraph;9.import com.lowagie.text.html.simpleparser.HTMLWorker;10.importcom.lowagie.text.html.simpleparser.StyleSheet;11.import com.lowagie.text.pdf.BaseFont;12.import com.lowagie.text.pdf.PdfWriter;13.public class TestIText{14.public static void main(String[] args) {15.TestIText ih = new TestIText();16.ih.htmlCodeComeFromFile("D://Test//iText.html","D://Test//iText_1.pdf");17.ih.htmlCodeComeString("Hello中文","D://Test//iText_2.pdf");18.}19.20.public void htmlCodeComeFromFile(String filePath,String pdfPath) {21.Document document = new Document();22.try {23.StyleSheet st = new StyleSheet();24.st.loadTagStyle("body", "leading", "16,0");25.PdfWriter.getInstance(document, newFileOutputStream(pdfPath));26.document.open();27.ArrayList p = HTMLWorker.parseToList(newFileReader(filePath), st);28.for(int k = 0; k < p.size(); ++k) {29.document.add((Element)p.get(k));30.}31.document.close();32.System.out.println("文档创建成功");33.}catch(Exception e) {34. e.printStackTrace();35.}36.}37.38.public void htmlCodeComeString(String htmlCode,String pdfPath) {39.Document doc = new Document(PageSize.A4);40.try {41.PdfWriter.getInstance(doc, newFileOutputStream(pdfPath));42.doc.open();43.// 解决中文问题44.BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);45.Font FontChinese = new Font(bfChinese, 12,Font.NORMAL);46.Paragraph t = new Paragraph(htmlCode, FontChinese);47.doc.add(t);48.doc.close();49.System.out.println("文档创建成功");50.}catch(Exception e) {51. e.printStackTrace();52.}53.}54.}1.import java.io.File;2.import java.io.FileOutputStream;3.import java.io.OutputStream;4.5.import org.xhtmlrenderer.pdf.ITextFontResolver;6.import org.xhtmlrenderer.pdf.ITextRenderer;7.8.import com.lowagie.text.pdf.BaseFont;9.10.public class TestFlyingSauser {11.public static void main(String[] args) throwsException {12.demo_1();13.demo_2();14.}15.16.// 不支持中文17.public static void demo_1() throws Exception {18.String inputFile = "D:/Test/flying.html";19.String url = newFile(inputFile).toURI().toURL().toString();20.String outputFile = "D:/Test/flying.pdf";21.OutputStream os = new FileOutputStream(outputFile);22.ITextRenderer renderer = new ITextRenderer();23.renderer.setDocument(url);yout();25.renderer.createPDF(os);26.os.close();27.}28.29.// 支持中文30.public static void demo_2() throws Exception {31.String outputFile = "D:/Test/demo_3.pdf";32.OutputStream os = new FileOutputStream(outputFile);33.ITextRenderer renderer = new ITextRenderer();34.ITextFontResolver fontResolver =renderer.getFontResolver();35.fontResolver.addFont("C:/Windows/fonts/simsun.ttc",BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);36.StringBuffer html = new StringBuffer();37.// DOCTYPE 必需写否则类似于这样的字符解析会出现错误38.html.append("<!DOCTYPE html PUBLIC /"-//W3C//DTDXHTML 1.0 Transitional//EN/"/"/TR/xhtml1/DTD/xhtml1-transitional.dtd/">");39.html.append("<htmlxmlns=/"/1999/xhtml/">").append("<head>")40..append("<meta http-equiv=/"Content-Type/"content=/"text/html; charset=UTF-8/" />")41..append("<mce:style type=/"text/css/"><!--42.body {font-family: SimSun;}43.--></mce:style><style type=/"text/css/"mce_bogus="1">body {font-family: SimSun;}</style>")44..append("</head>")45..append("<body>");46.html.append("<div>支持中文!</div>");47.html.append("</body></html>");48.renderer.setDocumentFromString(html.toString());49.// 解决图片的相对路径问题50.//renderer.getSharedContext().setBaseURL("file:/F:/teste /html/");yout();52.renderer.createPDF(os);53.os.close();54.}55.}/sns/space.php?uid=4&do=blog&id=582关于Flying Sauser的一篇非常不错的文章:/pub/a/today/2007/06/26/generating-pdfs-with-flying-saucer-and-itext.html(三)PD4ML官网下载:/downloads.htm依赖jar包:pd4ml_demo.jar、pd4ml__css2.jar、fonts.jar下面只是一个小的测试案例,如果项目中使用到了该组件可以参考API完成项目组中相应的功能![java]view plaincopyprint?1.import java.awt.Insets;2.import java.io.File;3.import java.io.FileOutputStream;4.import java.io.StringReader;5.6.import org.zefer.pd4ml.PD4Constants;7.import org.zefer.pd4ml.PD4ML;8.9.public class Converter {10.public static void main(String[] args) throwsException {11.Converter converter = new Converter();12.converter.generatePDF_2(newFile("D:/Test/demo_ch_pd4ml_a.pdf"), "D:/Test/a.htm");13.File pdfFile = newFile("D:/Test/demo_ch_pd4ml.pdf");14.StringBuffer html = new StringBuffer();15.html.append("<html>")16..append("<head>")17..append("<meta http-equiv=/"Content-Type/"content=/"text/html; charset=UTF-8/" />")18..append("</head>")19..append("<body>")20..append("<font face=/"KaiTi_GB2312/">")21..append("<font color='red' size=22>显示中文</font>")22..append("</font>")23..append("</body></html>");24.StringReader strReader = newStringReader(html.toString());25.converter.generatePDF_1(pdfFile, strReader);26.}27.// 手动构造HTML代码28.public void generatePDF_1(File outputPDFFile,StringReader strReader) throws Exception {29.FileOutputStream fos = newFileOutputStream(outputPDFFile);30.PD4ML pd4ml = new PD4ML();31.pd4ml.setPageInsets(new Insets(20, 10, 10, 10));32.pd4ml.setHtmlWidth(950);33.pd4ml.setPageSize(pd4ml.changePageOrientation(PD4Constants.A4));eTTF("java:fonts", true);35.pd4ml.setDefaultTTFs("KaiTi_GB2312", "KaiTi_GB2312","KaiTi_GB2312");36.pd4ml.enableDebugInfo();37.pd4ml.render(strReader, fos);38.}39.40.// HTML代码来自于HTML文件41.public void generatePDF_2(File outputPDFFile,String inputHTMLFileName) throws Exception {42.FileOutputStream fos = newFileOutputStream(outputPDFFile);43.PD4ML pd4ml = new PD4ML();44.pd4ml.setPageInsets(new Insets(20, 10, 10, 10));45.pd4ml.setHtmlWidth(950);46.pd4ml.setPageSize(pd4ml.changePageOrientation(PD4Constants.A4));eTTF("java:fonts", true);48.pd4ml.setDefaultTTFs("KaiTi_GB2312", "KaiTi_GB2312","KaiTi_GB2312");49.pd4ml.enableDebugInfo();50.pd4ml.render("file:" + inputHTMLFileName, fos);51.}52.}。