java将文件压缩成zip包返回给浏览器。浏览器下载zip压缩包。

文章讲述了使用Java技术处理Excel数据,生成PDF模板,如ADAMS和非COA模板,并将生成的PDF文件打包成压缩包的过程,涉及到了ApachePOI、ITextRenderer等库的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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();
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值