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

Така че имам доста проста реализация на iTextSharp, която създава PDF. Като част от това всички „прикачени документи“ трябва да бъдат прочетени и обединени в генерирания документ. Това работи добре, освен че току-що попаднах на прикачен от някого документ, който нарушава всичко. PDF файлът все още се генерира, но документът, който излиза, показва само първата страница и Adobe Reader изхвърля грешки (18, ако означава нещо за някого), когато се опита да прегледа страници 2 - 7.

На страница 8 има ДРУГ документ, който беше обединен ПРЕДИ проблемния документ и който се показва добре. След това обединеният документ, който причинява проблема, е следващият (25 страници) и ИТ се показва добре.

Но нещо със сливането на този документ нарушава тези предишни страници. Наистина е странно, защото бих очаквал да наруши документите, които бяха обединени точно преди него, както и страница 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