我正在使用JSPDF在应用程序的客户端生成 PDF 文件,以便 IE 8 以外的所有浏览器都可以离线兼容。由于 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 发布:
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[]。我犯了同样的错误。