Создать PDF из нескольких просмотров с помощью Rotativa?

Я хочу создать один PDF-файл, используя 2 представления. Моя цель - создать первую страницу из первого просмотра и вторую страницу из второго просмотра.

Это мой текущий код:

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,
                };

2 ответа

Либо объедините PDF-файлы (не тривиально), либо просто создайте представление, которое отображает выходные данные обоих других представлений, а затем отобразите это представление в PDF.

Вам необходимо объединить сгенерированные байтовые массивы в один.

Вот упрощенная настройка:

        //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);

Вот вспомогательный метод combViewData:

    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;
    }
Другие вопросы по тегам