java运用itextpdf实现根据模板生成合同并返回网络路径,供用户查看

最近业务需求,需要生成合同展现给用户,研究了下itextpdf,基本实现需求,参考http://blog.csdn.net/top__one/article/details/65442390

具体实现步骤如下:

1、maven引入所需jar

  
            com.itextpdf  
            itextpdf  
            5.3.4  
        
        
			com.itextpdf
			itext-asian
			5.2.0
		

注:itextpdf注意版本问题,有些版本就会引起jar包冲突,这个版本是可以的

2、运用wps,编辑模板文本,最后运用wps特色功能生成PDF




3、下载Adobe Acrobat Pro DC 这个是收费的,可以先试用进行测试

用Adobe Acrobat Pro DC打开刚生成的PDF文件,进行编辑选择标红部分下拉框中的“准备表单”

java运用itextpdf实现根据模板生成合同并返回网络路径,供用户查看_第1张图片

选择标红工具,对需要自动填充的属性进行标注

java运用itextpdf实现根据模板生成合同并返回网络路径,供用户查看_第2张图片

下图为我标注的属性

java运用itextpdf实现根据模板生成合同并返回网络路径,供用户查看_第3张图片

至此,模板生成,保存为test.pdf。

4、java代码,根据模板生成相应的文件

package com.loantest.controller;
import java.awt.Color;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletContext;

import org.springframework.web.context.ContextLoader;
import org.springframework.web.context.WebApplicationContext;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.PdfCopy;
import com.itextpdf.text.pdf.PdfImportedPage;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;  
  
public class ITextPdfTest {  
    // 利用模板生成pdf  
    public static void fillTemplate() throws IOException, DocumentException {  
        String templatePath ="E:/test.pdf"; 
        // 生成的新文件路径  
        String newPDFPath = "E:/test1.pdf";
        PdfReader reader;  
        FileOutputStream out;  
        ByteArrayOutputStream bos;  
        PdfStamper stamper;  
        try {  
            out = new FileOutputStream(newPDFPath);// 输出流  
            reader = new PdfReader(templatePath);// 读取pdf模板  
            bos = new ByteArrayOutputStream();  
            stamper = new PdfStamper(reader, bos);  
            AcroFields form = stamper.getAcroFields(); 
            String[] contactInfo = {"TOP__ONE1几经师傅", "132323231几经师傅","几经师傅1234567891" }; 
            int i = contactInfo.length-1;  
            java.util.Iterator it = form.getFields().keySet().iterator();  
            while (it.hasNext()) {  
                String name = it.next().toString();  
                form.setField(name, contactInfo[i]);  
                i--;
            }  
            stamper.setFormFlattening(true);// 如果为false那么生成的PDF文件还能编辑,一定要设为true  
            stamper.close();  
            Document doc = new Document();  
            PdfCopy copy = new PdfCopy(doc, out);  
            doc.open();  
            PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);  
            copy.addPage(importPage);  
            doc.close();  
        } catch (IOException e) {  
        	e.getStackTrace();
        } catch (DocumentException e) {  
        	e.getStackTrace();
        }  
    }  
    public static void main(String[] args) throws IOException, DocumentException {
    	fillTemplate();
	}
}  

模板文件路径,生成文件路径如下图:

java运用itextpdf实现根据模板生成合同并返回网络路径,供用户查看_第4张图片

运行代码,打开test1:

java运用itextpdf实现根据模板生成合同并返回网络路径,供用户查看_第5张图片

至此,成功,这是简单的测试。

5、如果需要从取服务器上文件模板,生成到服务器上则需稍微处理一下,就只贴代码吧~

package com.loantest.controller;

import java.awt.Color;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletContext;

import org.springframework.web.context.ContextLoader;
import org.springframework.web.context.WebApplicationContext;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.PdfCopy;
import com.itextpdf.text.pdf.PdfImportedPage;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;

public class ITextPdf {
	// 利用模板生成pdf
	public static String fillTemplate(String[] contactInfo) throws IOException, DocumentException {
		WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
		ServletContext servletContext = webApplicationContext.getServletContext();
		String os = System.getProperty("os.name");
		// 默认为win系统
		String relativeTemplatePath = "\\static\\test5.pdf";
		String relativeNewPDFPath = "\\static\\" + (int) ((Math.random() * 9 + 1) * 100000) + ".pdf";
		// 非win系统
		if (!os.toLowerCase().startsWith("win")) {
			relativeTemplatePath = "/static/test5.pdf";
			relativeNewPDFPath = "/static/" + (int) ((Math.random() * 9 + 1) * 100000) + ".pdf";
		}
		// 模板路径
		String templatePath = servletContext.getRealPath(relativeTemplatePath);
		// 生成的新文件路径
		String newPDFPath = servletContext.getRealPath(relativeNewPDFPath);
		PdfReader reader;
		FileOutputStream out;
		ByteArrayOutputStream bos;
		PdfStamper stamper;
		try {
			out = new FileOutputStream(newPDFPath);// 输出流
			reader = new PdfReader(templatePath);// 读取pdf模板
			bos = new ByteArrayOutputStream();
			stamper = new PdfStamper(reader, bos);
			AcroFields form = stamper.getAcroFields();
			int i = contactInfo.length - 1;
			java.util.Iterator it = form.getFields().keySet().iterator();
			while (it.hasNext()) {
				String name = it.next().toString();
				form.setField(name, contactInfo[i]);
				i--;
			}
			stamper.setFormFlattening(true);// 如果为false那么生成的PDF文件还能编辑,一定要设为true
			stamper.close();
			Document doc = new Document();
			PdfCopy copy = new PdfCopy(doc, out);
			doc.open();
			PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);
			copy.addPage(importPage);
			doc.close();
		} catch (IOException e) {
			e.getStackTrace();
		} catch (DocumentException e) {
			e.getStackTrace();
		}
		System.out.println(relativeNewPDFPath);
		return relativeNewPDFPath;
	}

	public static void main(String[] args) throws IOException, DocumentException {
		String[] str = { "TOP__ONE1几经师傅", "132323231几经师傅", "几经师傅1234567891" };
		fillTemplate(str);
	}
}


你可能感兴趣的:(java)