【问题标题】:How encode in base64 a file generated with jspdf and html2canvas?如何在 base64 中编码使用 jspdf 和 html2canvas 生成的文件?
【发布时间】:2016-11-28 07:33:08
【问题描述】:

我正在尝试对附加代码中生成的文档进行编码,但没有任何反应,不会产生错误,但也不会对文件进行编码,并且永远不会执行 ajax request

正确的方法是什么?

    html2canvas(document.getElementById("workAreaModel"), {
    onrendered: function(canvas)
    {
        var img = canvas.toDataURL("image/png");
        var doc = new jsPDF("l", "pt", "letter");
        doc.addImage(img, 'JPEG',20,20);
        var fileEncode = btoa(doc.output());
         $.ajax({
              url: '/model/send',
              data: fileEncode,
              dataType: 'text',
              processData: false,
              contentType: false,
              type: 'GET',
              success: function (response) {
                   alter('Exit to send request');
              },
              error: function (jqXHR) {
                  alter('Failure to send request');
              }
             });
    }
});

【问题讨论】:

  • doc.output() 返回什么? "/model/send" 是否期待 GET 请求?
  • 如果没有调试步骤和输出,这可能会作为“为什么此代码不起作用”问题的实例而被关闭。

标签: javascript jspdf html2canvas


【解决方案1】:

此代码用于从屏幕捕获 Html 页面并保存为 Pdf 并作为 blob 发送到后端 api

const filename = 'form.pdf';
    const thisData = this;
    this.printElement = document.getElementById('content');
     html2canvas(this.printElement).then(canvas => {
      this.pdfData = new jsPDF ('p', 'mm', 'a4');
      this.imageHeight = canvas.height * 208 / canvas.width;
      this.pdfData.addImage(canvas.toDataURL('image/png'), 'PNG', 0, 0, 208, this.imageHeight);
      this.pdfData.save(filename);
      this.uploadFile(this.pdfData.output('blob'));
    });
  }
  uploadFile(pdfFile: Blob) {
    this.uploadService.uploadFile(pdfFile)
      .subscribe(
       (data: any) => {
        if (data.responseCode === 200 ) {
          //succesfully uploaded to back end server
        }},
       (error) => {
         //error occured
       }
     )
  }

【讨论】:

    【解决方案2】:

    首先,jsPDF在javascript中不是本机的,请确保您包含正确的源代码,并且在查看其他参考资料后,我认为您不需要btoa()函数来转换doc.output(),只需指定像这样:

     doc.output('datauri');
    

    其次,base-64 编码的字符串可以包含 ' + '' / '' = ' ,它们不是URL safe 字符,你需要替换它们,否则你无法处理 ajax。

    但是,根据我自己的经验,根据文件的大小,很容易变得很长!在达到 GET 方法的字符长度限制之前,编码后的字符串会首先使您的 Web 开发工具崩溃,并且调试会很困难。

    我的建议,根据你的jquery代码

    processData: false,
    contentType: false
    

    常见的设置可能是发送 FileBlob 对象, 看看jsPDF,可以将您的数据转换为blob:

    doc.output('blob');
    

    所以彻底修改你的代码:

    var img = canvas.toDataURL("image/png");
    var doc = new jsPDF("l", "pt", "letter");
    doc.addImage(img, 'JPEG',20,20);
    var file = doc.output('blob');
    var fd = new FormData();     // To carry on your data  
    fd.append('mypdf',file);
    
    $.ajax({
       url: '/model/send',   //here is also a problem, depends on your 
       data: fd,           //backend language, it may looks like '/model/send.php'
       dataType: 'text',
       processData: false,
       contentType: false,
       type: 'POST',
       success: function (response) {
         alter('Exit to send request');
       },
       error: function (jqXHR) {
         alter('Failure to send request');
       }
    });
    

    如果您在后端使用 php,您可以查看您的数据信息:

    echo $_FILES['mypdf'];
    

    【讨论】:

    • 谢谢,我需要使用 doc.output('blob');
    • Carr,您为什么缺少 url 编码步骤?该网址是否已保存?
    • @Arendax ,doc.output('datauri') 已经为您提供了一个以 base64 编码的二进制数据字符串。
    • @Carr 好的,但我需要使用 doc.output('blob');。毕竟我没有使用你的方式,而是使用了另一种方式,所以没关系。
    • 2021 年更新,这需要是 doc.output("datauristring")
    猜你喜欢
    • 2019-04-06
    • 1970-01-01
    • 2017-05-27
    • 2020-07-11
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    相关资源
    最近更新 更多