如何使用 ITextSharp 和 C# Blazor 下载编辑后的 ​​PDF

How to download edited PDF using ITextSharp and C# Blazor

我有一个 Blazor 应用程序,我正在尝试下载我使用 ITextSharp 编辑过的 PDF。我搜索的所有资源都倾向于使用我没有的 Response class(我相信是因为我使用的是 .NET 6)。我找到了一些将字节数组发送到 javascript 函数的解决方案,但我没有这样的运气。我收到错误

System.ArgumentNullException: 'Value cannot be null.' 当我调用JS函数时

我已经 post 编辑了下面的代码。虽然我没有传递任何空对象,但我确实在我的内存流中看到了一些潜在的错误,我不确定为什么(见图片)。任何关于我哪里出错的信息或任何简单的方法都将不胜感激。谢谢

    MemoryStream output = new MemoryStream();
    PdfReader pdfReader = new PdfReader("MY_SOURCE_PATH_CHANGED_FOR_POST");
    PdfStamper pdfStamper = new PdfStamper(pdfReader, output);

    // Make Edits
    //editPdf(ref pdfStamper.AcroFields);
    pdfStamper.FormFlattening = false;
    pdfStamper.Close();

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

和 JS

function saveAsFile(filename, bytesBase64)
{
    if (navigator.msSaveBlob) {
        var data = window.atob(bytesBase64);
        var bytes = new Unit8Array(data.length);
        for (var i = 0; i < data.length; i++) {
            bytes[i] = data.charCodeAt(i);
        }
        var blob = new Blob([bytes.buffer], { type: "application/octet-stream" });
        navigator.msSaveBlob(blob, filename);
    }
    else
    {
        var link = document.createElement("a");
        link.download = filename;
        link.href = "data:application/octet-stream;base64," + bytesBase64;
        document.body.appendChild(link);
        link.click();
        document.body.removeChild(link);
    }
}

*请注意,为了 post,我更改了源路径,但我已经验证该路径确实 return PDF,来自 Azure blob 存储的直接 URL。

对于任何需要它的人,我通过创建一个控制器解决了这个问题。

    [HttpGet("{appId}/{formCode}")]
    public FileContentResult DownloadForm(int appId, int formCode)
    {
        byte[] PdfData = Repo.GetFormBytes(appId, (Enums.FormType)formCode);
        if (PdfData != null)
        {
            FileContentResult file = new FileContentResult(PdfData, "application/pdf");
            file.FileDownloadName = Repo.MostRecentFileName;
            return file;
        }
        else
            return null;
    }

其中 GetFormBytes returns 字节数组 output.ToArray() 被编辑后。 (见问题)。