我正在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中打开它时,它已损坏...我在做什么错?
此方法有效:
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);
}