我正试图通过将FDF中的数据保存到WPFDFTemplate来保存PDF文件。
所以,情况是这样的。我有一个PDFTemplate.pdf,它用作模板并具有占位符(或字段)。现在,我按语法生成了这个FDF文件,它依次包含要填写的PDFTemplate所需的所有字段名。此外,这个FDF还包含PDF模板的文件路径,这样在打开时,它就知道要使用哪个PDF。
现在,当尝试双击FDF时,它会打开Adober Acrobat Reader,并显示PDFTemplate并填写数据。但我无法使用"文件"菜单保存此文件,因为它说此文件将在没有数据的情况下保存。
我想知道是否可以将FDF数据导入PDF 此外,如果很难做到这一点,那么就一个能够做到这一目标的免费图书馆而言,可能的解决方案是什么? 我刚刚意识到iTextSharp对于商业应用程序是不免费的。
我已经能够使用另一个库来实现这一点PDFSharp。
它与iTextSharp的工作方式有点相似,除了iTextSharm中的一些地方更好、更容易使用。我正在发布代码,以防有人想做类似的事情:
//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();
}