图像在服务器上生成时损坏PDF文件;在客户端生成时不会发生

时间:2014-03-31 21:11:12

标签: c# asp.net-mvc pdf jspdf

我正在使用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 []。我得到了同样的错误。

1 个答案:

答案 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",
   ...
});

显然,你也需要调整服务器端代码。