忙,每天都在忙,几乎没有时间写代码,每天在各种文档中打开来打开去
,快疯了,真想找个时间能静静坐在哪儿,什么都不想,休息会。。。。。
闲言少叙,下个项目要用到写pdf文件,在项目还没开始之前,终于有一周的时间再开始学习点技术了。查阅了网上的资料,感觉itext还不错,又上itext官网(http://itextpdf.com/),现在版本好像是5.0,试用了下,与之前版本好像没有太多的区别,但包名换了,版本稳定与否也不清楚,最后决定用了个以前的版本IText2.1.7(奇怪,好像从这个版本直接上升到了5)
写pdf模板其实很简单,每个pdf模板文件中都要先定义许多文字域,有个名称(name),用itext直接写就行了,网上查了下,都是直接写pdf文件,且名字都写死到代码中了,感觉有麻烦,下面是自己写的方法,简单封装了下,不知道是否好用(还没试用),先写下来,供大家参考,来拍拍砖!
首先要定义一个DataBean接口,代码如下:
/**
* 数据bean,向单元格传递的数据将按继承此类
* @author lilj
*
*/
public interface DataBean {
}
不会吧?没有内容?
是的,没有内容,这是基础:),以后你的数据bean要继承这个bean。比如说你有一个pdf模板文件,假设要一个字段xm,代码如下:
public class DataBeanImpl implements DataBean
{
private String xm;
public String getXm() {
return xm;
}
public void setXm(String xm) {
this.xm = xm;
}
}
这样不可以了,也就是说这个bean要与pdf模板中的要写的数据一致。
下面就要进行pdf处理了,第一个方法是根据一个模板文件及databean生成一个pdf文件,代码如下:
/**
* 根据一个databean,处理一个pdf文件,
* @param templatefile //模板文件路径
* @param destfile //目标文件路径
* @param databean //数据接口的实现
* @return
* @throws IOException
* @throws DocumentException
*/
public void getPdfFile(String templatefile,String destfile,DataBean databean) throws IOException, DocumentException
{
String TemplatePDF=templatefile;
PdfReader reader = new PdfReader(TemplatePDF);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(destfile));
AcroFields form = stamper.getAcroFields();
DataBean db = databean;
List<String> fieldnames = this.getFieldName(db);
for(int i=0;i<fieldnames.size();i++)
{
String tmpname = fieldnames.get(i);
String value = this.getFieldValue(tmpname, db);
form.setField(tmpname, value);
}
stamper.setFormFlattening(true);
stamper.close();
}
这个方法中用到两个方法,一个是getfieldname,另一个是getfieldvale分别是取databean实现的名字与值,代码如下:
/**
* 根据数据bean得到pdf中要写入的textfield的名字
* @param db
* @return
*/
private List<String> getFieldName(DataBean db)
{
List<String> fieldnames = new ArrayList<String>();
Field[] fields = db.getClass().getDeclaredFields();
for(int i=0;i<fields.length;i++)
{
String tmpname = fields[i].getName();
fieldnames.add(tmpname);
}
return fieldnames;
}
getfieldvalue方法如下:
private String getFieldValue(String fieldname,DataBean db)
{
String value="";
Method[] methods = db.getClass().getDeclaredMethods();
for(int i=0;i<methods.length;i++)
{
String methodname = methods[i].getName();
if (methodname.substring(0,3).toUpperCase().equals("GET") && methodname.substring(3).toUpperCase().equals(fieldname.toUpperCase()))
{
Method method = methods[i];
try {
value = (String)method.invoke(db,new Object[] {});
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return value;
}
好了,主要的方法就是这些了,其实很简单,就和用到了反射,这样,根据每个pdf模板,我只要去实现databean就行了,然后向bean赋值,也可以从数据库中直接取,调用getpdffile方法就可以生成pdf文件了。
按说程序写到这应该就行,但要是有多页呢,应该如何处理呢?于是就又写了个方法
/**
* 根据一组databean,生成一个pdf
* 生成方法,是将多个pdf合并
* @param templatefile
* @param destfile
* @param databean
* @return
* @throws IOException
* @throws DocumentException
*/
public void getPdfFile(String templatefile,String destpath,String destfilename,List<DataBean> databean) throws IOException, DocumentException
{
String filename=destpath+"/"+destfilename;
Document document = new Document();
PdfCopy copy = new PdfCopy(document, new FileOutputStream(filename));
document.open();
for (int i=0;i<databean.size();i++)
{
String tmppdffile = destpath+"/tmp_"+destfilename;
this.getPdfFile(templatefile,tmppdffile,databean.get(i));
PdfReader reader = new PdfReader(tmppdffile);
int n = reader.getNumberOfPages();
for(int j=1; j<=n; j++)
{
document.newPage();
PdfImportedPage page = copy.getImportedPage(reader, j);
copy.addPage(page);
}
}
//删除临时文件
File file =new File(destpath+"/tmp_"+destfilename);
if (file.exists())
file.delete();
document.close();
}
调用的时候调用这个就行了,如果只有一页,就在list中只放一个databean就行了。
如何调用就简单了,大家应该都会,就不写了。需要的话可以留言!
本程序在itext2.1.7上测试通过,中文问题引用itextasian.jar即可
分享到:
相关推荐
ITEXT是一个流行的Java库,主要用于创建和操作PDF文档。然而,通过一些巧妙的技巧,它也可以用来生成Excel文件。在本篇文章中,我们将深入探讨如何使用ITEXT来创建Excel工具类,以便在Java应用程序中方便地导出数据...
开发者可能通过创建一个`PaperWriter`类,封装了试卷生成的逻辑,包括读取试题数据(可能是从数据库、CSV文件或XML文件中获取),然后使用iText将这些数据转换为PDF格式。`PaperWriter`可能包含了一系列方法,如`...
EasyPDFUtil支持这一功能,允许开发者传入一个包含键值对的Map对象,键代表PDF模板上的域名,值是填充的内容。调用相应方法后,工具类会自动找到对应域并填充内容,然后生成一个新的PDF文件。这种方法在批量处理类似...
5. **生成PDF**:使用Freemarker的`process`方法将模板和数据模型结合,然后通过一个PDF库(如iText或Apache PDFBox)将结果转换为PDF。以下是一个使用iText的例子: ```java StringWriter writer = new ...
Java根据模板动态生成PDF是一种常见的需求,特别是在需要生成可配置报告或者数据分析文档的场景下。本文将介绍如何利用iText、FreeMarker和JFreeChart这三个库来实现这一功能。 首先,iText是一个强大的PDF处理库,...
在实际应用中,开发者通常会创建一个自定义的`PdfGenerator`类,封装上述操作,以便在不同场景下重用代码。 总之,"基于Java的用iText类库制作PDF文档.zip"这个资源包旨在帮助Java开发者掌握如何利用iText高效地...
重点将集中在IText库的使用,CSS样式应用,字体处理,以及PDF文件的生成。 首先,HTML到PDF的转换是一个常见的需求,特别是在需要将网页或者基于HTML的内容转换为高质量PDF文档的场景中。Java平台下,实现HTML到PDF...
在编程中,封装PDF报表通常包括以下几个步骤: 1. **数据准备**:数据是报表的基础,可以从数据库、CSV文件、Excel工作表或其他数据源获取。需要对数据进行处理,例如计算、筛选、排序等,以便呈现有意义的信息。 ...
通过阅读和运行这些代码,你可以更深入地了解如何在实际项目中应用iText生成PDF。 总结起来,iText是Java生成PDF的强大工具,通过学习和实践,开发者可以轻松创建复杂的PDF文档。在实际开发中,结合配置文件和详细...
在你提供的信息中,“基于poi封装的word-excel-Pdf导出的xdoc设计”是一个使用Apache POI进行文件处理的项目,它包含了将数据导出到Word、Excel和PDF格式的功能。 1. **Apache POI**: Apache POI 是一套用于处理...
在处理多个PDF文件时,可以将上述代码封装成一个函数,传入PDF文件路径和水印参数,然后批量调用该函数。 在实际应用中,你可能需要根据需求调整水印的位置、角度、大小以及字体样式。例如,你可以通过调整`...
5. **Java工具类**:提供的工具类可能是封装了Aspose.Words功能的类,包含了一些静态方法,例如创建Word文档、填充模板、转换为PDF等。这样的工具类使得开发者可以更方便地调用Aspose的功能,而无需深入理解底层API...
在实际应用中,为了提高效率和灵活性,通常会将这些步骤封装到一个服务类中,提供接口供其他业务调用。例如,可以创建一个`ContractGenerator`类,包含`generateContract()`方法,接收模板路径、替换数据和输出文件...
1. **iText库**:iText是一款流行的开源Java库,专门用于创建和修改PDF文件。你可以使用它来构建自定义工具类,通过API调用来实现PDF的生成。例如,可以创建一个名为`PdfExporter`的工具类,其中包含`exportToPdf()`...
在本案例中,提供的"poiWord-合同模板生成"资源是一个Java库,它封装了生成Word文档的功能,使得开发者能够便捷地创建和编辑合同。 1. **Apache POI库**: 这个资源可能基于Apache POI项目,这是一个开源的Java API...
1. 创建FreeMarker的`Configuration`,加载PDF模板。 2. 准备数据模型。 3. 使用`Template`对象和数据模型生成PDF内容。 4. 对于iText,创建`Document`对象,使用`PdfWriter`将内容写入;对于OpenPDF,创建`Document...
- 利用PDF模板填写数据域:对于预设格式的PDF报表模板,可以利用iText技术填充已存在的模板文件,从而快速生成含有具体数据的报表。 3. iText编程生成PDF文档的步骤: - 首先,创建一个Document对象,该对象是PDF...
FreemarkerToPDF是一个强大的Java库,用于将Freemarker模板转换为PDF文档。这个工具类集合包含了多种处理Freemarker模板和生成PDF的功能,旨在简化开发者的工作流程,特别是那些在Web开发中需要动态生成PDF的场景。...
- Java处理PDF文档:Apache PDFBox、iText等库用于读取、创建、修改PDF文件。 - PDF文档结构:PDF是一种页面描述语言,包含文本、图像、形状等元素。 - Java与PDF交互:如何使用API解析PDF内容,进行搜索、提取...
- **本实验对数据库连接的封装**:为了简化数据库连接的过程,提高代码的可重用性,通常会编写一个数据库连接管理类,对JDBC进行封装,提供简单的接口供应用程序调用。 #### 五、实验环境 - **实验环境**:本研究...