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

来源:互联网 发布:java游戏编程入门pdf 编辑:程序博客网 时间:2024/04/30 19:21

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

具体实现步骤如下:

1、maven引入所需jar

<dependency>              <groupId>com.itextpdf</groupId>              <artifactId>itextpdf</artifactId>              <version>5.3.4</version>          </dependency>        <dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency>

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

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




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

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


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


下图为我标注的属性


至此,模板生成,保存为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<String> 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();}}  

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


运行代码,打开test1:


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

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 {// 利用模板生成pdfpublic 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<String> it = form.getFields().keySet().iterator();while (it.hasNext()) {String name = it.next().toString();form.setField(name, contactInfo[i]);i--;}stamper.setFormFlattening(true);// 如果为false那么生成的PDF文件还能编辑,一定要设为truestamper.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);}}


阅读全文
0 0