1.关于java向PDF模板写入数据

写的特别全一步一步来就行。

(1)首先下载一个pdf编辑工具Adobe Acrobat DC

java pdf 模块化 java操作pdf模板_java pdf 报表

(2)准备一个pdf模板文件(你可以把自己创建一个只有表头没有内容的Excel文档来或者一个需要填写内容的Word文档来测试,把文档另存为,保存格式为PDF)

(3)然后使用pdf编辑工具将pdf变成一个准备表单。

java pdf 模块化 java操作pdf模板_控件_02

(4)然后在你想要添加数据的地方添加文本域,设置文本域名称(标识)。

java pdf 模块化 java操作pdf模板_java pdf 模块化_03

(5) 首先删除Acrobat DC自动生成的所有的fill控件(单机选中,按delete键删除),因为我发现使用fill控件,Java代码未能成功向模板文件中写入数据。删除之后,在顶部菜单有一个“添加文本域”的控件,点击一下,然后可以拖动控件到下划线上或者冒号后面。可以拖动设置控件大小,双击控件会打开一个对话框,在里面有个名称文本框,可以自定义控件名。如下图:

java pdf 模块化 java操作pdf模板_java_04

到目前为止模板文件已经制作完成,下一步开始进行代码编写

(1)引入pom.xml依赖

1 
2 com.itextpdf
3 itextpdf
4 5.5.5
5 
6
7 
8 com.itextpdf
9 itext-asian
10 5.2.0
11 
(2)Maven引入依赖后,创建测试类。完整代码如下:
importcom.itextpdf.text.Document;importcom.itextpdf.text.DocumentException;import com.itextpdf.text.pdf.*;importjava.io.ByteArrayOutputStream;importjava.io.FileOutputStream;importjava.io.IOException;importjava.util.HashMap;importjava.util.Map;/***@authoraijiao
* @date 2018/08/01*/
public classPdfDemo {public static voidfillTemplate() {//模板路径
String templatePath = "E:\\工作\\模板\\模板.pdf";//生成的新文件路径
String newPDFPath = "E:\\工作\\模板\\测试.pdf";
PdfReader reader;
FileOutputStream out;
ByteArrayOutputStream bos;
PdfStamper stamper;try{
out= newFileOutputStream(newPDFPath);
reader= newPdfReader(templatePath);
bos= newByteArrayOutputStream();
stamper= newPdfStamper(reader, bos);
AcroFields form=stamper.getAcroFields();
Map map = new HashMap<>();
map.put("test1", "中国工商银行");
map.put("test2", "中国农业银行");
map.put("test3", "中国建设银行");int i = 0;
java.util.Iterator it =form.getFields().keySet().iterator();while(it.hasNext()) {
String name=it.next();
form.setField(name, map.get(name));
}//true代表生成的PDF文件不可编辑
stamper.setFormFlattening(true);
stamper.close();
Document doc= newDocument();
PdfCopy copy= newPdfCopy(doc, out);
doc.open();
PdfImportedPage importPage= copy.getImportedPage(new PdfReader(bos.toByteArray()), 1);
copy.addPage(importPage);
doc.close();
}catch(IOException e) {
e.printStackTrace();
}catch(DocumentException e) {
e.printStackTrace();
}
}public static voidmain(String[] args) {
fillTemplate();
}
}

二、java制作pdf报表的问题

1首先使用jaspersoft studio制作模板文件

java pdf 模块化 java操作pdf模板_List_05

(1)创建一个项目File -》New -》Project

java pdf 模块化 java操作pdf模板_java pdf 报表_06

选择JasperReports Project,点击Next

java pdf 模块化 java操作pdf模板_java pdf 模块化_07

为自己的项目起个名字,点击Finish

再工具的左上方找到自己刚创建的项目

java pdf 模块化 java操作pdf模板_java_08

(2)新建模板xxx.jrxml,取消不需要的band,保留Title,page header, detail1,pagefooder.将组件ta'b'le拖入detail1中。跳蛛dataset窗口,选择create,然后next

java pdf 模块化 java操作pdf模板_控件_09

给dataset命名。选择create new  dateset...,然后next

java pdf 模块化 java操作pdf模板_java pdf 报表_10

java pdf 模块化 java操作pdf模板_java_11

java pdf 模块化 java操作pdf模板_List_12

java pdf 模块化 java操作pdf模板_java_13

只保留column header ,然后finish

java pdf 模块化 java操作pdf模板_java_14

点击detail中的table组件进入到table界面中。

java pdf 模块化 java操作pdf模板_List_15

在column header中邮件column1  选择create  column  after ,生成四个column

java pdf 模块化 java操作pdf模板_java pdf 模块化_16

一般表头都是合并列的复杂表头。选择column2邮件。-》group columns

java pdf 模块化 java操作pdf模板_java pdf 模块化_17

在columns[1]中的column1右键create  column after ,显示如下:

java pdf 模块化 java操作pdf模板_List_18

在dateset1中新建Field属性,并拖入到table的detail中,设置字体样式(这里自定义命名)注意类型

java pdf 模块化 java操作pdf模板_控件_19

然后返回到main  report ,新建fields 命名为table  data,设置class 为JRBeanCollectionDataSource,注意写全路径,新建一个Field为Date,Class为String

(这里主要的作用是将变量存到一个表变量中)(这个table变量是这个table表中所有变量的汇总)

java pdf 模块化 java操作pdf模板_java pdf 报表_20

点击main  report 的detail  中的table ,显示properties后,点击dataset,选中use 啊 JRDatesource expression,将新建的tableDate写入。

java pdf 模块化 java操作pdf模板_java pdf 模块化_21

java pdf 模块化 java操作pdf模板_java pdf 模块化_22

保存模板,并复制到JasperWeb项目中

这个时候模板就弄好了。

然后写代码注入数据源就行。

serviceimpl
/*** 打印pdf报表
*@throwsException
*@throwsIO*/@Overridepublic void printZpsStudentTab(String classid, HttpServletRequest req, HttpServletResponse resp) throwsException {//TODO Auto-generated method stub
ZpsClassTabDTO bjDto =zpsClassTabBO.getByClassId(classid);
ClassPathResource resource=new ClassPathResource("report/txlist.jasper");
InputStream inputStream=resource.getInputStream();
ServletOutputStream sosRef=resp.getOutputStream();try{
Map hashMap = new HashMap();
hashMap.put("banji", bjDto.getClassname());
List list = new ArrayList();
List listT =zpsStudentTabBO.getByClassId(classid);
Map map=sayHelloPracticeService.queryTongji("NATION");
List mapnation=(List)map.get("nationlist");
listT.stream().forEach(item->{
ZpsStudentTabDTO dto= newZpsStudentTabDTO();
ToolUtil.copyProperties(item, dto);
mapnation.stream().forEach(nation->{if (dto.getNationcode().equals((String)nation.get("val")))
dto.setNationname((String)nation.get("val_name"));
});
if (dto.getSex().equals("1")) {
dto.setSex("男");
}else{
dto.setSex("女");
}
dto.setBirthdayt(DateFormatUtils.format(dto.getBirthday(),"yyyy-MM-dd"));
list.add(dto);
}); resp.setContentType("application/pdf");
ModelTableSource ms= newModelTableSource();
ms.setTableData(newJRBeanCollectionDataSource(list));
List mlist = new ArrayList();
mlist.add(ms);
JRBeanCollectionDataSource dataSource= newJRBeanCollectionDataSource(mlist);//第三个参数:JavaBean作为数据源,使用JRBeanCollectionDataSource对象来填充//JasperPrint print = JasperFillManager.fillReport(inputStream, hashMap, dataSource);
JasperPrint print =JasperFillManager.fillReport(inputStream, hashMap, dataSource);//3.使用Exporter导出PDF
JasperExportManager.exportReportToPdfStream(print, sosRef);
}catch(Exception e) {//log.error(e.toString(), e);
throw new ExceptionManager(10111);
}finally{
sosRef.flush();
sosRef.close();
inputStream.close();
}
}
ModelTableSource
importnet.sf.jasperreports.engine.data.JRBeanCollectionDataSource;public classModelTableSource {privateJRBeanCollectionDataSource tableData;privateString date;publicJRBeanCollectionDataSource getTableData() {returntableData;
}public voidsetTableData(JRBeanCollectionDataSource tableData) {this.tableData =tableData;
}publicString getDate() {returndate;
}public voidsetDate(String date) {this.date =date;
}
}