先看一下导出的PDF效果图简单版
导出内容为PDF格式基本流程:
先创建一个word文档,我这边命名为:mytest,并写好你要输出内容的固定信息。
再将此word文档另存为pdf格式,我放到了我本地的D盘下。
然后用Adobe Acrobat Pro 打开刚刚制作的pdf文件(没有Adobe Acrobat Pro的自己去官网下载)
打开后是这样:
点击左上角的创建,并点击“创建表单”
然后选择“从现有文档创建”
依次点击“下一步”,“继续”。这时会出现下框,不用管它直接点确定就好
然后鼠标右键点击空白处,选择“文本域(T)”
设置好域名称,域名称就是输出pdf中每个字段的内容,是一个变量
域名称设置完了(域名称要对应上java代码中的字段)。
点击右上角的“文件”,另存一下
我存到了本地D盘 mytest5.pdf
打开mytest5.pdf是这样
到此为止,整个PDF模板做好了。下面开始写工具类:
导入依赖
!--导出pdf-->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.4.3</version>
</dependency>
工具类
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
public class PdfUtils {
// 利用模板生成pdf
public static void pdfout(Map<String,Object> o) {
// 模板路径
String templatePath = "D:/mytest5.pdf";
// 生成的新文件路径
String newPDFPath = "D:/testout2.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();
//文字类的内容处理
Map<String,String> datemap = (Map<String,String>)o.get("datemap");
for(String key : datemap.keySet()){
String value = datemap.get(key);
form.setField(key,value);
}
//图片类的内容处理
Map<String,String> imgmap = (Map<String,String>)o.get("imgmap");
for(String key : imgmap.keySet()) {
String value = imgmap.get(key);
String imgpath = value;
int pageNo = form.getFieldPositions(key).get(0).page;
Rectangle signRect = form.getFieldPositions(key).get(0).position;
float x = signRect.getLeft();
float y = signRect.getBottom();
//根据路径读取图片
Image image = Image.getInstance(imgpath);
//获取图片页面
PdfContentByte under = stamper.getOverContent(pageNo);
//图片大小自适应
image.scaleToFit(signRect.getWidth(), signRect.getHeight());
//添加图片
image.setAbsolutePosition(x, y);
under.addImage(image);
}
stamper.setFormFlattening(true);// 如果为false,生成的PDF文件可以编辑,如果为true,生成的PDF文件不可以编辑
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) {
System.out.println(e);
} catch (DocumentException e) {
System.out.println(e);
}
}
public static void main(String[] args) {
Map<String,String> map = new HashMap();
// map中的键要对应设置好的PDF模板中域名称
map.put("partsName","张三");
map.put("num","12");
map.put("price","123");
map.put("purchasePrice","100.5");
map.put("manHourFee","15");
map.put("totalPay","565");
Map<String,String> map2 = new HashMap();
// 图片路径
map2.put("img","d:/cheliang01.jpg");
Map<String,Object> o=new HashMap();
o.put("datemap",map);
o.put("imgmap",map2);
pdfout(o);
}
}
在main方法里运行,PDF就导出了。
下面就是导出后的PDF效果,很简单效果图,现实中可以根据需求自己添加变量,域名称。
版权声明:本文为angang12原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。