我正在使用Microsoft API Graph API从我的OneDrive获取PDF文件,我已通过以下行成功获取该文件:
var streamFile = await graphClient.Me.Drive.Items["{item-id}"].Content.Request().GetAsync();
现在我想获取这个文件的流,并用iTextSharp 编辑它
using (MemoryStream outFile = new MemoryStream())
{
//Dont know what to replace this with
PdfReader pdfReader = new PdfReader("Uploads/Document.pdf");
PdfStamper pdfStamper = new PdfStamper(pdfReader, outFile);
AcroFields fields = pdfStamper.AcroFields;
fields.SetField("Full_Names", "aaa");
pdfStamper.Close();
pdfReader.Close();
}
然后上传回OneDrive,我可以通过以下方式完成:
//Don't know what to replace this with
var uploadPath = System.Web.HttpContext.Current.Server.MapPath("~/Uploads/NewDocument.pdf");
byte[] data = System.IO.File.ReadAllBytes(uploadPath);
Stream stream = new MemoryStream(data);
await graphClient.Me.Drive.Items["{item-id}"].ItemWithPath("NewDocument.pdf").Content.Request().PutAsync<DriveItem>(stream);
所以我的问题是,我如何获取我得到的文件并使用iTextSharp来完成它的工作?这样我就可以上传这个新编辑的文件了吗?
更新
我试过这个:
var streamFile = await graphClient.Me.Drive.Items["{item-id}"].Content.Request().GetAsync();
using (MemoryStream outFile = new MemoryStream())
{
PdfReader pdfReader = new PdfReader(streamFile);
PdfStamper pdfStamper = new PdfStamper(pdfReader, outFile);
AcroFields fields = pdfStamper.AcroFields;
fields.SetField("Full_Names", "JIMMMMMMAYYYYY");
await graphClient.Me.Drive.Items["{item-id}"].ItemWithPath("NewDocument-2.pdf").Content.Request().PutAsync<DriveItem>(outFile);
pdfStamper.Close();
pdfReader.Close();
}
但是得到了这个错误:
无法访问已关闭的流。
我可以看到该文件正在上传到我的OneDrive,但当我打开它时,我会收到以下错误:
加载PDF文档失败。
我做错了什么?
更新
当我删除最后两行时:
pdfStamper.Close();
pdfReader.Close();
我再也不能访问关闭的流错误了,我的文件上传了,但当我打开它时,我得到了一个错误:
加载PDF文档失败。
更新
当我尝试这个时
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编辑它。
看看这是否有助于您:
我需要将流(C#(重置回起始位置吗?
一旦你阅读了一个流,你需要把它重置回开头,用它做其他事情