我正在使用JSPDF在IE 8以外的所有浏览器的应用程序的客户端生成PDF文件,以便脱机兼容。由于JSPDF不与IE8一起工作(IE8限制了HTTP GET的大小),因此解决方案是对API操作发布一个帖子,该文件将文件保存在服务器上,并返回一个链接到它所托管的客户端。 (IE8支持不需要离线)。
我将JSPDF输出的原始字节发布到服务器,只要PDF中没有图像,它就可以保存PDF。存在图像时,数据已损坏,并在尝试打开文件时导致内存溢出。
为什么图片加密不正确?我最初的猜测是原始字节包含非法字符,但快速检查PDF文件源表明可能不是这种情况。
控制器操作:
public struct PdfBytesContainer
{
public byte[] RawPdfBytes { get; set; }
}
[HttpPost]
public string Post(PdfBytesContainer container)
{
var fileName = "test";
File.WriteAllBytes(@"PathToFile\File.pdf", container.RawPdfBytes);
return fileName;
}
AJAX POST:
var pdfData = {
rawPdfBytes: doc.output()//.substring(0, 100)
};
$.ajax({
url: pdfApiUrl,
type: "POST",
data: pdfData,
success: function(response) {
var url = "/Content/Pdfs/" + response + ".pdf";
window.open(url,'_blank');
},
failure: function(response) {
alert("failed " + response);
}
});
注意:我也尝试在PdfBytesContainer结构中使用字符串而不是byte []。我得到了同样的错误。
答案 0 :(得分:0)
尝试发送Blob [1]或ArrayBuffer [2]而不是原始字节。
[1]:doc.output(“blob”);
[2]:doc.output(“arraybuffer”); //需要最新的jsPDF版本
即:
var fd = new FormData();
fd.append("csrf", someToken);
fd.append("blob", doc.output("blob"));
$.ajax({
url: pdfApiUrl,
type: "POST",
data: fd,
processData: false,
contentType: "multipart/form-data",
...
});
显然,你也需要调整服务器端代码。