无法访问已关闭的流.使用PDFReader时



我有这个文件,它是一个流:

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();

但当我尝试这样做时,我会得到这个错误:

无法访问已关闭的流。

在线:

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);
}

更新

我已经尝试过将流转换为如下字节:

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);
}

相同的结果。。。无法访问此行上的关闭流:

await graphClient.Me.Drive.Items["item-id"].ItemWithPath("NewDocument-2.pdf").Content.Request().PutAsync<DriveItem>(ms);

PutAsync正在期待一个流以及

所以当我这样做的时候:

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。

在我的例子中,我想在内存中创建文档,并在创建文档后添加WaterMark,但没有保存物理文件作为中间步骤(这也很好,但不太整洁(。

public byte[] AsArray(List<DocumentData> list)
{
MemoryStream streamIn = new MemoryStream(); // Set the initial stream for the document
MemoryStream streamOut = new MemoryStream(); // Set the result output stream
PdfWriter writer = new PdfWriter(streamIn); // create the writer for document
CreateDocument(writer, list); // Method where the document actually get's made
// Now the tricky bit
// Translate the `streamIn` (that now contains the document stream) into a PdfReader
// use the byte[] from streamIn to create a new MemoryStream()
PdfReader reader = new PdfReader(new MemoryStream(streamIn.ToArray()));
writer = new PdfWriter(streamOut); // Set the writer stream to be the streamOut
SetWaterMark(reader, writer); // Method to read through the document and add watermarks
return streamOut.ToArray();
}

嘿,普雷斯托,成功了!

您可以尝试以下操作:

var streamFile = await graphClient.Me.Drive.Items["item-id"].Content.Request().GetAsync();
byte[] buffer = new byte[16 * 1024];
try
{
PdfReader pdfReader = null;
PdfStamper pdfStamper = null;
using (MemoryStream ms = new MemoryStream())
{
int read;
while ((read = streamFile.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
}
pdfReader = new PdfReader(ms.ToArray());
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);
}
}
finally
{
if (pdfReader != null) pdfReader.Dispose();
if (pdfStamper != null) pdfStamper.Dispose();
}

等待完成后,处理pdfReader和pdfStamper。

最新更新