sftp文件上传之将网页转成为pdf文件后上传至sftp端
1.开始的时候我采用的是iText类方式去把页面转成pdf,成功了,但是没有渲染样式。不符合要求。
public static void main(String[] args) throws Exception { //读取html文件 String htmlStr = readHtmlFile(); //将html文件转成PDF writeToOutputStreamAsPDF( formatHtml(htmlStr)); }/** * 读取 HTML 文件 * @return */ private static String readHtmlFile() { StringBuffer textHtml = new StringBuffer(); try { // File file = new File("src\\main\\webapp\\jkCustomerServe\\decision.jsp"); File file = new File("C:/Users/c'l'c/Desktop/审批工单.html"); BufferedReader reader = new BufferedReader(new FileReader(file)); String tempString = null; // 一次读入一行,直到读入null为文件结束 while ((tempString = reader.readLine()) != null) { textHtml.append(tempString); } reader.close(); } catch (IOException e) { return null; } return textHtml.toString(); }/** * 创建PDF文件 * @param htmlStr * @throws Exception */ private static void writeToOutputStreamAsPDF(String htmlStr) throws Exception { SimpleDateFormat fromt3 = new SimpleDateFormat("yyyy年MM月"); String nowDate = fromt3.format(new Date()); String targetFile = "C:/Users/c'l'c/Desktop/审批工单"+nowDate+".pdf"; File targeFile = new File(targetFile); if(targeFile.exists()) { targeFile.delete(); } //定义pdf文件尺寸,采用A4横切 Document document = new Document(PageSize.A4, 25, 25, 15, 40);// 左、右、上、下间距 //定义输出路径 PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(targetFile)); writer.setPageEvent(null); writer.addViewerPreference(PdfName.PRINTSCALING, PdfName.NONE); document.open(); // CSS CSSResolver cssResolver = new StyleAttrCSSResolver(); CssAppliers cssAppliers = new CssAppliersImpl(new XMLWorkerFontProvider(){ @Override public Font getFont(String fontname, String encoding, boolean embedded, float size, int style, BaseColor color) { try { //用于中文显示的Provider BaseFont bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); return new Font(bfChinese, size, style); } catch (Exception e) { return super.getFont(fontname, encoding, size, style); } } }); //html HtmlPipelineContext htmlContext = new HtmlPipelineContext(cssAppliers); htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory()); htmlContext.setImageProvider(new AbstractImageProvider() { @Override public Image retrieve(String src) { //支持图片显示 int pos = src.indexOf("base64,"); try { if (src.startsWith("data") && pos > 0) { byte[] img = Base64.decode(src.substring(pos + 7)); return Image.getInstance(img); } else if (src.startsWith("http")) { return Image.getInstance(src); } } catch (BadElementException ex) { return null; } catch (IOException ex) { return null; } return null; } @Override public String getImageRootPath() { return null; } }); // Pipelines PdfWriterPipeline pdf = new PdfWriterPipeline(document, writer); HtmlPipeline html = new HtmlPipeline(htmlContext, pdf); CssResolverPipeline css = new CssResolverPipeline(cssResolver, html); // XML Worker XMLWorker worker = new XMLWorker(css, true); XMLParser p = new XMLParser(worker); p.parse(new ByteArrayInputStream(htmlStr.getBytes())); document.close(); }上面的用iText类实现页面转pdf,下面是效果图
2.于是就不得不用转成图片再转成pdf的方式,html2canvaso.js与jspdfo.debug.js映入眼帘。
//改为归档触发 $("#pdf").click(function(){//触发事件执行转pdf。#pdf必须在要打印的div内! //var pdf = new jsPDF('', 'pt', 'a4'); var pdf = new jsPDF('landscape', 'pt', 'a3'); pdf.internal.scaleFactor = 1; //调节打印大小,数字越大打印越小 var options = { pagesplit: true //设置是否自动分页 }; $('#reportForm').css("background", "#fff")//如果导出的pdf为黑色背景,需要将导出的html模块内容背景 设置成白色。 //$('.dragscroll').css("overflow", "visible") var printHtml = $('#reportForm').get(0); // 通过id获取div内容 pdf.addHTML(printHtml,15, 15, options,function() { <%--pdf.save('jkbpa<s:date name="jkCustomerServe.proEndTime" format="yyyyMMdd" />${jkCustomerServe.processCode}.pdf');--%> //如果是直接报存就用save方法 var buffer = pdf.output("datauristring"); var myfile = dataURLtoFile(buffer, 'jkbpa<s:date name="jkCustomerServe.proEndTime" format="yyyyMMdd" />${jkCustomerServe.processCode}') var formdata = new FormData() formdata.append('file', myfile) <%--dataURLtoFile(buffer,'jkbpa<s:date name="jkCustomerServe.proEndTime" format="yyyyMMdd" />${jkCustomerServe.processCode}');--%> // fn(formdata) //回调函数 $.ajax({ url : ...!postPdf.action", type:'post', dataType:'json', async:false, processData:false,//这个一定要写 contentType:false,//这个一定要写 data: formdata, success:function(items){ }, error:function(){ } }); }); }) function dataURLtoFile(dataurl, filename) { var arr = dataurl.split(','); // console.log("arr"+arr) var mime = arr[0].match(/:(.*?);/)[1]; var bstr = atob(arr[1]); var n = bstr.length; var u8arr = new Uint8Array(n); while(n--){ u8arr[n] = bstr.charCodeAt(n); } //转换成file对象 return new File([u8arr], filename, {type:mime}); //转换成成blob对象 //return new Blob([u8arr],{type:mime}); }
<script src="common/js/html2canvaso.js" type="text/javascript"></script>
<script src="common/js/jspdfo.debug.js" type="text/javascript"></script>
2个js,网上可以找找,然后file就传到后台了就可以处理! 下面是附加上如果传来的是base64格式的(这种写法不支持老ie浏览器的话可以用base64传过去buffer这个参数就行了)。
//base64字符串转化成图片 public static File base64ToFile(String base64) throws Exception { if (base64.contains("data:application/pdf")) { base64 = base64.substring(base64.indexOf(",") + 1); } base64 = base64.toString().replace("\r\n", ""); //创建文件目录 String prefix = ".pdf"; File file = File.createTempFile(UUID.randomUUID().toString(), prefix); BufferedOutputStream bos = null; FileOutputStream fos = null; try { BASE64Decoder decoder = new BASE64Decoder(); byte[] bytes = decoder.decodeBuffer(base64); fos = new FileOutputStream(file); bos = new BufferedOutputStream(fos); bos.write(bytes); } finally { if (bos != null) { try { bos.close(); } catch (IOException e) { e.printStackTrace(); } } if (fos != null) { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } return file; }
/** * 把页面生成的pdf文件发送到sftp服务器端 * * @return String */ public Map<String,Object> postPdf() throws Exception { ChannelSftp channelSftp = new ChannelSftp(); try { if ("true".equals(SysConfigUtil.configProperties.getProperty("isdebug"))) {//测试环境 本地搭建就行FreeSSHd+FileZilla,很简单的 System.out.println("-------测试连接--------"); channelSftp = SftpUtil.connect("192.168.1.246",22,"sftp","123456","/bpmwh/bpmsftp/jkcs");//测试 }else{//正式环境 } } catch (Exception e) { e.printStackTrace(); } //jkbpa+yyyyMMdd+工单号.txt String fileName = "jkcs-"+ DateUtil.getFormatDateStr(new Date(),"yyyyMMdd")+".pdf"; channelSftp.cd("/bpmwh/bpmsftp/jkcs"); // File file=base64ToFile(buffer);//另一种写法,传来的base64 boolean bool = SftpUtil.UploadSFtpFile(channelSftp, file,fileName); logger.error("文件上传结果==============:"+bool); logger.info("文件传输成功!"); return null; }
pdf的效果不错!

浙公网安备 33010602011771号