大家好,我在尝试使用 javascript 发布通过 jsPDF 生成的 PDF 文件时遇到了很多麻烦。我使用 pdf.output('datauristring') 方法获取 PDF 文件的 base64,但我无法理解如何将其发送到控制器而不在控制台中出现“非法调用”错误。
function testPdfSend() {
let pdf = new jsPDF('p', 'pt', 'a3'); // a4: part of the page is cut off?
pdf.html(document.body, {
callback: function (pdf) {
var pdfContent = pdf.output('datauristring');
$.ajax({
url: "/Jobs/SendEmailTest",
type: 'POST',
contentType: 'application/json',
data: {data : JSON.stringify(pdfContent)}
});
}
});
}
控制器/服务器端代码:
public ActionResult SendEmailTest(string data)
{
//create pdf
var pdfBinary = Convert.FromBase64String(data);
return null;
}
更新:
已尝试使用输出('blob')方法,我可以看到控制器方法被击中,但数据字符串为空。
function testPdfSend() {
var doc = new jsPDF("l", "pt", "letter");
var file = doc.output('blob');
var fd = new FormData(); // To carry on your data
fd.append('data',file);
$.ajax({
url: "/Jobs/SendEmailTest",
data: fd,
dataType: 'text',
processData: false,
contentType: false,
type: 'POST'
});
}
服务器方法不变
好吧,我已经找到了一个可行的解决方案(感谢 chiliNUT 的指导)。我已将其应用到我的预期用途 Invoice pdf Web 应用程序中,现在也按预期工作。具有更好编码知识的人可以让我知道这个解决方案是否有好处吗?我从未使用过“Request.Form”来访问表单数据,这是正确的用法吗?:
var file = doc.output('blob');
var fd = new FormData(); // To carry on your data
fd.append('testString',file);
$.ajax({
url: "/Jobs/SendInvoiceEmail",
data: fd,
dataType: 'text',
processData: false,
contentType: false,
type: 'POST'
});
服务器端:
public ActionResult SendInvoiceEmail(byte[] testString)
{
//create pdf file
var file = Request.Form.Files[0];
string fileName = Path.GetFileName(test.FileName);
var attachment = new Attachment(file.OpenReadStream(), "invoice.pdf");
//From here the attachment when emailed shows as intended as a .pdf file
}