Вот моя ситуация. У меня есть список моделей данных, которые заполнят данный PDF-шаблон в один большой PDF-файл и отображают на веб-странице клиент для печати файла. (без локальной копии). Я использую пример kuujinbo https://stackoverflow.com/a/8525007/5533303, но по какой-то причине я не могу позволить потоку памяти связываться, когда я собираюсь отобразить pdf на странице. (ошибка не может прочитать закрытый поток памяти.) Моя системная среда - MVC 5 с последним itextsharp.Многостраничный PDF-файл, созданный с помощью 1 шаблона PDF
20151107 Обновлено: Найдите причину. Общий код верен, но в конце цикла я должен поместить byteInfo = Masterstream.ToArray(); вне использования smartcopy, но внутри используемого документа. и создайте новую строку памяти позже, чтобы краб byteinfo и вернуться к представлению.
List<Datamodel> PrintList = (List<Datamodel>)Session["GetDAta"];
BaseFont baseChineseFont = BaseFont.CreateFont(@"~~~~~~~~~",
BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
MemoryStream Masterstream = new MemoryStream();
byte[] byteInfo;
using (Document document = new Document())
{
using (PdfSmartCopy copy = new PdfSmartCopy(document, Masterstream))
{
document.Open();
foreach (Datamodel childnode in PrintList)
{
PdfReader pdfReader = new PdfReader(Request.MapPath("~/Content/try 1.pdf"));
using (MemoryStream ms = new MemoryStream())
{
using (PdfStamper stamper = new PdfStamper(pdfReader, ms))
{
// do stuff //
AcroFields pdfForm = stamper.AcroFields;
#region[input data]
pdfForm.AddSubstitutionFont(baseChineseFont);//加font
pdfForm.SetField("XXXXXXXX", childnode.XXXXXX);
#endregion
stamper.FormFlattening = true;
}
pdfReader = new PdfReader(ms.ToArray());
copy.AddPage(copy.GetImportedPage(pdfReader, 1));
}
}
byteInfo = Masterstream.ToArray();
}
}
Masterstream.Write(byteInfo, 0, byteInfo.Length);
Masterstream.Position = 0;
return new FileStreamResult(Masterstream, "application/pdf");
правильный результат
}///smartcopy end using
byteInfo = Masterstream.ToArray();
} //document end using
MemoryStream finalyresult= new MemoryStream(byteInfo);
finalyresult.Write(byteInfo, 0, byteInfo.Length);
finalyresult.Position = 0;
return new FileStreamResult(finalyresult, "application/pdf");
После нахождения удовлетворительного решения для вашего вопроса, пожалуйста подправить это решение как ответ в своем собственном праве. – mkl