Бесплатная библиотека для импорта FDF в PDF

Я пытаюсь сохранить файл PDF, сохранив данные из FDF в PDFTemplate, в моем приложении WPF.

Итак, ситуация такая. У меня есть PDFTemplate.pdf, который служит в качестве шаблона и имеет заполнители (или поля). Теперь я генерирую этот файл FDF программно, который, в свою очередь, содержит все имена полей, необходимые для заполнения PDFTemplate. Кроме того, этот FDF также содержит путь к файлу для PDFTemaplte, так что при открытии он знает, какой PDF использовать.

Теперь, когда вы попробуете дважды щелкнуть мышью на FDF, он откроет Adober Acrobat Reader и отобразит шаблон PDF с заполненными данными. Но я не могу сохранить этот файл с помощью меню Файл, так как он говорит, что этот файл будет сохранен без данные.

Я хотел бы знать, возможно ли импортировать данные FDF в PDF и сохранить их без использования стороннего компонента.

Кроме того, если это очень трудно сделать, каково будет возможное решение с точки зрения бесплатной библиотеки, которая сможет это сделать?

Я только что понял, что iTextSharp не является бесплатным для коммерческих приложений.

1 ответ

Решение

Мне удалось добиться этого с помощью другой библиотеки PDFSharp.

Это похоже на работу iTextSharp, за исключением некоторых мест, где iTextSharp лучше и проще в использовании. Я публикую код на тот случай, если кто-то захочет сделать что-то подобное:

//Create a copy of the original PDF file from source 
//to the destination location
File.Copy(formLocation, outputFileNameAndPath, true);

//Open the newly created PDF file
using (var pdfDoc = PdfSharp.Pdf.IO.PdfReader.Open(
                    outputFileNameAndPath, 
                    PdfSharp.Pdf.IO.PdfDocumentOpenMode.Modify))
{
   //Get the fields from the PDF into which the data 
   //is supposed to be inserted
    var pdfFields = pdfDoc.AcroForm.Fields;

    //To allow appearance of the fields
    if (pdfDoc.AcroForm.Elements.ContainsKey("/NeedAppearances") == false)
    {
        pdfDoc.AcroForm.Elements.Add(
            "/NeedAppearances", 
            new PdfSharp.Pdf.PdfBoolean(true));
    }
    else
    {
        pdfDoc.AcroForm.Elements["/NeedAppearances"] = 
            new PdfSharp.Pdf.PdfBoolean(true);
    }

    //To set the readonly flags for fields to their original values
    bool flag = false;

    //Iterate through the fields from PDF
    for (int i = 0; i < pdfFields.Count(); i++)
    {
        try
        {
            //Get the current PDF field
            var pdfField = pdfFields[i];

            flag = pdfField.ReadOnly;

            //Check if it is readonly and make it false
            if (pdfField.ReadOnly)
            {
                pdfField.ReadOnly = false;
            }

            pdfField.Value = new PdfSharp.Pdf.PdfString(
                             fdfDataDictionary.Where(
                             p => p.Key == pdfField.Name)
                             .FirstOrDefault().Value);

            //Set the Readonly flag back to the field
            pdfField.ReadOnly = flag;
        }
        catch (Exception ex)
        {
            throw new Exception(ERROR_FILE_WRITE_FAILURE + ex.Message);
        }
    }

    //Save the PDF to the output destination
    pdfDoc.Save(outputFileNameAndPath);                
    pdfDoc.Close();
}
Другие вопросы по тегам