2013-02-21 4 views
0

Имейте 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

1) Отсутствует источник 'ConvertFileToStream()'. 2) Вы вычисляете длину выходного потока, прежде чем делать что-либо с помощью шаблона; посмотрите на длину после тиснения и закрытия штамповки; вам может понадобиться 'stamper.CloseStream = false'. – mkl

+0

Принимая во внимание ваше изменение: Да, ваш код окончательно пропускает вызов 'stamper.Close()' или конструкцию '' ', неявно вызывающий Close для вызова. По мере того, как вы пытаетесь использовать 'outputStream' в качестве потока, перед этим вам нужно установить' stamper.CloseStream = false'. – mkl

+0

@ mkl - Не понимаю вас здесь. Вы говорите, что мне не хватает stamper.Close(), который я получаю, однако тогда вы говорите, что мне нужен stamper.CloseStream = false до этого. Является ли этот синтаксис Java, поскольку он не существует в C#. – Dave

ответ

2

Ваш фрагмент кода неполный, что затрудняет ответ на ваш вопрос.

Вы заставляете людей угадывать ваш вопрос.

Первое предположение:

У вас есть PDF 10 КБ, при чтении с PdfReader, вы вдруг использовать 100 KB. Вы удивлены. Как это может быть?

Ответ прост: PDF с 10 КБ сжимается. Когда PdfReader начинает работать с ним, он создает объекты (требующие памяти) и распаковывает данные (требуется больше памяти).

Второе предположение:

У вас есть PdfReader объект и использовать его для создания PdfStamper объекта. Вы забудете закрыть пробку. Внезапно у вас есть очень маленький файл, о котором скажет читатель в формате PDF: это не настоящий PDF. Как так?

Вы ошиблись, что многие люди, которые не читают документацию, делают. Файл, с которым вы работаете с PdfStamper, не полностью написан до тех пор, пока вы не закроете шаблон.

Третье предположение:

У вас есть PdfReader объект и использовать его для создания PdfStamper объекта. Вы ничего не делаете со штемпелем, вы просто закрываете его. Вы удивлены, что полученный PDF-файл отличается от оригинального.

  • Размер меньше: iText иногда выбрасывает неиспользованный объект, и он переупорядочивает объекты по-разному. Это типично для библиотек PDF.
  • Размер больше: даже если вы ничего не добавили, размер файла может увеличиться, например, когда исходный документ полностью сжат (PDF 1.5 и выше). По умолчанию PdfStamper не создаст сжатый поток xref (если вы не проинструктируете PdfStamper сжать xref).

Если ни один из этих ответов не применяется, я предлагаю вам перефразировать ваш вопрос. Если нет, вы рискуете, что модераторы закроют его.

+0

Полный код добавлен – Dave

+0

Где я могу закрыть пробку? Это должно быть, прежде чем я попытаюсь написать из потока, нигде больше не имеет смысла. – Dave

+0

Я предполагаю, что вопрос риторический, поскольку в вопросе содержится ответ. –

Смежные вопросы