2016-05-03 2 views
0

В проекте, над которым я работаю, я создаю функцию, которая позволяет пользователям создавать отчет - в моем случае он будет по конверту по требованию из информации, хранящейся в нашей базе данных. Проблема, которую я пытаюсь решить, заключается в том, что создается пустой PDF-файл.Пустой PDF создается из ActiveReports/WebAPI

Я пробовал некоторые проверки здравомыслия. Сначала я установил точку останова в Visual Studio и обеспечил, чтобы модели, передаваемые в отчет, имели фиксированные данные; отчеты были пустыми. Затем я попытался включить статический ярлык, который не привязан к каким-либо данным, чтобы определить, является ли это проблемой привязки данных отчета - статическая метка также не появляется в сгенерированном отчете.

Больше stymying, то, что я использовал аналогичный код в прошлом без проблем. Я не знаю, почему в этом случае будет создан пустой PDF-файл.

Я прочитал «Похожие вопросы», предоставленные StackOverflow, в частности this question from one year ago, но у него не было ответов, и, следовательно, ничего не узнать от него. Я также пробовал поиск в Google, но ничего не нашел.

Единственное, что я не могу предоставить, это сам ActiveReport. Я проверил это для Silly Programmer Errors ™, как будто все скрыто, или прозрачные метки, или подобные глупые вещи. К сожалению,, я не делал таких ошибок.

Report Код:

public partial class EnvelopeReport : SectionReport 
{ 
    public EnvelopeReport() 
    { 
     InitializeComponent(); 
    } 

    internal void RunReport(IEnumerable<PrintedAddress> model) 
    { 
     if (model != null) 
     { 
      DataSource = model; 
     } 

     Run(); 
    } 

    private void OnReportStart(object sender, EventArgs e) 
    { 
     Document.Printer.PrinterName = string.Empty; 
     PageSettings.PaperKind = PaperKind.Number10Envelope; 

     PageSettings.Margins.Top = 0.25f; 
     PageSettings.Margins.Left = 0.5f; 
     PageSettings.Margins.Right = 0.5f; 
     PageSettings.Margins.Bottom = 0.25f; 
    } 
} 

Web API код контроллера:

[HttpGet] 
    public HttpResponseMessage EnvelopeReport(int addressId, string attentionTo, bool isConfidential) 
    { 
     Address address = AddressRepository.GetAddress(addressId, true); 
     List<PrintedAddress> models = new List<PrintedAddress> 
     { 
      new PrintedAddress(address, attentionTo, isConfidential) 
     }; 

     var report = new EnvelopeReport(); 
     report.RunReport(models); 

     var pdfExporter = new ActiveReportsPdfExporter(); 
     var reportBytes = pdfExporter.ExportPdf(report); 

     var response = Request.CreateResponse(HttpStatusCode.OK); 
     response.Content = new ByteArrayContent(reportBytes, 0, reportBytes.Length); 
     response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") 
     { 
      FileName = "Envelope Report.pdf" 
     }; 

     return response; 
    } 

PDF Экспортер:

public class ActiveReportsPdfExporter 
{ 
    private readonly PdfExport _pdfExport; 

    public ActiveReportsPdfExporter() 
    { 
     _pdfExport = new PdfExport(); 
    } 

    public byte[] ExportPdf(SectionReport report) 
    { 
     using (var stream = new MemoryStream()) 
     { 
      _pdfExport.Export(report.Document, stream); 
      return stream.ToArray(); 
     } 
    } 

    public Stream ExportPdfToStream(SectionReport report) 
    { 
     var stream = new MemoryStream(); 
     _pdfExport.Export(report.Document, stream); 
     return stream; 
    } 
} 

Client Service (Угловое):

(function() { 
    angular.module('app').factory('addressSvc', [ 
     '$http', addressSvc 
    ]); 

    function addressSvc($http) { 
     var service = { 
      printAddress: function(addressId, attentionTo, someFlag) { 
       var args = { 
        'addressId': thingId, 
        'attentionTo': attentionTo, 
        'isConfidential': isConfidential 
       }; 

       return $http.get('/api/common/EnvelopeReport', { 'params': args }); 
      } 
     }; 

     return service; 
    } 
})(); 

Client Controller (Угловое):

(function() { 
    angular.module('app').controller('someCtrl', [ 
     '$window', 'addressSvc', controller 
    ]); 

    function controller($window, addressSvc) { 
     var vm = this; 
     vm.attentionTo = ''; // Bound to UI. 
     vm.isConfidential = ''; // Also bound to UI. 
     vm.address = {};  // Unimportant how we get this. 
     vm.printAddress = printAddress; 

     function printAddress() { 
      addressSvc.printAddress(vm.address.id, vm.attentionTo, vm.isConfidential) 
       .then(function(result) { 
        var file = new Blob([result], {type: 'application/pdf'}); 
        var fileURL = URL.createObjectURL(file); 

        if(window.navigator && window.navigator.msSaveOrOpenBlob) { 
         window.navigator.msSaveOrOpenBlob(file, 'Envelope.pdf'); 
        } else { 
         $window.open(fileURL); 
        } 
       }); 
     } 
    } 
)(); 

Вопрос: Почему этот код генерации пустой PDF? Я использовал структуру Report/API Controller в прошлом для создания PDF-файлов, но обычно в контексте MVC, а не для Web API. Другой потенциальной точкой отказа является клиентский код - я ранее не передавал отчеты между сервером и клиентом.

ответ

0

Таким образом, мой серверный код был полностью нормальным. Код клиента отключен.

Вместо того, чтобы всплывать данные, возвращенные с сервера, и все эти работы, мне вместо этого нужно было создать URL-адрес ... и вызвать $window.open(url);. Это связано с тем, что мой серверный код в нем будет возвращать файл PDF как -является.