Jasper Report
采用的最多的方案,是Jasper Report。相关的文档也很多,不过很杂,需要完全掌握,我认为还是有些坡度和时间的。这个时间和坡度我认为主要来自于对iReport这个IDE的反复尝试,对里面的每个属性的摸索。
Jasper Report的设计思路,本身是不违反我上面所说的初衷的。因为我们的努力方向是先生成模板,然后得到数据,最后将两者整合得到结果。但是Jasper Report的问题在于,其生成模板的方式过于复杂,即使有IDE的帮助,我们还是需要对其中的众多规则有所了解才行,否则就会给调试带来极大的麻烦。
所以,我认为Jasper Report是一个半调子方案,这种强依赖于IDE进行可视化编辑的方式令我很不爽。同时,由此带来的诸多的限制,相信也让很多使用者颇为头疼。在经历了一番痛苦的挣扎后,决定放弃使用这种方案。
iText
其实Jasper Report是基于iText的。于是有的人会说,那么直接使用iText不是一种倒退么?的确,直接使用iText似乎就需要直接使用原生的API进行编程了。不过幸好iText其实提供了一些方便的API,通过使用这些API,我们可以直接将HTML代码转化成iText可识别的Document对象,从而导出PDF文档。
java 代码
- import java.io.FileOutputStream;
- import java.io.FileReader;
- import java.util.ArrayList;
- import com.lowagie.text.Document;
- import com.lowagie.text.Element;
- import com.lowagie.text.html.simpleparser.HTMLWorker;
- import com.lowagie.text.html.simpleparser.StyleSheet;
- import com.lowagie.text.pdf.PdfWriter;
- public class MainClass {
- public static void main(String[] args) throws Exception {
- Document document = new Document();
- StyleSheet st = new StyleSheet();
- st.loadTagStyle("body", "leading", "16,0");
- PdfWriter.getInstance(document, new FileOutputStream("html2.pdf"));
- document.open();
- ArrayList p = HTMLWorker.parseToList(new FileReader("example.html"), st);
- for (int k = 0; k < p.size(); ++k)
- document.add((Element) p.get(k));
- document.close();
- }
- }
这是从网上找到的一个例子。从代码中,我们可以看到,iText本身提供了一个简单的HTML的解析器,它可以把HTML转化成我们需要的PDF的document。
有了这个东西,基本上我的目标就能达成一大半了。接下来我的任务就是根据实际情况去编写HTML代码,然后扔进这个方法,就OK了。而真正的HTML代码,我们则可以在这里使用真正的模板技术,Freemarker或者Velocity去生成我们所需要的内容。当然,这已经是我们熟门熟路的东西了。
正当我觉得这个方案基本能符合我的要求的时候,我也同样找到了它的很多弱项:
1. 无法识别很多HTML的tag和attribute(应该是iText的HTMLParser不够强大)
2. 无法识别CSS
如果说第一点我还可以勉强接受的话,那么第二点我就完全不能接受了。无法识别简单的CSS,就意味着HTML失去了最基本的活力,也无法根据实际要求调整样式。
所以这种方案也必然无法成为我的方案。
flying sauser
在这种情况下,我几乎已经燃起了自己编写一个支持CSS解析的HTML Parser的想法。幸好,在一个非常偶然的情况下,我在google中搜到了这样一个开源项目,它能够满足我的一切需求。这就是flying sauser,项目主页是:https://xhtmlrenderer.dev.java.net/
项目的首页非常吸引人:An XML/XHTML/CSS 2.1 Renderer。这不正是我要的东西么?
仔细再看里面的文档:
完美了。这东西能解析HTML和CSS,而且能输出成image,PDF等格式。哇!我们来看看sample代码(代码丑陋,不过已经能说明问题了):
- /*
- * ITextRendererTest.java *
- * Copyright 2009 Shanghai TuDou.
- * All rights reserved.
- */
- package itext;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.OutputStream;
- import org.xhtmlrenderer.pdf.ITextFontResolver;
- import org.xhtmlrenderer.pdf.ITextRenderer;
- import com.lowagie.text.pdf.BaseFont;
- /**
- * TODO class description *
- *
- * @author pcwang
- *
- * @version 1.0, 上午11:03:26 create $Id$
- */
- public class ITextRendererTest {
- public static void main(String[] args) throws Exception {
- String inputFile = "conf/template/test.html";
- String url = new File(inputFile).toURI().toURL().toString();
- String outputFile = "firstdoc.pdf";
- OutputStream os = new FileOutputStream(outputFile);
- ITextRenderer renderer = new ITextRenderer();
- renderer.setDocument(url);
- // 解决中文支持问题
- ITextFontResolver fontResolver = renderer.getFontResolver();
- fontResolver.addFont("C:/Windows/Fonts/arialuni.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
- // 解决图片的相对路径问题
- renderer.getSharedContext().setBaseURL("file:/D:/Work/Demo2do/Yoda/branch/Yoda%20-%20All/conf/template/");
- renderer.layout();
- renderer.createPDF(os);
- os.close();
- }
- }
有了这个东西,我们就可以将PDF的生成流程变成这样:
1) 编写Freemarker或者Velocity模板,打造HTML,勾画PDF的样式(请任意使用CSS)
2) 在你的业务逻辑层引入Freemarker的引擎或者Velocity的引擎,并将业务逻辑层中可以获取的数据和模板,使用引擎生成最终的内容
3) 将我上面的sample代码做简单封装后,调用,生成PDF
这样,我想作为一个web程序员来说,上面的3点,都不会成为你的绊脚石。你可以轻松驾驭PDF了。
在Flying Saucer的官方文档中,有一些Q&A,可以解决读者们大部分的问题。包括PDF的字体、PDF的格式、Image如何处理等等。大家可以尝试着去阅读。
相关推荐
基于Java的测试文档自动生成方案.pdf
java html生成pdf的解决方案,包括常见错误的处理,如中文问题、css路径、图片,内有测试例子等。是java中pdf方案的好帮手哦
该代码提供了word、excel、pdf三种类型的文档生成方案,其中word文档使用“freemarker + xml + 模板”技术;excel使用“POI + 模板”技术;pdf使用“freemarker + itext + flying saucer”技术
历经一个月总结使用java实现pdf文件的电子签字+盖章+防伪二维码+水印+PDF文件加密的全套解决方案
Java完美生成的解决方案[参考].pdf
使用java生成动态数据的pdf文件 页尾有截图,一目了然 方案优点 纯vue编写,避免繁杂且不直观的java api操作,java只做转换和提供数据源,不参与pdf中渲染逻辑控制 使用vue进行数据映射和页面渲染,符合目前主流前端...
Java使用Spire讲网页保存为PDF并去除Evaluation Warning水印方案,https://blog.csdn.net/kewen_123/article/details/121025630
首先,当然是找到能够解析PDF的完美组件,百度和谷歌不约而同的告诉我们。IText是王道。...那我要做的是能完美解析HTML+CSS的PDF生成工具。这时候flying-saucer进入了我的选择范围中。 http://cod
最近开发时需要用swagger生成文档,经多次测试,形成了一个完整的生成方案,供大家参考。可以在生成的文档中处定义章节。完整调试,保证可用。 工程后,操作步聚如下: 1、修改生成最终文档的索引文件index.adoc,...
能稳定运行,windows 平台,ActiveXComponent技术
基于作者本人的项目经验总结的ZPL基础以及和Java web项目的集成,其中涉及到了ZPL翻页、zpl代码生成、zpl打印机调用等开发遇到的问题和解决方案,对于Java开发者或是ZPL基础开发人员来说,是很好的入门教程。
Aspose.Total是Aspose公司旗下的最全的一套office文档管理方案,主要提供.net跟java两个开发语言的控件套包,通过它,我们可以有计划地操纵一些商业中最流行的文件格式:Word, Excel, PowerPoint, Project,等office...
Java生成条形码的方案 -- barcode4j、zxing barcode4j开源Java条形码生成库。支持多种编码格式,比如:code-39,code-128等 http://barcode4j.sourceforge.net/ zxing是由google开源的1D/2D编解码类库。目标是能够对...
对企业合同word模版,可通过java 程序实现生成word文件,然后再通过word转成pdf实现。本实例的方案,可实现模版到word文件的转换。附件有代码和效果图。
java实现根据html生成pdf,提供项目中生成合同方案。共勉~~~
用于将pdf文件生成其缩略图以供显示时使用,很实用的类似于百度文库中的文档里列表的图片一样
展示了如何将两者结合起来构建动态生成内容的WEB站点,如何编写具有更低开销的信息共享和数据交换的企业级软件,以及如何对需要可移植数据的其他问题开发简单和高效的解决方案。本书第二版还包括SAX和DOM的高级知识...
方案优点 1.纯html编写,避免繁杂且不直观的java api操作,java只做转换和提供数据源,不参与pdf中渲染逻辑控制 2.使用vue进行数据映射和页面渲染,符合前端开发思路,前后分离
java实现pdf转word。纯免费开源。pdf解析完会生成word文件和图片文件夹。无页码限制,文本类型生成到word中,图片生成到图片文件夹中。 弊端:需手动将图片与文本整合成一个word文件。 仅提供一个pdf转word的实现...