Изображение, портящее файл PDF при создании на сервере; не происходит при генерации клиентом

Я использую 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);
    }
});

Примечание. Я также пытался использовать строку вместо byte[] в структуре PdfBytesContainer. Я получаю ту же ошибку.


person jokulmorder    schedule 31.03.2014    source источник


Ответы (1)


Попробуйте отправить Blob[1] или ArrayBuffer[2], а не необработанные байты.

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

[2] : doc.output("буфер массива"); // требуется последняя версия jsPDF

I.e:

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

Очевидно, вам также потребуется адаптировать код на стороне сервера.

person diegocr    schedule 29.04.2014