Создать 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;
}