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

在ASP.NET Core中使用JSReport将多个HTML文件转为多页单PDF文件

多HTML文件合并生成单PDF(JSReport + C#)

需求说明

有多个HTML文件(如test.html、test2.html、test3.html),需通过JSReport生成单个PDF,要求每个HTML对应PDF的独立一页。现有代码仅支持传递单个HTML数据,需修改为支持多文件内容传入。

原代码

byte[] pdfBytes = new byte[5];
pdfBytes = await GetPdfReport(sbFirstParagraph.ToString());

// HtmlText: 目前仅传递单个文件数据,需改为传递多个HTML文件数据
public async Task<byte[]> GetPdfReport(string HtmlText)
{
    try
    {
        var reportObj = await jsreportObj.RenderAsync(new RenderRequest()
        {
            Template = new Template
            {
                Content = HtmlText, 
                Engine = Engine.None,
                Recipe = Recipe.ChromePdf,
                Chrome = new Chrome { MarginLeft = "0", MarginRight = "0", Format = "A4", Width = "100%" }
            },
            Options = new RenderOptions()
            {
                Preview = true,
                Timeout = 600000
            }
        });
        using (var memoryStream = new MemoryStream())
        {
            await reportObj.Content.CopyToAsync(memoryStream);
            return memoryStream.ToArray();
        }
    }
    catch (Exception e)
    {
        return new byte[] { };
    }
}

修改后的实现代码

调用示例

// 读取多个HTML文件内容(根据实际文件路径调整)
var htmlContents = new List<string>
{
    File.ReadAllText(@"path/to/test.html"),
    File.ReadAllText(@"path/to/test2.html"),
    File.ReadAllText(@"path/to/test3.html")
};

byte[] pdfBytes = await GetPdfReport(htmlContents);

改造后的GetPdfReport方法

public async Task<byte[]> GetPdfReport(IEnumerable<string> htmlContents)
{
    try
    {
        // 合并多个HTML内容,每个页面后添加强制分页符(最后一页自动省略)
        var mergedHtml = string.Join("<div style='page-break-after: always;'></div>", htmlContents);
        
        var reportObj = await jsreportObj.RenderAsync(new RenderRequest()
        {
            Template = new Template
            {
                Content = mergedHtml, 
                Engine = Engine.None,
                Recipe = Recipe.ChromePdf,
                Chrome = new Chrome { MarginLeft = "0", MarginRight = "0", Format = "A4", Width = "100%" }
            },
            Options = new RenderOptions()
            {
                Preview = true,
                Timeout = 600000
            }
        });
        
        using (var memoryStream = new MemoryStream())
        {
            await reportObj.Content.CopyToAsync(memoryStream);
            return memoryStream.ToArray();
        }
    }
    catch (Exception e)
    {
        // 建议添加异常日志记录,便于后续排查问题
        return Array.Empty<byte>();
    }
}

关键修改点

  • 参数调整:将方法参数从单个string改为IEnumerable<string>,支持传入多个HTML内容集合
  • 分页控制:使用CSS的page-break-after: always;在每个HTML内容之间插入强制分页标记,确保每个HTML独立占一页
  • 代码规范:用Array.Empty<byte>()替代new byte[] { },写法更简洁规范

内容的提问来源于stack exchange,提问作者nittin aggarwal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 13:55:14