如果可能的话,我建议使用第4种方法,因为它会更清洁 . 您将使用专门为您要求做的定制的解决方案,但如果您没有可用于此类解决方案的资源,我建议您使用第一个选项 .
第一个选项是我最近潜入的选项 . 我发现它实施起来相对轻松 .
如果以下情况适用,则可以选择1:
您可以控制PDF表单的开发 .
您可以控制格式化xml数据
您可以使用未压缩(fastweb = false)PDF文件
实施示例:
使用Adobe Acrobat生成PDF表单 . 提示:生成表单时使用Adobe Native Fonts . 对于您添加的不是本机字体的每个控件,它将导入所使用的字体并在未压缩文件时使文件膨胀,据我所知,ITextSharp当前不生成压缩的PDF .
使用ITextSharp库将XML数据与PDF表单组合以生成填充的文档 . 提示:要从xml手动填充PDF表单,您必须将xml值映射到PDF表单中的控件名称,并按页面进行匹配,如下例所示 .
using (MemoryStream stream = GeneratePDF(m_FormsPath, oXmlData))
{
byte[] bytes = stream.ToArray();
Response.ContentType = "application/pdf";
Response.BinaryWrite(bytes);
Response.End();
}
//
// This method combines pdf forms with xml data
//
// pdf form file path
// xml dataset
// memory stream containing the pdf data
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;
}
保存文件或将文件发布到ASP.Net页面的响应中