itext根据模板生成PDF,支持多条数据的生成


根据客户需求,现需要根据提供的PDF模板,封装数据生成,PDF,里面涉及到了多条数据的参数的封装,废话不多说,直接上步骤

 

1.因为是maven项目,需要引入itext的包已经中文注解包,如下图

 

 2.因为需要模板,自己可以通过Adobe制作模板,制作需要的模板,这里就不进行模板的制作,

3.接下来是PDF的封装代码

 

@RestController
public class ToPdfController {
private final static Logger logger = (Logger) LoggerFactory.getLogger(ToPdfController.class);

@Value("${spring.redis.enable}")
private String enable;

@Value("${client-process.suffixUrl}")
private String suffixUrl;

@Value("${****Header.Prefix}")
private String *****HeaderPrefix;
@Value("${****Header.Pdfurl}")
private String Pdfurl;
@Value("${****Header.pdfCreatFile}")
private String pdfCreatFile;
@Value("${****Header.caUrl}")
private String caUrl;
@Value("${****Header.caAppCode}")
private String caAppCode;
@Value("${****Header.caAppPWD}")
private String caAppPWD;
@Value("${****Header.caContainerName}")
private String caContainerName;
@Value("${****Header.caSignatureAlgorithm}")
private String caSignatureAlgorithm;
@Value("${*****Header.caInDataType}")
private String caInDataType;

@Autowired
private ServiceTemplateDao serviceTemplateDao;
@Autowired
private DBServiceInfoManage serviceInfoManage;
@Autowired
private OrganInfoDao organInfoDao;

@ResponseBody
@RequestMapping(value = "/rest/selectFile", method = RequestMethod.POST)
public void getMessageToPdf(HttpServletRequest request, @RequestBody String param, HttpServletResponse response,
String serviceName) {
logger.info("接口入参开始==================" + param);

SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd- HH:mm:ss.SSS");
Date date = new Date();
String StartTime = sf.format(date);
String result = "";
JSONObject json = new JSONObject();

try {
JSONObject parseObject = JSONObject.parseObject(param);
// String serviceName = (String) parseObject.get("serviceName");
String serviceCode = (String) parseObject.get("serviceCode");
if (StringUtils.isBlank(serviceName)) {
json.put("code", 1);
json.put("message", "服务的英文名称不能为空");
return;
} else {
Map<String, String> map = new HashMap<String, String>();
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String key = (String) headerNames.nextElement();
String value = request.getHeader(key);
map.put(key, value);
}

DbServiceInfo dbServiceInfo = serviceInfoManage.findByServiceName(serviceName);
String url = Pdfurl + serviceName;
// String url = dbServiceInfo.getServiceUrl();
String data = JSONObject.toJSONString(parseObject.get("data"));
result = httpWithPost(url, map, data);
Date enddate = new Date();
// 获取两个时间的时间差
long ms = getTimeMessage(enddate, date);
// 转化时间的为String类型的数据
String valueOf = String.valueOf(ms);
valueOf += "ms";
JSONObject parse = JSONObject.parseObject(result);
int code = (int) parse.get("Code");
// 获取头信息数据

if (code != 0) {
json.put("code", 1);
json.put("message", "数据调用失败");
return;
} else {
Object object = parse.get("Data");

JSONArray jsonObject = (JSONArray) JSONArray.toJSON(object);
String uuid = dbServiceInfo.getUuid();
ServiceTemplate serviceTemplate = serviceTemplateDao.findByServiceUuid(uuid);

//进行参数的封装

encapsulation(jsonObject, serviceCode, response, serviceTemplate, request, map, serviceName,
StartTime, valueOf);
}

}

} catch (Exception e) {
e.printStackTrace();
}

}

  

 

/**
* 获取时间差的数据
* 
* @param enddate
* @param date
* @return
*/
private long getTimeMessage(Date enddate, Date date) {
long between = 0;

try {
between = (enddate.getTime() - date.getTime());
} catch (Exception e) {
e.printStackTrace();
}
long day = between / (24 * 60 * 60 * 1000);
long hour = (between / (60 * 60 * 1000) - day * 24);
long min = ((between / (60 * 1000)) - day * 24 * 60 - hour * 60);
long s = (between / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60);
long ms = (between - day * 24 * 60 * 60 * 1000 - hour * 60 * 60 * 1000 - min * 60 * 1000 - s * 1000);
return ms;

}

  

 

封装参数,重点

/**
* 进行参数的封装
* 
* @param jsonObject
* @throws DocumentException
* @throws IOException
*/
private void encapsulation(JSONArray jsonObject, String code, HttpServletResponse response,
ServiceTemplate serviceTemplate, HttpServletRequest request, Map<String, String> map, String serviceName,
String startTime, String value) {
//多个PDF页需要多个ByteArrayOutputStream支持数据的封装
List<ByteArrayOutputStream> bossList = new ArrayList<>();
try {
// 获取文件的路径

List<PdfReader> list = new ArrayList();
PdfReader reader = null;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
String pdfUrl = serviceTemplate.getUrl();
SimpleDateFormat ss = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format2 = String.valueOf(new Date().getTime() / 1000);

String flieName = serviceTemplate.getFlieName();
String flieName1 = "";
if (StringUtils.isNotBlank(flieName)) {
String[] split = flieName.split("\\.");
flieName = split[0];
flieName1 = split[1];

}
FileOutputStream fos = new FileOutputStream(pdfCreatFile + flieName + "_" + format2 + "." + flieName1);// 需要生成PDF
String batchId = MsgUtils.getBatchId();
for (int i = 0; i < jsonObject.size(); i++) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
reader = new PdfReader(pdfUrl);// 模板
PdfStamper mPdfStamper = new PdfStamper(reader, baos);// 解析
// 遍历 jsonarray 数组,把每一个对象转成 json 对象
JSONObject job = jsonObject.getJSONObject(i);
// 准备好参数进行封装,这些参数都是页面固定,不可修改
String test = "*************.";
String deptId = "**********";
job.put("code", code);
job.put("batchId", batchId);
job.put("deptId", deptId);
job.put("startTime", startTime);
job.put("test", test);
job.put("serviceName", serviceName);

String rid = map.get("*****_rid");
String sid = map.get("*******_sid");
String applyId = "";
String orgName = "";

if (StringUtils.isNotBlank(rid)) {
if (rid.contains("@")) {
String[] split = rid.split("@");
applyId = split[0];
} else {
applyId = rid;
}
}
// 根据服务调用方的名称
if (StringUtils.isNotBlank(applyId)) {
OrganInfo byId = organInfoDao.findById(applyId);
orgName = byId.getName();
}
// 判断是否有调用方的介入,如果没有调用方,则不接受签名
String dataes = "";
if (StringUtils.isNotBlank(applyId) && StringUtils.isNotBlank(sid)) {

// 调用ca接口
String result = getCaResult(caUrl, caAppCode, caAppPWD, caContainerName, caSignatureAlgorithm,
batchId, job, caInDataType);
String message = "调用签名接口失败";
if (result.equals(message)) {
dataes = message;
} else {
// 开始解析返回值
String startSrt = "<SignData>";
String endSrt = "</SignData>";
dataes = subString(result, startSrt, endSrt);
}
} else {
dataes = "无请求方,不接受签名";
}

job.put("dataes", dataes);
job.put("orgName", orgName);

AcroFields form = mPdfStamper.getAcroFields();// 获取模板上的预订的参数
java.util.Iterator<String> it = form.getFields().keySet().iterator();

while (it.hasNext()) {
String name = it.next().toString();
String param = job.getString(name);
if(name.contains("time")){
String pp = job.getString(name);
if(StringUtils.isNotBlank(pp)){
Date date = new Date(Long.valueOf(pp));
String format = ss.format(date);
form.setField(name, format);
}else{
form.setField(name, "");
}
}else{
form.setField(name, param);
}
}
mPdfStamper.setFormFlattening(true);// 如果为false那么生成的PDF文件还能编辑,一定要设为true
mPdfStamper.close();
reader = new PdfReader(baos.toByteArray());
list.add(reader);
bossList.add(baos);
}
// 创建新的pdf进行替换
// baos = new ByteArrayOutputStream();// 构建字节输出流
Document document = new Document();
// PdfWriter.getInstance(document, baos);
PdfCopy copy = new PdfCopy(document, fos);
document.open();
for (int k = 0; k < list.size(); k++) {
PdfReader pdfReader = list.get(k);
document.newPage();
// 获取每个PDF的byte 值
copy.addDocument(new PdfReader(bossList.get(k).toByteArray()));
}
copy.close();

// results = new String(baos.toByteArray(), "ISO-8859-1");

String header = request.getHeader("user-agent");
if (header.toLowerCase().indexOf("firefox") >= 0) {
response.setContentType("application/pdf;");
response.setHeader("Content-disposition", "attachment;filename="
+ new String(serviceTemplate.getFlieName().getBytes("utf-8"), "iso-8859-1"));
} else {
response.setContentType("application/pdf;charset=GB18030");
response.setHeader("Content-disposition",
"attachment;filename=" + URLEncoder.encode(serviceTemplate.getFlieName(), "utf-8"));
}

ServletOutputStream outputStream = response.getOutputStream();
FileInputStream in = new FileInputStream(pdfCreatFile + flieName + "_" + format2 + "." + flieName1);// 文件的下载的路径
byte[] b = new byte[2048];
int len;
try {

while ((len = in.read(b)) > 0)
outputStream.write(b, 0, len);

in.close();
} catch (IOException e) {
e.printStackTrace();
}

} catch (Exception e) {

e.printStackTrace();
}

// return results;

}

  

注:这里调用其他系统的信息的接口就不进行编辑了,主要是接受封装PDF模板

 

发送请求

/**
* 发送httpclient
* 
* @param url
* @param content
* @param param
* @return
*/
public String httpWithPost(String url, Map<String, String> content, String param) {
String result = "";
if (StringUtils.isBlank(url)) {
logger.info("URL为空");
result = "URL为空";
return null;
}
// spring rest工具类
RestTemplate rt = new RestTemplate();

MultiValueMap<String, String> headers = new LinkedMultiValueMap<String, String>();
headers.add("content-type", "application/json;charset=UTF-8");

if (null != content) {
for (Entry<String, String> entry : content.entrySet()) {
headers.add(entry.getKey(), entry.getValue());
}
}

try {
// 创建发送实体
HttpEntity<Object> requestEntity = new HttpEntity<Object>(param, headers);
// 发送post请求
ResponseEntity<String> re = rt.exchange(url, HttpMethod.POST, requestEntity, String.class);
// 打印返回http状态码
logger.info("response status code:" + re.getStatusCode());
// 打印http报文体内容
result = re.getBody();
} catch (Exception e) {
result = e.getMessage();
}
return result;

}

  

自己的一点小心得如有问题,请联系我,谢谢

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM