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生成图片”的核心知识点: 1. **PDF处理库**:在Java中,我们可以使用第三方库如Apache PDFBox、iText和PDF Clown等来处理PDF文档。这些库提供了丰富的API,用于读取、解析和操作PDF文件...
综上所述,生成PDF417条码涉及多个步骤和技术,包括选择和使用合适的Java库、理解数据编码、生成条码图像,以及遵循特定行业的使用规范。通过学习和实践,开发者可以熟练掌握这一技能,将其应用于各种业务场景。
本项目提供了一个纯Java实现的解决方案,它能有效地完成多个PDF文件的合并,并且支持自定义目录的生成以及页码的添加。 首先,`PDFUtil.java`是这个项目的核心类,它包含了处理PDF的关键方法。PDFUtil可能包含了...
**iText PDF生成方案** iText是一个开源的Java库,专门用于创建和修改PDF文档。在IT领域,尤其是在文档处理和报告生成方面,iText是一个非常实用的工具。本方案将详细探讨如何利用iText来生成PDF文件,以及相关的...
JavaPDF文件生成是Java开发中一个重要的领域,主要用于创建、编辑和处理PDF文档。iTextPDF是一个流行的开源库,它提供了丰富的API,使得在Java环境中生成高质量的PDF文档变得简单易行。本篇文章将深入探讨如何使用...
1. **iText库**:Java中最常用的PDF生成库之一是iText。它允许开发者通过简单的API来创建、修改和操作PDF文档。iText提供了丰富的功能,包括文本、图像、表格、链接、注释等的插入,以及数字签名和安全功能。 2. **...
Java包提供的功能是生成PDF417条码,这对于需要在应用程序中集成条码生成能力的开发者来说非常有用。 此Java包包含了反编译和原始文件,这表明它可能是一个开源项目,允许用户查看和修改源代码以适应特定需求。反...
PDF生成通常涉及以下关键技术点: 1. **iText库**:描述中的"itext-1.3.1.jar"是一个早期版本的iText库,这是一个广泛使用的Java库,专门用于处理PDF文档。iText允许开发者创建、修改、解析和合并PDF文件。它提供了...
Java是一种广泛使用的编程语言,尤其在企业级应用和服务器端开发中占据主导地位。本文将深入探讨如何使用Java...不过,实际开发中还需要考虑错误处理、模板的复杂性、性能优化等因素,以提供稳定、高效的PDF生成服务。
在Java编程环境中,将图片转换为PDF文档是一项常见的任务,特别是在报告、文档制作或数据可视化中。本教程将深入探讨如何使用...通过熟练掌握这些基础知识,你将能够构建出更复杂的PDF生成解决方案,满足各种业务需求。
### 动态生成PDF文档的Java实现 #### 概述 PDF(Portable Document Format)是Adobe公司公布的一种用于全球电子文档...无论是哪种方案,Java语言都提供了强大的工具和支持,帮助开发者高效实现PDF文档的动态生成。
在Java开发中,生成PDF文档...这个“java生成PDF工具代码”应该包含了以上所述的一些解决方案,特别是针对中文换行的定制代码。如果你正在面临同样的问题,通过研究和理解这些代码,你将能够为你的项目实现相同的功能。
JAVA动态生成Word和PDF是JAVA开发中的一种常见需求,这里将详细介绍JAVA动态生成Word和PDF的几种方案。 生成Word 1. Jacob方案:Jacob是Java-COM Bridge的缩写,在Java与微软的COM组件之间构建了一座桥梁。使用...
这里提到的“java生成pdf需要的包(支持中文,表格换行亲测)”是一个解决方案,它整合了几个关键的库:FreeMarker、Flying Saucer和iText。 1. **FreeMarker**: FreeMarker是一个基于模板的Java模板引擎,常用于...
总而言之,Java结合iText库可以实现一套完整的PDF处理方案,包括电子签字、盖章、防伪二维码、水印和文件加密,为PDF的安全使用提供了强大的支持。在实际项目中,这些功能可以根据业务需求进行灵活组合和定制,以...
两者结合使用,可以构建一个完整的HTML到PDF生成流程。 项目中的"src"目录很可能包含了源代码示例,展示了如何使用Flyingsaucer和iText进行转换操作。"lib"目录应该存放了Flyingsaucer和iText的jar文件,这些都是...
JAVA作为后端开发的主要语言,提供了多种生成PDF报表的解决方案,其中iText是一个备受推崇的开源组件。 **iText简介** iText是sourceforge.net上的一个开源项目,专门用于生成PDF文档。它不仅能够创建PDF或rtf文档...
这意味着在转换过程中,如果原始PDF含有这些元素,它们将不会出现在生成的图像中。若要处理这种情况,可能需要寻找其他解决方案,如使用支持这类元素的第三方库,或者在转换后手动添加水印和图章。 后端代码通常会...