如何使用 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()
被编辑后。 (见问题)。
我有一个 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()
被编辑后。 (见问题)。