Слияние / заполнение PDF-файла формы с данными XML - PullRequest
6 голосов
/ 10 апреля 2010

Допустим, у меня есть файл PDF-формы, доступный на веб-сайте, который заполняется пользователями и отправляется на сервер. На стороне сервера (Asp.Net) я хотел бы объединить полученные данные в формате xml с заполненной пустой формой pdf и сохранить ее.

Как я обнаружил, есть несколько возможных способов сделать это:

  1. Использование PDF-формы, созданной Adobe Acrobat, и заполнение ее с помощью itextsharp.
  2. Использование PDF-формы, созданной Adobe Acrobat, и заполнение ее FDF Toolkit .net (которая, похоже, использует itextsharp для внутреннего использования)
  3. Usd pdfkt для заполнения формы.
  4. Используйте файл формы pdf, созданный с помощью Adobe Livecycle, и объедините данные с помощью Служба интеграции данных формы

Поскольку у меня нет опыта в решении подобных задач, можете ли вы порекомендовать, какой вариант будет лучше / проще, и дать несколько дополнительных советов?

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 19 апреля 2010

Я бы предложил использовать 4-й подход, если это возможно, потому что он будет чище. Вы будете использовать решения, специально предназначенные для того, что вы хотите сделать, но если у вас нет доступных ресурсов для такого решения, я бы предложил использовать 1-й вариант.

1-й вариант - это то, что я недавно изучил. Я нашел его относительно безболезненным для реализации.

Вариант 1 возможен, если применимо следующее:

  1. Вы можете контролировать разработку форм PDF.
  2. Вы можете управлять форматированием XML-данных
  3. Вы можете жить с несжатыми (fastweb = false) файлами PDF

Пример реализации:

  1. Использование Adobe Acrobat для создания PDF-формы. Совет: используйте собственные шрифты Adobe при создании форм. Для каждого добавляемого вами элемента управления, который не является собственным шрифтом, он импортирует используемый шрифт и увеличивает размер файла, когда он не сжат, и, насколько мне известно, в настоящее время ITextSharp не создает сжатые PDF-файлы.

  2. Использование библиотеки ITextSharp для объединения данных XML с формой PDF для создания заполненного документа. Совет: чтобы вручную заполнить форму PDF из xml, необходимо сопоставить значения XML для управления именами в форме PDF и сопоставить их по странице, как показано в примере ниже.

    using (MemoryStream stream = GeneratePDF(m_FormsPath, oXmlData))
    {
          byte[] bytes = stream.ToArray();
          Response.ContentType = "application/pdf";
          Response.BinaryWrite(bytes);
          Response.End();
    }
    
    // <summary>
    // This method combines pdf forms with xml data
    // </summary>
    // <param name="m_FormName">pdf form file path</param>
    // <param name="oData">xml dataset</param>
    // <returns>memory stream containing the pdf data</returns>
    private MemoryStream GeneratePDF(string m_FormName, XmlDocument oData)
    {
    PdfReader pdfTemplate;
    PdfStamper stamper;
    PdfReader tempPDF;
    Document doc;
    MemoryStream msTemp;
    PdfWriter pCopy;
    MemoryStream msOutput = new MemoryStream();
    
    pdfTemplate = new PdfReader(m_FormName);
    
    doc = new Document();
    pCopy = new PdfCopy(doc, msOutput);
    
    pCopy.AddViewerPreference(PdfName.PICKTRAYBYPDFSIZE, new PdfBoolean(true));
    pCopy.AddViewerPreference(PdfName.PRINTSCALING, PdfName.NONE);
    
    doc.Open();
    
    for (int i = 1; i < pdfTemplate.NumberOfPages + 1; i++)
    {
        msTemp = new MemoryStream();
        pdfTemplate = new PdfReader(m_FormName);
    
        stamper = new PdfStamper(pdfTemplate, msTemp);
    
        // map xml values to pdf form controls (element name = control name)
        foreach (XmlElement oElem in oData.SelectNodes("/form/page" + i + "/*"))
        {
            stamper.AcroFields.SetField(oElem.Name, oElem.InnerText);
        }
    
        stamper.FormFlattening = true;
        stamper.Close();
        tempPDF = new PdfReader(msTemp.ToArray());
        ((PdfCopy)pCopy).AddPage(pCopy.GetImportedPage(tempPDF, i));
        pCopy.FreeReader(tempPDF);
    }
    
    doc.Close();
    
    return msOutput;
    }
    
  3. Сохраните файл или опубликуйте файл в ответе вашей страницы ASP.Net

0 голосов
/ 13 декабря 2014

Вы также можете использовать iTextSharp , чтобы заполнить XML-данные в форме Reader Extension . Правильно установить две вещи:

  1. Установите PdfReader.unethicalreading = true для предотвращения BadPasswordException.
  2. Установить режим добавления в конструкторе PdfStamper, в противном случае подпись Adobe Reader будет повреждена, и Adobe Reader отобразит следующее сообщение: "Этот документ содержал определенные права для включения специальных функции в Adobe Reader. Документ был изменен с момента его создания, и эти права больше не действительны. Пожалуйста, свяжитесь с автором для оригинальной версии этого документа. "

Итак, все, что вам нужно сделать, это:

PdfReader.unethicalreading = true;
using (var pdfReader = new PdfReader("form.pdf"))
{
    using (var outputStream = new FileStream("filled.pdf", FileMode.Create, FileAccess.Write))
    {
        using (var stamper = new iTextSharp.text.pdf.PdfStamper(pdfReader, outputStream, '\0', true))
        {
            stamper.AcroFields.Xfa.FillXfaForm("data.xml");
        }
    }
}

См. Как заполнить форму XFA, используя iText?

0 голосов
/ 16 апреля 2010

Поскольку вы пометили этот 'LiveCycle', я предполагаю, что у вас есть установленная версия Adobe LiveCycle (опционально, может установить ее где-нибудь).

В этом случае я бы выбрал номер 4 (с модификацией использования модуля Adobe LiveCycle Forms ES ). Другие три, несомненно, приведут к проблемам совместимости в долгосрочной перспективе. С сервером LiveCycle (работающим с модулем Forms) вы сможете обрабатывать любой PDF, будь то старый, новый, статический, динамический, сжатый, на основе Acrobat или на основе LiveCycle.

Вы должны быть в состоянии все настроить, заставить форму отправлять свои данные на сервер LiveCycle и использовать эти данные для заполнения формы. Затем заполнение может быть сохранено в базе данных сервера или направлено в PDF-форму (или любую другую форму) и передано обратно клиенту.

Создание формы с помощью LiveCycle Designer.

Вариант quick-and-dirty-следующий: установите форму http-post (как, например, xfdf, для получения дополнительной информации см. Acrobat) на свой ASP-сервер и опубликуйте ее на сервере (убедитесь, что Ваши пользователи не загружают форму перед ее открытием, иначе это не сработает. Форма должна быть открыта в веб-браузере). Затем просто захватите представления, как если бы вы захватили http-пост с веб-страницы. При желании можно сохранить заливку в базе данных. Затем отправьте захваченный поток xfdf обратно клиенту (также может быть вызван на более позднем этапе через http-ссылку). Поток xfdf будет содержать URL-адрес формы, используемой для его заполнения. Клиентский веб-браузер попросит подключаемый модуль Acrobat / Adobe reader для обработки потока xfdf, а подключаемый модуль найдет, загрузит и заполнит форму, указанную в xfdf.

Теперь пользователь должен иметь возможность сохранить форму и заполнить ее - расширение Reader не требуется!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...