Как выровнять уже заполненную PDF-форму с помощью iTextSharp - PullRequest
11 голосов
/ 21 декабря 2009

Я использую iTextSharp, чтобы объединить несколько файлов PDF в один файл.

Я использую метод, описанный в официальных руководствах iTextSharp, специально здесь , который объединяет файлы постранично через PdfWriter и PdfImportedPage.

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

Я видел несколько примеров использования PdfStamper для заполнения форм и их выравнивания.

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

Спасибо

Ответы [ 4 ]

10 голосов
/ 17 марта 2010

При создании файлов для объединения я изменил этот параметр: pdfStamper.FormFlattens = true;

Отлично работает.

9 голосов
/ 25 февраля 2011

Просто установки .FormFlattens на PdfStamper было недостаточно ... Я закончил тем, что использовал PdfReader с байтовым массивом содержимого файла, который я использовал для штамповки / сглаживания данных, чтобы получить байтовый массив этого для вставки нового PdfReader. Ниже, как я это сделал. прекрасно работает сейчас.

 private void AppendPdfFile(FileDTO file, PdfContentByte cb, iTextSharp.text.Document printDocument, PdfWriter iwriter) 
  {
     var reader = new PdfReader(file.FileContents);

     if (reader.AcroForm != null)
        reader = new PdfReader(FlattenPdfFormToBytes(reader,file.FileID));

     AppendFilePages(reader, printDocument, iwriter, cb);
  }

  private byte[] FlattenPdfFormToBytes(PdfReader reader, Guid fileID)
  {
     var memStream = new MemoryStream();
     var stamper = new PdfStamper(reader, memStream) {FormFlattening = true};
     stamper.Close();
     return memStream.ToArray();
  }
5 голосов
/ 19 августа 2015

Я думаю, что эта проблема такая же: Значения AcroForm отсутствуют после выравнивания

На основании ответа это должно сработать:

pdfStamper.FormFlattening = true;
pdfStamper.AcroFields.GenerateAppearances = true;
0 голосов
/ 20 ноября 2018

Это тот же ответ, что и принятый, но без каких-либо неиспользованных переменных:

private byte[] GetUnEditablePdf(byte[] fileContents)
{
    byte[] newFileContents = null;

    var reader = new PdfReader(fileContents);

    if (reader.AcroForm != null)
        newFileContents = FlattenPdfFormToBytes(reader);

    else newFileContents = fileContents;

    return newFileContents;
}

private byte[] FlattenPdfFormToBytes(PdfReader reader)
{
    var memStream = new MemoryStream();
    var stamper = new PdfStamper(reader, memStream) { FormFlattening = true };
    stamper.Close();
    return memStream.ToArray();
}
...