You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 10:01:02