如何在 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
发送可能 File 或 Blob 对象是常见设置,
看看 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
}
)
}
我正在尝试对附加代码中生成的文档进行编码,但没有任何反应,没有生成错误但也没有对文件进行编码,并且 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
发送可能 File 或 Blob 对象是常见设置, 看看 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
}
)
}