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的效果不错!

posted on 2022-03-29 11:28  指尖跃动的电光,是我此生不灭的信仰  阅读(152)  评论(0)    收藏  举报