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

如何在C# Blazor .NET 6中使用ITextSharp下载编辑后的PDF文件

问题原因
  • JS代码拼写错误:你写的Unit8Array为拼写错误,正确应为Uint8Array,该错误会导致JS函数执行失败,反向触发.NET层抛出空参数异常。
  • 参数类型不匹配:C#代码直接传递byte[]类型到JS,Blazor默认会将byte[]序列化为JS侧的Uint8Array类型,但你的JS函数第二个参数预期接收base64编码字符串,类型不匹配导致JS逻辑执行出错。
  • 调试器中MemoryStream的异常属于正常现象:PdfStamper关闭时默认会同步关闭关联的MemoryStream,调试时访问流的Length、Position等属性会抛出流已关闭的异常,但调用ToArray()方法不受流关闭影响,可正常返回已写入的所有字节,不属于代码问题。
可行实现方案

以下两种方案二选一即可:

方案1:适配现有JS逻辑,修改C#代码传递base64字符串

首先修正JS中的拼写错误,将Unit8Array替换为Uint8Array。
C#代码调整如下,将字节数组转为base64字符串后再调用JS:

using MemoryStream output = new MemoryStream();
using PdfReader pdfReader = new PdfReader("你的实际PDF文件路径");
using PdfStamper pdfStamper = new PdfStamper(pdfReader, output);

// 你的PDF编辑逻辑
pdfStamper.FormFlattening = false;
pdfStamper.Close();

// 字节数组转base64字符串
string base64Content = Convert.ToBase64String(output.ToArray());
await JSRuntime.InvokeVoidAsync("saveAsFile", "test.pdf", base64Content);

方案2:优化JS逻辑直接接收字节数组,性能更高(推荐)

该方案无需转base64,适合大体积PDF下载,JS代码修改为:

function saveAsFile(filename, bytes) {
    // 直接基于传入的Uint8Array生成Blob
    const blob = new Blob([bytes], { type: "application/pdf" });
    const objectUrl = URL.createObjectURL(blob);
    const link = document.createElement("a");
    link.download = filename;
    link.href = objectUrl;
    document.body.appendChild(link);
    link.click();
    // 清理资源避免内存泄漏
    document.body.removeChild(link);
    URL.revokeObjectURL(objectUrl);
}

C#代码无需做base64转换,直接传递字节数组即可:

using MemoryStream output = new MemoryStream();
using PdfReader pdfReader = new PdfReader("你的实际PDF文件路径");
using PdfStamper pdfStamper = new PdfStamper(pdfReader, output);

pdfStamper.FormFlattening = false;
pdfStamper.Close();

await JSRuntime.InvokeVoidAsync("saveAsFile", "test.pdf", output.ToArray());

内容的提问来源于stack exchange,提问作者M. Rogers

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 05:15:03