加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – 使用xml数据合并/填充pdf表单文件

发布时间:2020-12-16 03:51:13 所属栏目:asp.Net 来源:网络整理
导读:假设我在网站上有一个pdf表单文件,由用户填写并提交给服务器.在服务器端(Asp.Net),我想将我以xml格式接收的数据与填充的空pdf表单合并并保存. 我发现有几种可能的方法: 使用adobe acrobat创建的pdf表单并用itextsharp填充. 使用adobe acrobat创建的pdf表单
假设我在网站上有一个pdf表单文件,由用户填写并提交给服务器.在服务器端(Asp.Net),我想将我以xml格式接收的数据与填充的空pdf表单合并并保存.

我发现有几种可能的方法:

>使用adobe acrobat创建的pdf表单并用itextsharp填充.
>使用adobe acrobat创建的pdf表单并填充FDF Toolkit .net(似乎在内部使用itextsharp)
> usd pdfkt填写表格.
>使用使用adobe livecycle创建的pdf表单文件,并使用Form Data Integration Service合并数据

由于我没有这种任务的经验,你能建议哪个选项会更好/更容易并提供一些额外的提示吗?

先感谢您.

解决方法

如果可能的话,我建议使用第4种方法,因为它会更清洁.您将使用专门为您要求做的定制的解决方案,但如果您没有可用于此类解决方案的资源,我建议您使用第一个选项.

第一个选项是我最近潜入的选项.我发现它实施起来相对轻松.

如果以下情况适用,则可以选择1:

>您可以控制PDF表单的开发.
>您可以控制格式化xml数据
>您可以使用未压缩(fastweb = false)PDF文件

实施示例:

>使用Adobe Acrobat生成PDF表单.提示:生成表单时使用Adobe Native Fonts.对于您添加的不是本机字体的每个控件,它将导入所使用的字体并在未压缩文件时使文件膨胀,据我所知,ITextSharp当前不生成压缩的PDF.
>使用ITextSharp Library将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();
}

// <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;
}

>保存文件或将文件发布到ASP.Net页面的响应中

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读