如何在 base64 中编码用 jspdf 和 html2canvas 生成的文件?

How encode in base64 a file generated with jspdf and html2canvas?

我正在尝试对附加代码中生成的文档进行编码,但没有任何反应,没有生成错误但也没有对文件进行编码,并且 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');
              }
             });
    }
});

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

 doc.output('datauri');

其次,base-64编码的字符串可以包含 ' + ' , ' / ' , ' = ',它们不是URL安全的字符,需要替换它们,否则无法处理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'];

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

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