2015-03-09 7 views
0

Мой PDF не читается после попытки редактирования текста. Как это сделать?Почему мой PDF-файл не читается после редактирования iText?

мое сообщение об ошибке: Adobe Reader не смог открыть «495049.pdf», потому что это либо не поддерживаемый тип файла, либо потому, что файл поврежден (например, он был отправлен как вложение электронной почты и не был правильно декодировано)

В основном цель заключается в редактировании PDF-документа и замене определенного текста.

Input уже в двоичном потоке (байт [])

Я работал на C# среде & IText для редактирования PDF Lib.

Вот мой кусок кода:

using (PdfReader reader = new PdfReader(doc.FileStream)) 
{ 
    PdfDictionary dict = reader.GetPageN(1); 
    PdfObject pdfObject = dict.GetDirectObject(PdfName.CONTENTS); 
    if (pdfObject.IsStream()) 
    { 
     PRStream stream = (PRStream)pdfObject; 
     byte[] data = PdfReader.GetStreamBytes(stream); 
     stream.SetData(System.Text.Encoding.ASCII.GetBytes(System.Text.Encoding.ASCII.GetString(data).Replace("[ReplacmentText]", "Hello World"))); 
    } 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     var ignored = new PdfStamper(reader, ms); 
     reader.Close(); 
     return ms.ToArray(); 
    } 
} 

ответ

2

Ваша главная ошибка состоит в том, что вы извлекаете содержимое потока памяти перед закрытием штампа; на самом деле вы не закрываете его вообще!

Только при закрытии штампа записывается заключительная часть PDF-файла. Таким образом:

using (MemoryStream ms = new MemoryStream()) 
{ 
    var ignored = new PdfStamper(reader, ms); 
    ignored.Close(); 
    reader.Close(); 
    return ms.ToArray(); 
} 

Ваша другая проблема (возможно, не подходит для текущих тестовых документов, но в целом):

stream.SetData(System.Text.Encoding.ASCII.GetBytes(System.Text.Encoding.ASCII.GetString(data).Replace("[ReplacmentText]", "Hello World"))); 

Это предполагает очень много, особенно о том, что поток контента содержит только ASCII байт, что place place "[ReplacementText]" (я предполагаю, что это правильная орфография) происходит в одном фрагменте и в непосредственных потоках контента, что шрифт, используемый для рисования держателя места и его замены, использует кодировку ASCII'ish и этот шрифт имеет глифы для всех символов в «Hello World». Ни одно из этих предположений автоматически не соответствует действительности.

+0

спасибо за исправление ошибок. извините, так что это правильный способ сделать это? Преобразовать байты в строку? – Gerry

+0

Я получил окончательный PDF без ошибок ... но мой текст не заменялся ... любое предложение? – Gerry

+0

Как уже упоминалось выше, ваш код предполагает очень многое. PDF не является легко редактируемым форматом. – mkl

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