0

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

4

1 回答 1

0

尝试发送 Blob[1] 或 ArrayBuffer[2] 而不是原始字节。

[1] : doc.output("blob");

[2] : doc.output("arraybuffer"); // 需要最新的 jsPDF 版本

IE:

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

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

于 2014-04-29T08:31:47.670 回答