iTextSharp - невозможно объединить файлы с данными формы - PullRequest
0 голосов
/ 10 февраля 2012

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

public static byte[] FlattenPdfForm(byte[] bytes)
{
    PdfReader reader = new PdfReader(bytes);

    using (MemoryStream stream = new MemoryStream())
    {
        PdfStamper stamper = new PdfStamper(reader, stream) { FormFlattening = true };
        stamper.Close();
        reader.Close();
        return stream.ToArray();
    }
}

Документы PDF, которые я пытаюсь объединить, возвращаются из API UPS,Вот пример документа: http://dl.dropbox.com/u/9005746/OriginalPDF.pdf

Есть ли у вас какие-либо рекомендации о том, как объединить несколько файлов PDF, таких как приведенный выше, в один PDF при сохранении данных формы?

Ответы [ 2 ]

0 голосов
/ 28 января 2016

Небольшое изменение приведенного выше кода работает для меня

public static void CreateBulkPdfFile(string[] fileNames, string outFile)
{
  PdfCopyFields copier = new PdfCopyFields(new FileStream(outFile, FileMode.Create));
  int doc = 0;

  foreach (string filename in fileNames)
  {          
    PdfReader reader = new PdfReader(filename);

    // This should ensure field names are unique across merged documents
    foreach (var item in reader.AcroFields.Fields)
      reader.AcroFields.RenameField(item.ToString(), String.Format("_D{0}_{1}", doc++, item.ToString()));

    copier.AddDocument(reader);         
  }

  copier.Close();
}
0 голосов
/ 06 декабря 2012

Этот код хорошо работает для меня:

PdfCopyFields copier = new PdfCopyFields(new FileStream(tgtfilename, FileMode.Create));
int doc = 0;

foreach (string filename in srcfilenames)
{
    PdfReader reader = new PdfReader(filename);

    // This should ensure field names are unique across merged documents
    foreach (var item in reader.AcroFields.Fields)
        reader.AcroFields.RenameField(item.Key, String.Format("_D{0}_{1}", doc++, item.Key));

    copier.AddDocument(reader);
}

copier.Close();

Я адаптировал его с этот ответ .

...