如何在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
相关产品推荐
相关产品推荐

