Копирование PDF-формы с помощью iTextSharp - PullRequest
2 голосов
/ 10 мая 2011

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

У меня это работает, но я теряю форму на скопированном PDF, т.е. никакие значения не записываютсягде, прежде чем пытаться скопировать PDF, чтобы «удалить» некоторые страницы, значения были написаны правильно.

Как сохранить форму PDF, которую я уже создал, когда копирую форму, или есть лилучший способ удаления страниц? Вот мой код, который записывает PDF в файл, но не заполняет форму (предположительно, потому что форма не сохраняется при копировании):

    string file = "output.pdf";
    PdfReader reader = new PdfReader("template.pdf");

    Document doc = new Document();
    using (MemoryStream ms = new MemoryStream())
    {

        PdfWriter writer = PdfWriter.GetInstance(doc, ms);
        doc.Open();
        doc.AddDocListener(writer);
        for (int i = 1; i <= reader.NumberOfPages; i++)
        {
            bool skipPage = this.SkipPage; // some nifty logic here
            if (skipPage)
                continue;

            doc.SetPageSize(reader.GetPageSize(i));
            doc.NewPage();
            PdfContentByte cb = writer.DirectContent;
            PdfImportedPage page = writer.GetImportedPage(reader, i);
            int rotation = reader.GetPageRotation(i);
            if (rotation == 90 || rotation == 270)
                cb.AddTemplate(page, 0, -1.0F, 1.0F, 0, 0, reader.GetPageSizeWithRotation(i).Height);
            else
                cb.AddTemplate(page, 1.0F, 0, 0, 1.0F, 0, 0);
        }
        reader.Close();
        doc.Close();
        using (FileStream fs = new FileStream(file, FileMode.Create))
        {
            // this is the part stumping me; I need to use a PdfStamper to write 
            // out some values to fields on the form AFTER the pages are removed.
            // This works, but there doesn't seem to be a form on the copied page...
            this.stamper = new PdfStamper(new PdfReader(ms.ToArray()), fs);
            // write out fields here...
            stamper.FormFlattening = true;
            stamper.SetFullCompression();
            stamper.Close();
        }
    }

1 Ответ

1 голос
/ 10 мая 2011

Не берите в голову, я, кажется, смог понять это с помощью метода SelectPages в PDF-ридере, и я могу избежать необходимости делать реальные копии файлов.

...