2014-10-08 2 views
1

Im пытается использовать описанные методы bt kuujinbo здесь. PDF Compression with iTextSharpВосстановление не выполнено с использованием сжатия PDF

Это мой код, и это приводит к ошибке: «Rebuild не удалось: трейлер не найден .; Первоначальное сообщение: PDF startxref не найден.»

  PdfReader reader = new PdfReader(output.ToArray()); 
      ReduceResolution(reader, 9); 

      // Save altered PDF. then you can pass the btye array to a database, etc 
      using (MemoryStream ms = new MemoryStream()) 
      { 
       using (PdfStamper stamper = new PdfStamper(reader, ms)) 
       { 
       } 

       document.Close(); 
       Response.ContentType = "application/pdf"; 
       Response.AddHeader("Content-Disposition", string.Format("attachment;filename=Produktark-{0}.pdf", myItem.Key)); 
       Response.BinaryWrite(output.ToArray()); 
      } 

Что я могу пропустить?

+0

Что находится в переменной * output * в коде? Похоже, что это сообщение указывает, что это не PDF, по крайней мере, не полный. – mkl

ответ

3

Исключение из-за Восстановление не выполнено: ...; Оригинальное сообщение: ... выбрасывается IText только во время PdfReader инициализации, то есть в вашем случае в строке

PdfReader reader = new PdfReader(output.ToArray()); 

и это означает, что данные чтения, т.е. output.ToArray(), не представляет собой действительный PDF. Вы также должны написать output.ToArray() и проверить его.

Если Вы задаетесь вопросом, почему сообщение указывает на то, что некоторые Rebuild не удалось ... вы на самом деле не получить первоначальную ошибку, но в последующей деятельности по итогам одного года PDF переваривать код имеет несколько блоков, как это

try { 
    read some part of the PDF; 
} catch(Exception) { 
    try { 
     try to repair that part of the PDF and read it; 
    } catch(Exception) { 
     throw "Rebuild failed: ...; Original message: ..."; 
    } 
} 

в вашем случае часть интереса была перекрестная ссылка стол/поток, и вопрос в том, что PDF startxref (заявление, содержащее смещение перекрестных ссылок в начале документа) был не найден.

+0

Спасибо за ваши комментарии. Если мне это нравится: 'Response.ContentType = "application/pdf"; Response.AddHeader ("Content-Disposition", string.Format ("attachment; filename = Produktark- {0} .pdf", myItem.Key)); Response.BinaryWrite (output.ToArray()); 'он работает, файл PDF отображается нормально. Так что что-то происходит, когда я пытаюсь использовать другой код. – Martin

+0

Просто, чтобы быть ясным (и, как сказал @mkl), ваше исключение бросается на первую строку кода, который вы опубликовали, правильно? Если это так, то код _after_ не имеет значения, его код, который нам нужен, прежде чем он нужен. –

+0

* Так что что-то происходит, когда я пытаюсь использовать другой код. * - Вход, который вы даете читателю, нарушен. Что-то отображается, когда вы возвращаете его в рендеринг PDF в каком-то браузере, вряд ли что-то доказывает, поскольку эти рендеринги часто очень прощают. Таким образом: ** Вы должны написать output.ToArray() в некоторый файл и проверить его. ** – mkl

0

Когда я получаю это сообщение об ошибке, это вызвано не закрытием PDFStamper, который я использую для редактирования полей формы.

Stamper.Close(); 

Необходимо позвонить перед закрытием PDF или выбросить указанную ошибку.