【问题标题】:Generate a pdf from multiple views using Rotativa?使用 Rotativa 从多个视图生成 pdf?
【发布时间】:2018-01-16 12:56:49
【问题描述】:

我想使用 2 个视图生成一个 pdf。我的目标是从第一个视图生成第一页,从第二个视图生成第二页。

这是我当前的代码:

var actionPDF = new Rotativa.ActionAsPdf("DownloadDividendSummaryPdf", new { ReportType = DividendType, Time = DividendTime })
                {
                    FileName = "DividendPortfolio" + email + ".pdf",
                    PageSize = Size.A4,
                    MinimumFontSize = 12,
                    //PageMargins = new Margins(3, 3, 3, 3),
                    IsGrayScale = true,
                    IsJavaScriptDisabled = true,
                    IsBackgroundDisabled = true,
                };

                actionPDF = new Rotativa.ActionAsPdf("DownloadDividendDetailedPdf", new { ReportType = DividendType, Time = DividendTime, StartDate = G_StartDate, todate = G_ToDate })
                {
                    FileName = "DividendPortfolio" + email + ".pdf",
                    PageSize = Size.A4,
                    MinimumFontSize = 12,
                    //PageMargins = new Margins(3, 3, 3, 3),
                    IsGrayScale = true,
                    IsJavaScriptDisabled = true,
                    IsBackgroundDisabled = true,
                };

【问题讨论】:

    标签: c# asp.net-mvc rotativa


    【解决方案1】:

    要么合并 PDF(不简单),要么简单地创建一个视图来呈现其他两个视图的输出,然后将 那个 视图呈现为 PDF。

    【讨论】:

    • 我为每个视图使用标题 html。那么如何创建一个同时呈现两者的视图呢?
    • 我的情况说明here
    【解决方案2】:

    需要将生成的字节数组合二为一。

    这是简化的设置:

            //Create single views
            ViewAsPdf view = new ViewAsPdf("ViewName", viewModel);
            byte[] viewData = view.BuildFile(ControllerContext);
    
            //Add them to array
            List<byte[]> viewDatas = new List<byte[]>();
            viewDatas.Add(viewData);
    
            //Combine them
            byte[] combinedViewData = combineViewData(viewDatas);
    

    这里是 combineViewData 辅助方法:

        private static byte[] combineViewData(List<byte[]> viewData)
        {
            byte[] combinedViewData = null;
    
            using (MemoryStream ms = new MemoryStream())
            {
                using (Document document = new Document())
                {
                    using (PdfCopy copy = new PdfCopy(document, ms))
                    {
                        document.Open();
    
                        foreach (byte[] arr in viewData)
                        {
                            using (MemoryStream viewStream = new MemoryStream(arr))
                            {
                                using (PdfReader reader = new PdfReader(viewStream))
                                {
                                    int n = reader.NumberOfPages;
                                    for (int page = 0; page < n;)
                                    {
                                        copy.AddPage(copy.GetImportedPage(reader, ++page));
                                    }
                                }
                            }
                        }
                    }
                }
                combinedViewData = ms.ToArray();
            }
            return combinedViewData;
        }
    

    【讨论】:

    • PDFCopy 是 Rotativa 吗?
    • PDFCopy 用于 iTextSharp
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    相关资源
    最近更新 更多