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