【发布时间】:2016-05-03 14:29:13
【问题描述】:
在我正在进行的一个项目中,我正在构建一个功能,让用户可以根据存储在我们数据库中的信息按需生成报告——在我的例子中,它将放在信封上。我要解决的问题是正在生成一个空白 PDF。
我已经尝试了一些健全性检查。首先,我在 Visual Studio 中设置了一个断点,并确保传递给报表的模型具有固定数据;报告是空白的。接下来,我尝试包含一个未绑定到任何数据的静态标签,以确定它是否是报表数据绑定问题 - 静态标签也没有出现在生成的报表中。
更令人讨厌的是,我过去使用过类似的代码而没有问题。我不知道为什么在这种情况下会生成一个空白的 PDF 文件。
我已阅读 StackOverflow 提供的“类似问题”,特别是 this question from one year ago,但它没有答案,因此没有什么可学的。我也尝试了必要的 Google 搜索,但没有发现任何相关内容。
我唯一不能提供的是实际的 ActiveReport 本身。我已经检查了这个愚蠢的程序员错误™,比如隐藏所有东西,或者透明标签,或者类似的愚蠢的东西。 很遗憾,我没有犯过这样的错误。
举报代码:
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;
}
}
客户端服务(Angular):
(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;
}
})();
客户端控制器(Angular):
(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。另一个潜在的故障点是客户端代码——我以前没有通过这种方式在服务器和客户端之间传递报告。
【问题讨论】:
标签: c# angularjs pdf asp.net-web-api activereports