您的位置:首页 > 理论基础 > 计算机网络

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

2017-11-15 15:38 1301 查看
最近业务需求,需要生成合同展现给用户,研究了下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 {
// 利用模板生成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<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();
}
System.out.println(relativeNewPDFPath);
return relativeNewPDFPath;
}

public static void main(String[] args) throws IOException, DocumentException {
String[] str = { "TOP__ONE1几经师傅", "132323231几经师傅", "几经师傅1234567891" };
fillTemplate(str);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: