如何在Visual Studio 2022中将Syncfusion Blazor透视表与透视图表导出至单PDF页
合并透视表与透视图表为单个PDF文件的解决方案
核心思路
先分别获取透视表和图表的PDF字节流,再通过PDF合并库将两个PDF文件合并为一个,最后统一输出下载。
实现步骤
1. 调整导出方法,获取PDF字节数组
修改原有的导出逻辑,让ExportToPdfAsync和ExportToChartAsync不再直接触发下载,而是返回PDF的字节数组:
// 获取透视表PDF字节数组 private async Task<byte[]> GetPivotTablePdfBytes() { using var memoryStream = new MemoryStream(); // 假设你的透视表控件支持导出到MemoryStream await pivotTable.ExportToPdfAsync(memoryStream); return memoryStream.ToArray(); } // 获取透视图表PDF字节数组 private async Task<byte[]> GetPivotChartPdfBytes() { using var memoryStream = new MemoryStream(); // 假设你的图表控件支持导出到MemoryStream await pivotChart.ExportToChartAsync(memoryStream); return memoryStream.ToArray(); }
2. 合并两个PDF文件
选择一个PDF处理库实现合并,以下是两种常见库的实现方式:
方式一:使用iTextSharp
先安装NuGet包:
Install-Package iTextSharp
合并方法:
private byte[] MergePdfsWithiTextSharp(byte[] tablePdfBytes, byte[] chartPdfBytes) { using var mergedStream = new MemoryStream(); var document = new iTextSharp.text.Document(); var pdfCopy = new iTextSharp.text.pdf.PdfCopy(document, mergedStream); document.Open(); // 添加透视表PDF的所有页面 var tableReader = new iTextSharp.text.pdf.PdfReader(tablePdfBytes); for (int pageNum = 1; pageNum <= tableReader.NumberOfPages; pageNum++) { pdfCopy.AddPage(pdfCopy.GetImportedPage(tableReader, pageNum)); } tableReader.Close(); // 添加透视图表PDF的所有页面 var chartReader = new iTextSharp.text.pdf.PdfReader(chartPdfBytes); for (int pageNum = 1; pageNum <= chartReader.NumberOfPages; pageNum++) { pdfCopy.AddPage(pdfCopy.GetImportedPage(chartReader, pageNum)); } chartReader.Close(); document.Close(); return mergedStream.ToArray(); }
方式二:使用PdfSharp
先安装NuGet包:
Install-Package PdfSharp
合并方法:
private byte[] MergePdfsWithPdfSharp(byte[] tablePdfBytes, byte[] chartPdfBytes) { using var mergedStream = new MemoryStream(); var mergedDocument = new PdfSharp.Pdf.PdfDocument(); // 导入透视表PDF using var tableStream = new MemoryStream(tablePdfBytes); var tableDocument = PdfSharp.Pdf.IO.PdfReader.Open(tableStream, PdfSharp.Pdf.IO.PdfDocumentOpenMode.Import); foreach (var page in tableDocument.Pages) { mergedDocument.AddPage(page); } // 导入透视图表PDF using var chartStream = new MemoryStream(chartPdfBytes); var chartDocument = PdfSharp.Pdf.IO.PdfReader.Open(chartStream, PdfSharp.Pdf.IO.PdfDocumentOpenMode.Import); foreach (var page in chartDocument.Pages) { mergedDocument.AddPage(page); } mergedDocument.Save(mergedStream); return mergedStream.ToArray(); }
3. 触发合并导出的后端方法
在Razor页面的后台代码中添加处理导出的POST方法:
public async Task<IActionResult> OnPostExportCombinedPdf() { // 获取两个PDF的字节数组 var tableBytes = await GetPivotTablePdfBytes(); var chartBytes = await GetPivotChartPdfBytes(); // 合并PDF var mergedPdfBytes = MergePdfsWithiTextSharp(tableBytes, chartBytes); // 或者用PdfSharp的方法:MergePdfsWithPdfSharp(tableBytes, chartBytes); // 返回合并后的文件供下载 return File(mergedPdfBytes, "application/pdf", "PivotTable_Chart_Combined.pdf"); }
4. 前端添加导出按钮
在Razor页面中添加表单按钮,触发合并导出:
<form method="post" asp-page-handler="ExportCombinedPdf"> <button type="submit" class="btn btn-primary">导出合并PDF</button> </form>
注意事项
- 如果你的透视表/图表控件不支持直接导出到
MemoryStream,需要查阅控件文档,确认是否有重载方法支持流输出,或者调整控件的导出配置,避免直接触发响应下载。 - 注意PDF处理库的版本兼容性,确保与你的.NET版本匹配。
内容的提问来源于stack exchange,提问作者SHUHAIRA K.A
相关产品推荐
相关产品推荐

