文件处理 二维码文档生成

本文介绍了一种使用Java程序批量生成包含二维码的Word文档的方法。通过解析前端传来的JSON数据,动态生成每个条目的二维码,并将其嵌入到Word文档的指定位置。此过程涉及数据解码、模板填充及文件输出。
创建文档
public JsonResult creatWord(HttpServletRequest request, HttpServletResponse response, String list) throws IOException, TemplateException {
       //准备数据   通过JSONArray类接受json数据
		JSONArray jsonarr=new JSONArray();
		if(list!=null) {
			//前端两次加密,所以这里两次解密
			list = URLDecoder.decode(URLDecoder.decode(list, "UTF-8"), "UTF-8");
			jsonarr= JSONArray.fromObject(list);
		}else{
			return JsonResultUtil.getErrorJson("导出失败,未接收到数据!");
		}
		dataMap = new HashMap();
		String  testword=bt(jsonarr);//转换数据
		dataMap.put("test1", testword);
		dataMap.put("testword", "");


		//准备文件输出的名称
		String fileName ="barcode.ftl";//// 要填入ftl模板的数据文件
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");//设置日期格式
		String wordname = "批次条码导出-"+df.format(new Date())+".doc";//文件名称
		try {
			wordname=URLDecoder.decode(URLDecoder.decode(wordname, "UTF-8"), "UTF-8");
			wordname = new String(wordname.getBytes(), "ISO-8859-1");
			response.setHeader("Content-disposition", "attachment;filename="+ wordname);
		} catch (UnsupportedEncodingException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		response.setContentType("application/vnd.ms-excel;charset=utf-8");

		//准备文件的模板并输出
		Configuration cfg = new Configuration();
		cfg.setClassForTemplateLoading(this.getClass(),"../template");
		cfg.setObjectWrapper(new DefaultObjectWrapper());
		cfg.setDefaultEncoding("UTF-8");
		Template t = cfg.getTemplate(fileName);  //取得要生成的模板对象
		t.setEncoding("UTF-8");
		Writer out=response.getWriter();
		t.process(dataMap, out);
		out.close();
//		response.reset();

		JsonResult result = new JsonResult();
		result.setResult(1);
		result.setMessage("导出成功了吗");
		JSONObject obj=new JSONObject();
		obj.put("filename",wordname);
		obj.put("filepath",wordname);
		result.setData(obj);
		return result;
	}
将数据转换为适合在ftl中合适的形式
public static String  bt(JSONArray jsonarr) throws UnknownHostException {
		String bt2="";
		for(int i=0;i<jsonarr.size();i++){
			JSONObject jsonobject=jsonarr.getJSONObject(i);
			String ip = InetAddress.getLocalHost().getHostAddress();
			System.out.println(ip+"*******************");
			String content="http://"+ip+":8080/api/shop/origin/detail_batch.do?batch_id="+jsonobject.getString("batch_id");//工器具id
			String s=getBufferedImgBase64CodeStr(content);
			//bt为freemaker中表格的代码  在下面相加 就不需要在前端ftl文件中遍历list
			String bt="<w:tbl><w:tblPr><w:tblStyle w:val=\"a3\"/><w:tblpPr w:leftFromText=\"180\" w:rightFromText=\"180\" w:vertAnchor=\"text\" w:tblpX=\"284\" w:tblpY=\"1\"/><w:tblOverlap w:val=\"Never\"/><w:tblW w:w=\"0\" w:type=\"auto\"/><w:tblInd w:w=\"0\" w:type=\"dxa\"/><w:tblLayout w:type=\"Fixed\"/></w:tblPr><w:tblGrid><w:gridCol w:w=\"3969\"/></w:tblGrid><w:tr><w:trPr><w:trHeight w:val=\"1701\"/></w:trPr><w:tc><w:tcPr><w:tcW w:w=\"3969\" w:type=\"dxa\"/></w:tcPr><w:p><w:pPr><w:framePr w:hspace=\"180\" w:wrap=\"around\" w:vanchor=\"text\" w:hanchor=\"text\" w:x=\"284\" w:y=\"1\"/><w:suppressOverlap/></w:pPr><w:r><w:rPr><w:rFonts w:hint=\"fareast\"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii=\"Courier New\" w:h-ansi=\"Courier New\" w:cs=\"Courier New\"/><wx:font wx:val=\"Courier New\"/><w:kern w:val=\"0\"/><w:sz w:val=\"16\"/><w:sz-cs w:val=\"16\"/></w:rPr><w:t> </w:t></w:r></w:p><w:tbl><w:tblPr><w:tblStyle w:val=\"a3\"/><w:tblpPr w:leftFromText=\"180\" w:rightFromText=\"180\" w:vertAnchor=\"text\" w:horzAnchor=\"margin\" w:tblpY=\"-9\"/><w:tblOverlap w:val=\"Never\"/><w:tblW w:w=\"0\" w:type=\"auto\"/><w:tblInd w:w=\"0\" w:type=\"dxa\"/><w:tblLayout w:type=\"Fixed\"/></w:tblPr><w:tblGrid><w:gridCol w:w=\"850\"/></w:tblGrid><w:tr><w:trPr><w:trHeight w:val=\"850\"/></w:trPr><w:tc><w:tcPr><w:tcW w:w=\"850\" w:type=\"dxa\"/><w:tcMar><w:left w:w=\"0\" w:type=\"dxa\"/><w:right w:w=\"0\" w:type=\"dxa\"/></w:tcMar></w:tcPr><w:p><w:pPr><w:framePr w:hspace=\"180\" w:wrap=\"around\" w:vanchor=\"text\" w:hanchor=\"text\" w:x=\"284\" w:y=\"1\"/><w:suppressOverlap/><w:rPr><w:rFonts w:hint=\"fareast\"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:hint=\"fareast\"/></w:rPr><w:t><w:pict><w:binData w:name=\"wordml://0200000"+i+".jpg\" xml:space=\"preserve\">"+s+"</w:binData><v:shape id=\"_x0000_i1026\" type=\"#_x0000_t75\" style=\"width:45pt;height:45pt\"><v:imagedata src=\"wordml://0200000"+i+".jpg\"/><o:lock v:ext=\"edit\" aspectratio=\"f\"/></v:shape></w:pict></w:t></w:r></w:p></w:tc></w:tr></w:tbl><w:p><w:pPr><w:framePr w:hspace=\"180\" w:wrap=\"around\" w:vanchor=\"text\" w:hanchor=\"text\" w:x=\"284\" w:y=\"1\"/><w:autoSpaceDE w:val=\"off\"/><w:autoSpaceDN w:val=\"off\"/><w:adjustRightInd w:val=\"off\"/><w:suppressOverlap/><w:jc w:val=\"left\"/><w:rPr><w:rFonts w:ascii=\"Courier New\" w:h-ansi=\"Courier New\" w:cs=\"Courier New\" w:hint=\"fareast\"/><wx:font wx:val=\"Courier New\"/><w:kern w:val=\"0\"/><w:sz w:val=\"16\"/><w:sz-cs w:val=\"16\"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii=\"Courier New\" w:h-ansi=\"Courier New\" w:cs=\"Courier New\" w:hint=\"fareast\"/><wx:font wx:val=\"Courier New\"/><w:kern w:val=\"0\"/><w:sz w:val=\"16\"/><w:sz-cs w:val=\"16\"/></w:rPr><w:t> </w:t></w:r><w:proofErr w:type=\"spellStart\"/><w:r><w:rPr><w:rFonts w:ascii=\"Courier New\" w:h-ansi=\"Courier New\" w:cs=\"Courier New\"/><wx:font wx:val=\"Courier New\"/><w:color w:val=\"000000\"/><w:kern w:val=\"0\"/><w:sz w:val=\"16\"/><w:sz-cs w:val=\"16\"/></w:rPr><w:t>gqjclass</w:t></w:r><w:proofErr w:type=\"spellEnd\"/><w:r><w:rPr><w:rFonts w:ascii=\"Courier New\" w:h-ansi=\"Courier New\" w:cs=\"Courier New\" w:hint=\"fareast\"/><wx:font wx:val=\"Courier New\"/><w:color w:val=\"000000\"/><w:kern w:val=\"0\"/><w:sz w:val=\"16\"/><w:sz-cs w:val=\"16\"/></w:rPr><w:t>    </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii=\"Courier New\" w:h-ansi=\"Courier New\" w:cs=\"Courier New\"/><wx:font wx:val=\"Courier New\"/><w:color w:val=\"000000\"/><w:kern w:val=\"0\"/><w:sz w:val=\"16\"/><w:sz-cs w:val=\"16\"/></w:rPr><w:t> </w:t></w:r></w:p><w:p><w:pPr><w:framePr w:hspace=\"180\" w:wrap=\"around\" w:vanchor=\"text\" w:hanchor=\"text\" w:x=\"284\" w:y=\"1\"/><w:autoSpaceDE w:val=\"off\"/><w:autoSpaceDN w:val=\"off\"/><w:adjustRightInd w:val=\"off\"/><w:suppressOverlap/><w:jc w:val=\"left\"/><w:rPr><w:rFonts w:ascii=\"Courier New\" w:h-ansi=\"Courier New\" w:cs=\"Courier New\" w:hint=\"fareast\"/><wx:font wx:val=\"Courier New\"/><w:kern w:val=\"0\"/><w:sz w:val=\"16\"/><w:sz-cs w:val=\"16\"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii=\"Courier New\" w:h-ansi=\"Courier New\" w:cs=\"Courier New\" w:hint=\"fareast\"/><wx:font wx:val=\"Courier New\"/><w:color w:val=\"000000\"/><w:kern w:val=\"0\"/><w:sz w:val=\"16\"/><w:sz-cs w:val=\"16\"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii=\"Courier New\" w:h-ansi=\"Courier New\" w:cs=\"Courier New\" w:hint=\"fareast\"/><wx:font wx:val=\"Courier New\"/><w:color w:val=\"000000\"/><w:kern w:val=\"0\"/><w:sz w:val=\"16\"/><w:sz-cs w:val=\"16\"/></w:rPr><w:t>   </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii=\"Courier New\" w:h-ansi=\"Courier New\" w:cs=\"Courier New\" w:hint=\"fareast\"/><wx:font wx:val=\"Courier New\"/><w:color w:val=\"000000\"/><w:kern w:val=\"0\"/><w:sz w:val=\"16\"/><w:sz-cs w:val=\"16\"/></w:rPr><w:t> </w:t></w:r></w:p><w:p><w:pPr><w:framePr w:hspace=\"180\" w:wrap=\"around\" w:vanchor=\"text\" w:hanchor=\"text\" w:x=\"284\" w:y=\"1\"/><w:autoSpaceDE w:val=\"off\"/><w:autoSpaceDN w:val=\"off\"/><w:adjustRightInd w:val=\"off\"/><w:suppressOverlap/><w:jc w:val=\"left\"/><w:rPr><w:rFonts w:ascii=\"Courier New\" w:h-ansi=\"Courier New\" w:cs=\"Courier New\" w:hint=\"fareast\"/><wx:font wx:val=\"Courier New\"/><w:color w:val=\"000000\"/><w:kern w:val=\"0\"/><w:sz w:val=\"16\"/><w:sz-cs w:val=\"16\"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii=\"Courier New\" w:h-ansi=\"Courier New\" w:cs=\"Courier New\" w:hint=\"fareast\"/><wx:font wx:val=\"Courier New\"/><w:color w:val=\"000000\"/><w:kern w:val=\"0\"/><w:sz w:val=\"16\"/><w:sz-cs w:val=\"16\"/></w:rPr><w:t> </w:t></w:r></w:p><w:p><w:pPr><w:framePr w:hspace=\"180\" w:wrap=\"around\" w:vanchor=\"text\" w:hanchor=\"text\" w:x=\"284\" w:y=\"1\"/><w:autoSpaceDE w:val=\"off\"/><w:autoSpaceDN w:val=\"off\"/><w:adjustRightInd w:val=\"off\"/><w:suppressOverlap/><w:jc w:val=\"left\"/><w:rPr><w:rFonts w:ascii=\"Courier New\" w:h-ansi=\"Courier New\" w:cs=\"Courier New\" w:hint=\"fareast\"/><wx:font wx:val=\"Courier New\"/><w:kern w:val=\"0\"/><w:sz w:val=\"16\"/><w:sz-cs w:val=\"16\"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii=\"Courier New\" w:h-ansi=\"Courier New\" w:cs=\"Courier New\" w:hint=\"fareast\"/><wx:font wx:val=\"Courier New\"/><w:color w:val=\"000000\"/><w:kern w:val=\"0\"/><w:sz w:val=\"16\"/><w:sz-cs w:val=\"16\"/></w:rPr><w:t> </w:t></w:r><w:r><w:rPr><w:rFonts w:ascii=\"Courier New\" w:h-ansi=\"Courier New\" w:cs=\"Courier New\"/><wx:font wx:val=\"Courier New\"/><w:color w:val=\"000000\"/><w:kern w:val=\"0\"/><w:sz w:val=\"16\"/><w:sz-cs w:val=\"16\"/></w:rPr><w:t>             </w:t></w:r></w:p></w:tc></w:tr></w:tbl>";

			String bt1 = bt.replace("gqjclass",jsonobject.getString("batch_name"));
//					.replace("factory_num", "")
//					.replace("bxgs", "")
//					.replace("gqjstandard", "")
//					.replace("Useraddr", "")
//					.replace("factoryname", "")
//					.replace("voltage_grade", "");
			bt2=bt2+bt1;
		}
		return bt2;
	}
//得到64位编码的二维码图片的编码
	public  static String getBufferedImgBase64CodeStr(String msg) {
		String base64=null;
		try {
			base64 = create_image(msg);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return  base64;
	}
	//创造二维码图片
	public static String create_image(String msg){
		byte[] data=null;
		try{
			Qrcode testQrcode =new Qrcode();
			// 设置二维码排错率,可选L(7%)、M(15%)、Q(25%)、H(30%),
			// 排错率越高可存储的信息越少,但对二维码清晰度的要求越小
			testQrcode.setQrcodeErrorCorrect('M');
			testQrcode.setQrcodeEncodeMode('B');
			testQrcode.setQrcodeVersion(7);
			String testString = msg;
			byte[] d = testString.getBytes("gbk");
			BufferedImage bi = new BufferedImage(98, 98, BufferedImage.TYPE_BYTE_BINARY);
			Graphics2D g = bi.createGraphics();
			g.setBackground(Color.WHITE);
			g.clearRect(0, 0, 98, 98);
			g.setColor(Color.BLACK);

			if (d.length>0 && d.length <120){
				boolean[][] s = testQrcode.calQrcode(d);
				for (int i=0;i<s.length;i++){
					for (int j=0;j<s.length;j++){
						if (s[j][i]) {
							g.fillRect(j*2+3,i*2+3,2,2);
						}
					}
				}
			}
			g.dispose();
			bi.flush();
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			ImageIO.write(bi, "jpg", baos);
			data = baos.toByteArray();

		}
		catch (Exception e) {
			e.printStackTrace();
		}
		BASE64Encoder encoder = new BASE64Encoder();
		return encoder.encode(data);// 返回Base64编码后的字节字符串

	}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值