C#-Xamarin.Forms-无法访问封闭的流

问题描述 投票:0回答:1

我正在Xamarin.Forms应用程序中使用itext7。我正在尝试从Stream中获取PDF文件,请在itext7中使用PdfAcroForm对其进行写入,但是当我收到此错误时:无法访问关闭的Stream。我觉得我已经尝试了一切,这是我的原始代码:

MemoryStream outFile = new MemoryStream();

var streamFile = await App.GraphClient.Me.Drive.Items[item.Id].Content.Request().GetAsync();

PdfDocument pdf = new PdfDocument(new PdfReader(streamFile), new PdfWriter(outFile));

PdfAcroForm form = PdfAcroForm.GetAcroForm(pdf, true);

IDictionary<String, PdfFormField> fields = form.GetFormFields();

PdfFormField toSet;
fields.TryGetValue("Full_Names", out toSet);
toSet.SetValue("aaa");

form.FlattenFields();
pdf.Close();

await App.GraphClient.Me.Drive.Items[newFolder.Id].ItemWithPath(item.Name).Content.Request().PutAsync<DriveItem>(outFile);

然后,我尝试使用流并将其位置设置为0并刷新流,但这仍然不起作用。

using (MemoryStream outFile = new MemoryStream())
{
    var streamFile = await App.GraphClient.Me.Drive.Items[item.Id].Content.Request().GetAsync();

    PdfDocument pdf = new PdfDocument(new PdfReader(streamFile), new PdfWriter(outFile));

    PdfAcroForm form = PdfAcroForm.GetAcroForm(pdf, true);

    IDictionary<String, PdfFormField> fields = form.GetFormFields();

    PdfFormField toSet;
    fields.TryGetValue("Full_Names", out toSet);
    toSet.SetValue("aaa");

    form.FlattenFields();
    pdf.Close();

    outFile.Flush();
    outFile.Position = 0;

    await App.GraphClient.Me.Drive.Items[newFolder.Id].ItemWithPath(item.Name).Content.Request().PutAsync<DriveItem>(outFile);
}

当我删除此行时... pdf.Close(); pdf会被写入,但是当我在OneDrive中打开它时,它已损坏...我在做什么错?

c# xamarin.forms itext itext7
1个回答
0
投票

此方法有效:

using (MemoryStream outFile = new MemoryStream())
                {
                    var streamFile = await App.GraphClient.Me.Drive.Items[item.Id].Content.Request().GetAsync();

                    using(PdfDocument pdf = new PdfDocument(new PdfReader(streamFile), new PdfWriter(outFile)))
                    {

                        pdf.SetCloseWriter(false);

                        PdfAcroForm form = PdfAcroForm.GetAcroForm(pdf, true);

                        IDictionary<String, PdfFormField> fields = form.GetFormFields();

                        PdfFormField toSet;
                        fields.TryGetValue("Full_Names", out toSet);
                        toSet.SetValue(Customer_Name.Text + " " + Customer_LName.Text);

                        fields.TryGetValue("Full_Names0", out toSet);
                        toSet.SetValue(Customer_Name.Text + " " + Customer_LName.Text);

                        fields.TryGetValue("Full_Names1", out toSet);
                        toSet.SetValue(Customer_Name.Text + " " + Customer_LName.Text);

                        fields.TryGetValue("Address0", out toSet);
                        toSet.SetValue(Address1.Text);

                        fields.TryGetValue("City0", out toSet);
                        toSet.SetValue(City.Text);

                        fields.TryGetValue("Province0", out toSet);
                        toSet.SetValue(Province.Text);

                        fields.TryGetValue("Phone0", out toSet);
                        toSet.SetValue(Phone2Main.Text);

                        fields.TryGetValue("Email0", out toSet);
                        toSet.SetValue(Email.Text);

                        form.FlattenFields();
                    }

                    outFile.Flush();
                    outFile.Position = 0;

                    await App.GraphClient.Me.Drive.Items[newFolder.Id].ItemWithPath(item.Name).Content.Request().PutAsync<DriveItem>(outFile);
                }
© www.soinside.com 2019 - 2024. All rights reserved.