iTextSharp объединяет документы с формами

Итак, у меня есть довольно простая реализация iTextSharp, которая создает PDF. В рамках этого необходимо прочитать любые «приложенные документы» и объединить их в сгенерированный документ. Это отлично работает, за исключением того, что я только что наткнулся на документ, который кто-то приложил, который все ломает. PDF-файл по-прежнему генерируется, но в полученном документе отображается только первая страница, а Adobe Reader выдает ошибки (18, если это что-то значит для кого-либо) всякий раз, когда он пытается просмотреть страницы 2–7.

На странице 8 находится ДРУГОЙ документ, который был объединен ДО проблемного документа и отображается нормально. Затем объединенный документ, вызывающий проблему, становится следующим (25 страниц), и IT отображается нормально.

Но что-то при слиянии этого документа ломает эти предыдущие страницы. Это действительно странно, потому что я ожидал, что он сломает документы, которые были объединены прямо перед ним, а также страницу 1 и т. Д.

Единственное, что я вижу в документе, который отличается, это то, что на странице 2 объединяемого проблемного документа есть заполненная форма. Я пытаюсь заставить одного из людей, которые знают PDF-файлы лучше меня, получить мне один без этой формы, чтобы убедиться, что проблема в этом, но, похоже, мой лучший кандидат прямо сейчас...

Я попробовал следующее (добавив часть «Удалить любые формы»), но у меня все еще есть проблемы. Любые идеи?

var reader = new PdfReader(filePath);

// Remove any forms
if (reader.AcroForm != null)
{
    var memStream = new MemoryStream();
    var stamper = new PdfStamper(reader, memStream) { FormFlattening = true };
    stamper.Close();
    reader = new PdfReader(memStream.ToArray());
}

var numberOfPages = reader.NumberOfPages;

var cb = writer.DirectContent;

var i = 0;
while (i < numberOfPages)
{
    i++;
    document.SetPageSize(reader.GetPageSizeWithRotation(i));
    document.NewPage();

    var page = writer.GetImportedPage(reader, i);
    var rotation = reader.GetPageRotation(i);

    if (rotation == 90 || rotation == 270)
    {
        cb.AddTemplate(page, 0, -1f, 1f, 0, 0, reader.GetPageSizeWithRotation(i).Height);
    }
    else
    {
        cb.AddTemplate(page, 1f, 0, 0, 1f, 0, 0);
    }
}

reader.Close();

person Michael Hallock    schedule 31.12.2013    source источник
comment
Пожалуйста, предоставьте документы, о которых идет речь.   -  person mkl    schedule 01.01.2014


Ответы (1)


Прочтите главу 6 моей книги, и вы заметите, что использование PdfWriter для конкатенации (или объединить) PDF-документы неверны. Объединение PDF-файлов выполняется с помощью PdfCopy.

Если объединяемые документы содержат формы AcroForm, в книге рекомендуется использовать PdfCopyFields. В более поздних версиях iTextSharp PdfCopyFields устарел в пользу метода, описанного здесь: скопировать форму PDF с PdfCopy, не работающим в itextsharp 5.4.5.0

Без примера никто не сможет дать вам лучший ответ. Вам нужно будет поделиться некоторыми PDF-файлами, которые вызывают проблему.

person Bruno Lowagie    schedule 01.01.2014