В проекте, над которым я работаю, я создаю функцию, которая позволяет пользователям создавать отчет - в моем случае он будет по конверту по требованию из информации, хранящейся в нашей базе данных. Проблема, которую я пытаюсь решить, заключается в том, что создается пустой 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. Другой потенциальной точкой отказа является клиентский код - я ранее не передавал отчеты между сервером и клиентом.