Имейте PDF на диске, который составляет 498kb. Я читаю это в MemoryStream, который сообщает размер 508978 при просмотре в отладчике. Затем, используя считыватель и матрицу, выходной MemoryStream имеет размер 15. Когда поток выводится на диск, PDF не читается.PdfStamper изменяет размер MemoryStream
MemoryStream inputStream = new MemoryStream();
MemoryStream outputStream = new MemoryStream();
FileStream fs = File.OpenRead(@"e:\O1.pdf");
inputStream.SetLength(fs.Length);
fs.Read(inputStream.GetBuffer(), 0, (int)fs.Length);
inputStream.Seek(0, SeekOrigin.Begin);
PdfReader reader = new PdfReader(inputStream);
PdfStamper stamper = new PdfStamper(reader, outputStream);
stamper.Writer.CloseStream = false;
AcroFields fields = reader.AcroFields;
foreach (String key in fields.Fields.Keys)
{
if (String.Equals(key, @"ReportID")) { stamper.AcroFields.SetField(@"ReportID", "Fred Bloggs"); }
}
stamper.Close();
Byte[] bytes = (Byte[])outputStream.ToArray();
File.WriteAllBytes(@"e:\O2.pdf", bytes);
1) Отсутствует источник 'ConvertFileToStream()'. 2) Вы вычисляете длину выходного потока, прежде чем делать что-либо с помощью шаблона; посмотрите на длину после тиснения и закрытия штамповки; вам может понадобиться 'stamper.CloseStream = false'. – mkl
Принимая во внимание ваше изменение: Да, ваш код окончательно пропускает вызов 'stamper.Close()' или конструкцию '' ', неявно вызывающий Close для вызова. По мере того, как вы пытаетесь использовать 'outputStream' в качестве потока, перед этим вам нужно установить' stamper.CloseStream = false'. – mkl
@ mkl - Не понимаю вас здесь. Вы говорите, что мне не хватает stamper.Close(), который я получаю, однако тогда вы говорите, что мне нужен stamper.CloseStream = false до этого. Является ли этот синтаксис Java, поскольку он не существует в C#. – Dave