【发布时间】:2020-03-09 19:04:15
【问题描述】:
我有这个文件,它是一个 Stream:
var streamFile = await graphClient.Me.Drive.Items["id"].Content.Request().GetAsync();
现在我正在尝试使用 PdfReader 和 PdfStamper 来设置字段,如下所示:
MemoryStream outFile = new MemoryStream();
PdfReader pdfReader = new PdfReader(streamFile);
PdfStamper pdfStamper = new PdfStamper(pdfReader, outFile);
AcroFields fields = pdfStamper.AcroFields;
fields.SetField("Full_Names", "JIMMMMMMAYYYYY");
pdfStamper.Close();
pdfReader.Close();
但是当我尝试这样做时,我得到了这个错误:
无法访问已关闭的 Stream。
在这一行:
pdfReader.Close();
我做错了什么?
更新
我试过了,还是一样的错误:
using (MemoryStream outFile = new MemoryStream())
{
var streamFile = await graphClient.Me.Drive.Items["item-id"].Content.Request().GetAsync();
using (PdfReader pdfReader = new PdfReader(streamFile))
{
using (PdfStamper pdfStamper = new PdfStamper(pdfReader, outFile))
{
AcroFields fields = pdfStamper.AcroFields;
fields.SetField("Full_Names", "JIMMMMMMAYYYYY");
}
}
outFile.Position = 0;
await graphClient.Me.Drive.Items["item-id"].ItemWithPath("NewDocument-2.pdf").Content.Request().PutAsync<DriveItem>(outFile);
}
更新
我已经尝试将 Stream 转换为这样的字节:
var streamFile = await graphClient.Me.Drive.Items["item-id"].Content.Request().GetAsync();
byte[] buffer = new byte[16 * 1024];
using (MemoryStream ms = new MemoryStream())
{
int read;
while ((read = streamFile.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
}
using (PdfReader pdfReader = new PdfReader(ms.ToArray()))
{
using (PdfStamper pdfStamper = new PdfStamper(pdfReader, ms))
{
AcroFields fields = pdfStamper.AcroFields;
fields.SetField("Full_Names", "JIMMMMMMAYYYYY");
}
}
await graphClient.Me.Drive.Items["item-id"].ItemWithPath("NewDocument-2.pdf").Content.Request().PutAsync<DriveItem>(ms);
}
同样的结果...无法在这一行访问已关闭的 Stream:
await graphClient.Me.Drive.Items["item-id"].ItemWithPath("NewDocument-2.pdf").Content.Request().PutAsync<DriveItem>(ms);
PutAsync 也需要一个 Stream
所以当我这样做时:
var streamFile = await graphClient.Me.Drive.Items["item-id"].Content.Request().GetAsync();
await graphClient.Me.Drive.Items["item-id"].ItemWithPath("NewDocument-2.pdf").Content.Request().PutAsync<DriveItem>(streamFile);
上传文件没问题。所以我确实认为问题在于尝试使用 iTextSharp 编辑 PDF。
【问题讨论】:
-
现在哪里出错了?如果它在
outFile.Position = 0;上,那么您可以删除该行。 -
它在这条线上。 await graphClient.Me.Drive.Items["item-id"].ItemWithPath("NewDocument-2.pdf").Content.Request().PutAsync
(outFile); -
OK 所以你在
outFile流关闭后使用它。我会尝试在PdfStamperusing 块中移动这两行,或者创建一个新流来重新读取输出文件。 -
为防止 iText 关闭您的流,请尝试将该流中的所有字节读取到
byte[]并从该byte[]初始化PdfReader。 -
@mkl 我该怎么做?
标签: c# asp.net model-view-controller itext