【问题标题】:Blank PDF being generated from ActiveReports/WebAPI从 ActiveReports/WebAPI 生成的空白 PDF
【发布时间】: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


    【解决方案1】:

    所以,事实证明我的服务器端代码完全正常。客户端代码已关闭。

    我不需要对从服务器返回的数据进行 Blob 和所有这些工作,而是构建一个 URL...并调用 $window.open(url); 这是因为我的服务器代码将返回 PDF 文件原样。

    【讨论】:

      猜你喜欢
      • 2012-09-13
      • 2018-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-31
      • 1970-01-01
      • 2021-06-13
      相关资源
      最近更新 更多