`
javajack
  • 浏览: 22095 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Itext应用封装(一)__写pdf模板

阅读更多

 忙,每天都在忙,几乎没有时间写代码,每天在各种文档中打开来打开去

,快疯了,真想找个时间能静静坐在哪儿,什么都不想,休息会。。。。。

 

      闲言少叙,下个项目要用到写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即可

分享到:
评论
5 楼 flyfeifei66 2011-08-30  
牛人啊,学习了
4 楼 javajack 2011-01-13  
java_base 写道
您好,想问一下,如果我想做一个模板,模板里有两个区域,区域里可以放图片,表格,文本。想每次生成pdf文档直接调用这个模板。
这样的区域如何定义呢?
又如何获得区域的名称呢?
我用的是在一个page里创建规定区域的三个template,但调用模板时得不到每个template的名称,没办法向里面添加东西。
先谢谢了!

目前没做更深入研究,目前的实现是通过动态生成pdf实现的。
3 楼 java_base 2010-11-15  
您好,想问一下,如果我想做一个模板,模板里有两个区域,区域里可以放图片,表格,文本。想每次生成pdf文档直接调用这个模板。
这样的区域如何定义呢?
又如何获得区域的名称呢?
我用的是在一个page里创建规定区域的三个template,但调用模板时得不到每个template的名称,没办法向里面添加东西。
先谢谢了!
2 楼 javajack 2010-10-29  
wgcniler 写道
你好,我根据你的方法根据模板来新创pdf文件,但是为什么那些域写不进内容呢?我的代码如下:
String TemplatePDF="d:/test/test_CA_d3.pdf"; 
PdfReader reader = new PdfReader(TemplatePDF); 
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("d:/test/test_222.pdf")); 
AcroFields form = stamper.getAcroFields();
form.setField("pName", "CHUSHAN");
form.setField("cDClass", "M");
form.setField("cBflight", "CA1860");
form.setField("rTfrom", "LIUZHOU");
stamper.setFormFlattening(true);
stamper.close();


一般情况下,写不进去数据,有两个原因
1、数据bean没有数据
2、pdf模板中的字段名应该与数据bean中的名一致,记住是区分大小写的
1 楼 wgcniler 2010-09-25  
你好,我根据你的方法根据模板来新创pdf文件,但是为什么那些域写不进内容呢?我的代码如下:
String TemplatePDF="d:/test/test_CA_d3.pdf"; 
PdfReader reader = new PdfReader(TemplatePDF); 
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("d:/test/test_222.pdf")); 
AcroFields form = stamper.getAcroFields();
form.setField("pName", "CHUSHAN");
form.setField("cDClass", "M");
form.setField("cBflight", "CA1860");
form.setField("rTfrom", "LIUZHOU");
stamper.setFormFlattening(true);
stamper.close();

相关推荐

    使用ITEXT导出EXCEL工具类

    ITEXT是一个流行的Java库,主要用于创建和操作PDF文档。然而,通过一些巧妙的技巧,它也可以用来生成Excel文件。在本篇文章中,我们将深入探讨如何使用ITEXT来创建Excel工具类,以便在Java应用程序中方便地导出数据...

    JAVA ITEXT 导出试卷

    开发者可能通过创建一个`PaperWriter`类,封装了试卷生成的逻辑,包括读取试题数据(可能是从数据库、CSV文件或XML文件中获取),然后使用iText将这些数据转换为PDF格式。`PaperWriter`可能包含了一系列方法,如`...

    java一键pdf转图片及pdf域填充,封装好的工具类

    EasyPDFUtil支持这一功能,允许开发者传入一个包含键值对的Map对象,键代表PDF模板上的域名,值是填充的内容。调用相应方法后,工具类会自动找到对应域并填充内容,然后生成一个新的PDF文件。这种方法在批量处理类似...

    freemarker解析成pdf

    5. **生成PDF**:使用Freemarker的`process`方法将模板和数据模型结合,然后通过一个PDF库(如iText或Apache PDFBox)将结果转换为PDF。以下是一个使用iText的例子: ```java StringWriter writer = new ...

    java根据模板动态生成PDF实例

    Java根据模板动态生成PDF是一种常见的需求,特别是在需要生成可配置报告或者数据分析文档的场景下。本文将介绍如何利用iText、FreeMarker和JFreeChart这三个库来实现这一功能。 首先,iText是一个强大的PDF处理库,...

    基于Java的用iText类库制作PDF文档.zip

    在实际应用中,开发者通常会创建一个自定义的`PdfGenerator`类,封装上述操作,以便在不同场景下重用代码。 总之,"基于Java的用iText类库制作PDF文档.zip"这个资源包旨在帮助Java开发者掌握如何利用iText高效地...

    HTML2PDF(JAVA).pdf

    重点将集中在IText库的使用,CSS样式应用,字体处理,以及PDF文件的生成。 首先,HTML到PDF的转换是一个常见的需求,特别是在需要将网页或者基于HTML的内容转换为高质量PDF文档的场景中。Java平台下,实现HTML到PDF...

    封装导出pdf报表

    在编程中,封装PDF报表通常包括以下几个步骤: 1. **数据准备**:数据是报表的基础,可以从数据库、CSV文件、Excel工作表或其他数据源获取。需要对数据进行处理,例如计算、筛选、排序等,以便呈现有意义的信息。 ...

    java使用itext生成pdfdemo,直接执行main方法可用!代码文档中有配置文件的详细介绍

    通过阅读和运行这些代码,你可以更深入地了解如何在实际项目中应用iText生成PDF。 总结起来,iText是Java生成PDF的强大工具,通过学习和实践,开发者可以轻松创建复杂的PDF文档。在实际开发中,结合配置文件和详细...

    基于poi封装的word-excel-Pdf导出的xdoc设计,xdoc的jar包,加代码

    在你提供的信息中,“基于poi封装的word-excel-Pdf导出的xdoc设计”是一个使用Apache POI进行文件处理的项目,它包含了将数据导出到Word、Excel和PDF格式的功能。 1. **Apache POI**: Apache POI 是一套用于处理...

    itext 增加水印

    在处理多个PDF文件时,可以将上述代码封装成一个函数,传入PDF文件路径和水印参数,然后批量调用该函数。 在实际应用中,你可能需要根据需求调整水印的位置、角度、大小以及字体样式。例如,你可以通过调整`...

    aspose生成word、转pdf的java工具类

    5. **Java工具类**:提供的工具类可能是封装了Aspose.Words功能的类,包含了一些静态方法,例如创建Word文档、填充模板、转换为PDF等。这样的工具类使得开发者可以更方便地调用Aspose的功能,而无需深入理解底层API...

    java代码实现填充word模板生成word合同的实例

    在实际应用中,为了提高效率和灵活性,通常会将这些步骤封装到一个服务类中,提供接口供其他业务调用。例如,可以创建一个`ContractGenerator`类,包含`generateContract()`方法,接收模板路径、替换数据和输出文件...

    详细的导出pdf工具类和jar包

    1. **iText库**:iText是一款流行的开源Java库,专门用于创建和修改PDF文件。你可以使用它来构建自定义工具类,通过API调用来实现PDF的生成。例如,可以创建一个名为`PdfExporter`的工具类,其中包含`exportToPdf()`...

    合同/word模板生成

    在本案例中,提供的"poiWord-合同模板生成"资源是一个Java库,它封装了生成Word文档的功能,使得开发者能够便捷地创建和编辑合同。 1. **Apache POI库**: 这个资源可能基于Apache POI项目,这是一个开源的Java API...

    freemarker导出Word和pdf工具类

    1. 创建FreeMarker的`Configuration`,加载PDF模板。 2. 准备数据模型。 3. 使用`Template`对象和数据模型生成PDF内容。 4. 对于iText,创建`Document`对象,使用`PdfWriter`将内容写入;对于OpenPDF,创建`Document...

    利用iText包实现Java报表打印

    - 利用PDF模板填写数据域:对于预设格式的PDF报表模板,可以利用iText技术填充已存在的模板文件,从而快速生成含有具体数据的报表。 3. iText编程生成PDF文档的步骤: - 首先,创建一个Document对象,该对象是PDF...

    FreemarkerToPDF网上几乎所有的工具类和模板都在里面

    FreemarkerToPDF是一个强大的Java库,用于将Freemarker模板转换为PDF文档。这个工具类集合包含了多种处理Freemarker模板和生成PDF的功能,旨在简化开发者的工作流程,特别是那些在Web开发中需要动态生成PDF的场景。...

    Java与模式(PDF)

    - Java处理PDF文档:Apache PDFBox、iText等库用于读取、创建、修改PDF文件。 - PDF文档结构:PDF是一种页面描述语言,包含文本、图像、形状等元素。 - Java与PDF交互:如何使用API解析PDF内容,进行搜索、提取...

    毕业论文模板.docx

    - **本实验对数据库连接的封装**:为了简化数据库连接的过程,提高代码的可重用性,通常会编写一个数据库连接管理类,对JDBC进行封装,提供简单的接口供应用程序调用。 #### 五、实验环境 - **实验环境**:本研究...

Global site tag (gtag.js) - Google Analytics