1首先你要先将你的pdf模板做好,可以采用Adobe Acrobat Dc 这个工具,不过这个工具是需要破译的,博主也没有,所以下了一个下来,用的是30天的试用期,反正也不常用。
2.先将你的word素材,另存为pdf模式的,然后保存到一个你熟悉的地方。
3.将你刚刚保存的pdf打开,打开的方式是右键点击“打开方式为”:Adobe Acrobat Dc这个工具打开。
4将pdf打开后,点击右边的“准备表单”,如下图:
5.重点来啰! 当你点击准备表单后,自动生成表单后,才会出现如图所示的TI字图形,点击这个图形就能生成模板填充域了,注意,不点击准备表单是不会出现这个图形的哟。这也是我走了好多冤枉路才摸索出来的。图片如下:
6.接下来就点击“TI”图形,在你所想要填充内容的地方生成模板域,操作方式是:鼠标点击T图形后,直接在你所想填充的位置拖动鼠标,生成一个长度宽度大小容纳的下你的内容的形状,
7 然后在文字域的框框中修改你的域名,域名就是你后面要填充内容的key值,比如说在姓名的域名框中可以写:name
8. 等所有域名框做好后,版式内容位置调整好后,模板就算正式做好了,然后点击左上方的文件,进行另存为,存到一个你熟悉的位置进行保存模板。
9.然后可以将你的模板,copy到你的代码中去,一般保存在你的resources路径下面。然后就开始正式编码了。
- 首先,要使用itext,先导入其相关联的jar包,如下:
<!--项目要使用iText,必须引入jar包。才能使用,maven依赖如下:-->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13</version>
</dependency>
<!--输出中文,还要引入下面itext-asian.jar包:-->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<!--设置pdf文件密码,还要引入下面bcprov-jdk15on.jar包:-->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.55</version>
</dependency>
11. 将我们刚刚生成的pd模板转成pdf 并且将内容填充进去:
/**
* 将参数保存并且导出新的pdf
* @param o : 需要保存的参数
* @param url :pdf模板路径
* @return
*/
private Map<String, String> pdfout(Map<String,Object> o,String url) {
// 模板路径
String templatePath = url;
//生成的新文件pdf的路径(这里的路径是博主自己的测试路径,你们要写自己的。)
String newPDFPath = "D:\\模板\\test.pdf";
//pdf阅读器
PdfReader reader;
//文件输出流
FileOutputStream out;
//字节数组输出流在内存中创建一个字节数组缓冲区,所有发送到输出流的数据保存在该字节数组缓冲区中。
ByteArrayOutputStream bos;
// 使用pdfstamper修改现有文档
PdfStamper stamper;
try {
//输出流
out = new FileOutputStream(newPDFPath);
//读取pdf模板
reader = new PdfReader(templatePath);
bos = new ByteArrayOutputStream();
stamper = new PdfStamper(reader, bos);
AcroFields form = stamper.getAcroFields();
Map<String,String> datemap = (Map<String,String>)o.get("datemap");
for(String key : datemap.keySet()){
String value = datemap.get(key);
form.setField(key,value);
}
//true代表生成的PDF文件不可编辑,false可编辑
stamper.setFormFlattening(true);
stamper.close();
Document doc = new Document();
PdfCopy copy = new PdfCopy(doc, out);
doc.open();
//循环是处理成品只显示一页的问题
PdfImportedPage importPage = null;
for (int i=1;i<=reader.getNumberOfPages();i++){
importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), i);
copy.addPage(importPage);
}
doc.close();
} catch (IOException e) {
e.printStackTrace();
} catch (DocumentException e) {
e.printStackTrace();
}
return null;
}
- 在你指定的位置生成一个新的pdf
public class PdfDemo {
public static void main(String[] args) throws FileNotFoundException, DocumentException {
// 1.新建document对象
Document document = new Document();
// 2.建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘中。
// 创建 PdfWriter 对象 第一个参数是对文档对象的引用,第二个参数是文件的实际名称,在该名称中还会给出其输出路径。//D:\work\悦美消分
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("D:/work/data/test.pdf"));
// 3.打开文档
document.open();
// 4.添加一个内容段落
document.add(new Paragraph("Hello World!"));
// 5.关闭文档
document.close();
}
13.读取/修改已有的PDF文件
public static void main(String[] args) throws DocumentException, IOException {
//创建一个pdf读入流 读取pdf文件
PdfReader pdfReader = new PdfReader("D:/work/data/test.pdf");
//修改器 根据一个pdfreader创建一个pdfStamper.用来生成新的pdf.
PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileOutputStream("D:/work/data/test02.pdf"));
Image image = Image.getInstance("D:/work/data/test02.png");
//设置图片的宽和高
image.scaleAbsolute(250, 250);
//设置图片在文档中所在位置的宽和高
image.setAbsolutePosition(250, 250);
for(int i=1; i<= pdfReader.getNumberOfPages(); i++)
{
PdfContentByte content = pdfStamper.getUnderContent(i);
content.addImage(image);
}
pdfStamper.close();
}