1、生成pdf模板。
public String dealAdamasWithFtl(){
HttpServletRequest request = ServletActionContext.getRequest();
//访问路径
String ctx = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();
Map<String, Object> session = ActionContext.getContext().getSession();
Configuration config = new Configuration();
StringBuffer sb = new StringBuffer();
try {
config.setDirectoryForTemplateLoading(new File(this.getCoaPath() + "/manager/materialCheckSelect/templates/"));
config.setDefaultEncoding("UTF-8");
Map<String,Object> map = new HashMap<String, Object>();
map.put("ctx",ctx);
map.put("batchCOA", session.get("batchCOA"));
ProductReagent pr = (ProductReagent) session.get("productreagent");
List<GreagentReagents> list = (List<GreagentReagents>) session.get("GreagentReagentsList");
pr.setProductImage1(DateUtil.getImageUrl(pr.getProductImage1()));
if(ProductUtil.checkNull(pr.getStructureDescription())){
pr.setCoaProductImg(DateUtil.getImageUrl(pr.getCoaProductImg()));
}
map.put("productreagent", pr);
map.put("greagentReagentsList", list);
map.put("materialCheckRecord", session.get("materialCheckRecord"));
map.put("mcrs", session.get("mcrs"));
map.put("storage", session.get("storage"));
Template template = config.getTemplate("adamas.ftl");
template.setEncoding("UTF-8");
StringWriter sw = new StringWriter();
template.process(map, sw);
sb = sw.getBuffer();
sw.close();
} catch (Exception e) {
e.printStackTrace();
}
return sb.toString();
}
2、将pdf模板的String字符写入本地创建的.pdf文件中。
/**
* 解析上传的Excel文件,并在本地生成pdf文件
* */
public String doBatchCoaQuery() {
try {
InputStream is = new FileInputStream(uploadExc);
org.apache.poi.ss.usermodel.Workbook wb = WorkbookFactory.create(is);
//获得该工作区的第一个sheet
Sheet sheet = wb.getSheetAt(0);
int totalRows = sheet.getLastRowNum();
if(totalRows > 5000){//数据不能超过5000条
return printMsg("上传失败,最多不能超过5000条数据!");
}
if(totalRows < 1){//无数据
return printMsg("无数据,请添加数据后重新上传!");
}
String content = "";
for(int i = 1;i <= totalRows; i++){//检查数据
Row everyRow = sheet.getRow(i);
if(everyRow != null){
content = composeExc07(everyRow,0);
if(ProductUtil.checkNull(content)){
return printMsg("第" + new Integer(everyRow.getRowNum()+1) + "行,第" + new Integer(1) + "列商品编号或者原始编号不能为空,请修改数据后重新上传!");
}
content = composeExc07(everyRow,1);
if(ProductUtil.checkNull(content)){
return printMsg("第" + new Integer(everyRow.getRowNum()+1) + "行,第" + new Integer(1) + "列批号不能为空,请修改数据后重新上传!");
}
}
}
String pdfStr;
String result;
File file;
String fileAbsolutePath;
file = new File(path);
if(!file.exists()){
file.mkdirs();
}
List<String> pathList = new ArrayList<>();
ITextRenderer renderer = new ITextRenderer();
ITextFontResolver fontResolver = renderer.getFontResolver();// 解决中文支持问题
fontResolver.addFont("C:/Windows/fonts/msyh.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
renderer.getSharedContext().setBaseURL(new File(this.getSavePath()).toURI().toURL().toString()+"/");// 解决图片的相对路径问题
for(int i = 1; i <= totalRows; i++) {
Row everyRow = sheet.getRow(i);
if(everyRow != null){
productNum = composeExc07(everyRow, 0);
batchCOA = composeExc07(everyRow, 1);
result = this.produceCOA1();
if("ADAMAS".equals(result)){
pdfStr = this.dealAdamasWithFtl();
fileAbsolutePath = path + File.separator + "COA(Adamas)" + UUID.randomUUID() + ".pdf";
file = new File(fileAbsolutePath);
if(!file.exists()){
file.createNewFile();
}
OutputStream outputStream = new FileOutputStream(fileAbsolutePath);
renderer.setDocumentFromString(pdfStr);
renderer.layout();
renderer.createPDF(outputStream, Boolean.TRUE);
outputStream.close();
pathList.add(fileAbsolutePath);
}else if("non-coa".equals(result)){
pathList.add(SystemConfig.getInstance().getProperty("NEW_FILE_PATH") + this.nonCoaUrl);
}
}
}
if(pathList.size() == 0){//没有可以导出的pdf文件
return printMsg("没有可以导出的pdf文件!");
}
session.put("pathList", pathList);
} catch (Exception e) {
e.printStackTrace();
}
return printMsg("1");
}
3、读取本地文件并生成zip压缩包,获取浏览器response响应流并将zip流反馈给浏览器。
/**
* 导出(COA)pdf文件压缩包
* @return
*/
public void exportCoaZip(){
try {
List<String> pathList = (List<String>) session.get("pathList");
HttpServletResponse response = ServletActionContext.getResponse();
OutputStream os = response.getOutputStream();
//指定下载的文件名--设置响应头
response.setContentType("application/zip; charset=UTF-8");
response.setDateHeader("Expires", 0);
response.setHeader("Content-Disposition", "attachment;filename=" +
URLEncoder.encode("coa-pdfs", "UTF-8") + ".zip");
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setCharacterEncoding("UTF-8");
//多个pdf写入压缩文件
ZipOutputStream zipOutputStream =new ZipOutputStream(response.getOutputStream());
ZipEntry entry;
//ByteOutputStream byteOutputStream;
InputStream inputStream;
byte[] bytes = new byte[2048];
int len;
File file;
for (String path : pathList) {
file = new File(path);
if(file.exists()){
entry = new ZipEntry(file.getName());
zipOutputStream.putNextEntry(entry);
inputStream = new FileInputStream(path);
while ((len = inputStream.read(bytes)) > 0) {
//byteOutputStream.write(bytes, 0, len);
zipOutputStream.write(bytes, 0, len);
}
//byteOutputStream.writeTo(zipOutputStream);
inputStream.close();
zipOutputStream.closeEntry();
if(path.indexOf("Adamas") != -1 || path.indexOf("General") != -1){
file.delete();
}
}
}
zipOutputStream.close();
}catch (Exception e) {
e.printStackTrace();
}
}