【问题标题】:C# - Microsoft Graph API with iTextSharp - Cannot access a closed StreamC# - 带有 iTextSharp 的 Microsoft Graph API - 无法访问已关闭的流
【发布时间】:2020-03-09 17:41:48
【问题描述】:

我正在使用 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();
            }

但是得到了这个错误:

无法访问已关闭的 Stream。

我可以看到文件正在上传到我的 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# asp.net itext microsoft-graph-api


    【解决方案1】:

    看看这是否对你有帮助:

    Do I need to reset a stream(C#) back to the start?

    一旦您读取了一个流,您需要将其重置回开始处以对其执行其他操作。

    【讨论】:

    • 尝试在调用 graph putAsync 之前设置“outFile.Position = 0”。
    • 另外,不知道我记得在哪里看到过这个,但我认为最大大小是 4MB。可能也想验证一下。否则,您将需要使用上传会话。
    • 是的,我也读过,即使在编辑后我的文件也远不及那个。
    • 我早上试试你的解决方案,我现在无法访问代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 2011-01-20
    • 2011-12-27
    • 2012-06-11
    • 2021-12-21
    • 2017-01-12
    • 1970-01-01
    相关资源
    最近更新 更多