У меня возникла проблема с рендерингом PDF-файла с помощью EVOPdf из контроллера WebAPI в приложение AngularJS.
Это мой код до сих пор:
Угловой вызов:
var url = 'api/form/build/' + id;
$http.get(url, null, { responseType: 'arraybuffer' })
.success(function (data) {
var file = new Blob([data], { type: 'application/pdf' });
if (window.navigator && window.navigator.msSaveOrOpenBlob) {
window.navigator.msSaveOrOpenBlob(file);
}
else {
var objectUrl = URL.createObjectURL(file);
window.open(objectUrl);
}
});
Метод API-контроллера:
var url = "http://localhost/index.html#/form/build/" + id;
#region PDF Document Setup
HtmlToPdfConverter htmlToPdfConverter = new HtmlToPdfConverter();
htmlToPdfConverter.LicenseKey = "4W9+bn19bn5ue2B+bn1/YH98YHd3d3c=";
//htmlToPdfConverter.HtmlViewerWidth = 1024; //default
htmlToPdfConverter.PdfDocumentOptions.PdfPageSize = PdfPageSize.A4;
htmlToPdfConverter.PdfDocumentOptions.PdfPageOrientation = PdfPageOrientation.Portrait;
htmlToPdfConverter.ConversionDelay = 3;
htmlToPdfConverter.MediaType = "print";
htmlToPdfConverter.PdfDocumentOptions.LeftMargin = 10;
htmlToPdfConverter.PdfDocumentOptions.RightMargin = 10;
htmlToPdfConverter.PdfDocumentOptions.TopMargin = 10;
htmlToPdfConverter.PdfDocumentOptions.BottomMargin = 10;
htmlToPdfConverter.PdfDocumentOptions.TopSpacing = 10;
htmlToPdfConverter.PdfDocumentOptions.BottomSpacing = 10;
htmlToPdfConverter.PdfDocumentOptions.ColorSpace = ColorSpace.RGB;
// Set HTML content destination in PDF page
htmlToPdfConverter.PdfDocumentOptions.Width = 640;
htmlToPdfConverter.PdfDocumentOptions.FitWidth = true;
htmlToPdfConverter.PdfDocumentOptions.StretchToFit = true;
#endregion
byte[] outPdfBuffer = htmlToPdfConverter.ConvertUrl(url);
string outPdfFile = @"c:\temp\forms\" + id + ".pdf";
System.IO.File.WriteAllBytes(outPdfFile, outPdfBuffer);
HttpResponseMessage result = null;
result = Request.CreateResponse(HttpStatusCode.OK);
result.Content = new ByteArrayContent(outPdfBuffer.ToArray());
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
result.Content.Headers.ContentDisposition.FileName = "filename.pdf";
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
return result;
Когда я проверяю PDF-файл, который я записываю с помощью WriteAllBytes
, он отображается отлично, но когда он возвращается через вызов Angular и открывается в Adobe Reader, я получаю всплывающее сообщение об ошибке "Недопустимое цветовое пространство" несколько раз, но документ не открывается. Когда я меняю цветовое пространство на GrayScale, PDF-файл открывается, но он пустой.
У меня такое ощущение, что проблема возникает из-за преобразования ByteArrayContent
, поскольку это единственное, что происходит между фактическим созданием PDF-файла и отправкой его обратно на вызов Angular, но я наткнулся на кирпичную стену и не могу разобраться в чем проблема.
Я был бы очень признателен за любую помощь, которую вы, ребята, можете предложить, потому что я так близок к тому, чтобы разобраться с этим, и мне просто нужно, чтобы документ правильно «преобразовывался» при возвращении из звонка.
Заранее благодарю за любую помощь.
С уважением, Иоганн.