65.9K
CodeProject 正在变化。 阅读更多。
Home

在 Silverlight 应用程序中编辑 PDF 表单 (AcroForms)

2012年5月2日

CPOL

3分钟阅读

viewsIcon

29378

PDF 表单或 AcroForms 允许用户交互式编辑 PDF 文档的特定部分。PDF 表单由 AcroForm 字段组成,这些字段提供名称-值关联。本文将重点介绍如何为您的 Silverlight 应用程序提供客户端和服务器端的 AcroForm 编辑功能。

PDF 表单或 AcroForms 允许用户在支持的查看器应用程序中交互式编辑 PDF 文档的特定部分。PDF 表单由一个或多个 AcroForm 字段组成,这些字段在被编辑后提供名称-值关联。

Amyuni PDF for Silverlight 是一个基于 Amyuni PDF Creator 作为服务器端组件和在浏览器中运行的 Silverlight 查看器的在线 PDF 查看器。Amyuni PDF Creator 负责将 PDF 文件转换为等效的基于 XAML 的包,并将其发送到 Silverlight 客户端。有关 Amyuni PDF for Silverlight 的完整描述,请参阅此页面:http://www.amyuni.com/en/developer/pdfsilverlight

本文将重点介绍如何为您的 Silverlight 应用程序提供 AcroForm 编辑功能。

回顾我们的目标,我们希望能够

  1. 将表单字段显示为 Silverlight 中的可编辑组件
  2. 将这些字段的值提交到服务器(例如,我们可以将其存储在数据库中)
  3. 将值放回 PDF 文件中。
  4. 将填写好的 PDF 发回客户端,作为可编辑表单或已处理的 PDF。

将每个表单字段显示为 Silverlight 中的可编辑组件

当包含表单字段的 PDF 文件被 Amyuni PDF Creator 转换为 XAML 包时,每个文本字段将被转换为 TextBox XAML 标签。该标签将作为相应的可编辑组件加载到 Silverlight 中。

<TextBox Canvas.Left = "233.60" Canvas.Top = "242.69" 
    Width = "215.27" Height = "37.13" FontSize="15.91" 
    BorderThickness="0" Background="{x:Null}" Name="acField1">
<TextBox.Foreground>
<SolidColorBrush Color = "#000000" Opacity="1.00"/>
</TextBox.Foreground>
</TextBox>
示例 1

首先,让我们回顾一下我们的 Silverlight 查看器样本的内部架构,我们有一个包含 Silverlight 控件 PDFSilverlightControl 的库,我们的基于 XAML 的包从提供的 URL 加载,并且我们有一个托管该控件的 Silverlight 样本应用程序。

在我们的 PDFSilverlightControl 样本类中,我们有属性

/// <summary>
/// Returns editable text fields from the PDF file.
/// </summary>
public List<TextBox> FormFields { get;}
示例 2

此属性可用于在 Silverlight 应用程序中检索表单字段。

将所有字段的值提交到服务器

我们知道每个 PDF 表单字段都有一个对应的名称,该名称在 PDF 文件中的所有页面上都是唯一的。从示例 1 中,我们可以看到此名称已添加到我们 XAML 包中的 TextBox 标签中

<TextBox … Name="acField1">
...
</TextBox>M
示例 3

相应的 TextBox 类中的 name 属性可用于创建键值集合,我们可以从 Silverlight 客户端应用程序将其提交到服务器。有几种可能的方法,仅举 2 种

  1. 我们可以将键值对作为查询字符串提交到 asp.net 网页
    string pdfFormUrl = "./GetFilledForm.aspx?PDFFile="+ PDFFileName;
    foreach (TextBox tb in PDFSilverlightControl1.FormFields)
    {
        pdfFormUrl += "&";               
        pdfFormUrl += tb.Name + "=" + tb.Text;
    }
    HtmlPage.Window.Navigate(new Uri(pdfFormUrl, UriKind.Relative), "_blank");
    示例 4
  2. 我们可以使用HttpWebRequest 类将键值对作为 Web 表单请求的一部分提交。

将值放回 PDF 文件

一旦我们将键值对从 Silverlight 提交到服务器,我们就可以使用 Amyuni PDF Creator 将这些值放回我们的 PDF 文件中。Amyuni PDF Creator 控件可以通过 Silverlight 包或通过以下链接获得

http://www.amyuni.com/en/developer/pdfcreator

NameValueCollection formFieldValues = Request.QueryString;
// Using the PDF Creator ActiveX object
// This will throw an exception if the control is not installed and registered
var acpdf = Activator.CreateInstance<ACPDFCREACTIVEX.PDFCreactiveXClass>();
acpdf.SetLicenseKey("Silverlight Evaluation", "07EFCDAB...8E7E085619");
// This will throw an exception if the document is not found
acpdf.OpenEx(inFilePath, string.Empty);
acpdf.CurrentPage = 1;
string[] keys = formFieldValues.AllKeys;
foreach (string key in keys)
{
if (key != "PDFFile")
{
acObject field = acpdf.GetObjectByName(key);
field["TextFont"] = "Times,12";
if (flattenForm)
{
field["Value"] = formFieldValues[key];
field["Annotation"] = false;
              }
              else
              {
field["Text"] = formFieldValues[key];
field["Value"] = formFieldValues[key];
              }
}
}
//Saving the file
acpdf.Save(outFilepath, FileSaveOptionConstants.acFileSaveDefault);
示例 5

将填写好的 PDF 发回客户端

在用字段值填写完我们的 PDF 文件后,我们可以通过正确配置响应头将其发回客户端

protected void Page_Load(object sender, EventArgs e)
{
    Response.ClearContent();
    Response.AddHeader("content-disposition", 
        "attachment;filename=FilledForm.pdf");
    Response.ContentType = "application/pdf";
    byte[] bytes = PDFFormProcess.GetPDFBytes(Server, Request, false);
    Response.BinaryWrite(bytes);
    Response.End();           
}

public class PDFFormProcess
{
    public static byte[] GetPDFBytes(
        HttpServerUtility Server, 
        HttpRequest Request, bool flattenForm);
} //Full sample code is provided with the product
示例 6

它看起来像什么?

尝试我们在 Silverlight - 上的 PDF 表单编辑器 http://www.amyuni.ca/Silverlight4/

带有 PDF 表单的 Silverlight 查看器样本的屏幕截图

带有填写好的 PDF 表单结果的 Adobe Acrobat Reader 屏幕截图

可以与此样本结合使用的其他功能

Amyuni PDF Creator 还提供以下功能

  • 将 PDF 文件转换为光栅图像,以便在未安装 Silverlight 控件的浏览器中显示,或在 Silverlight 应用程序中显示 PDF 缩略图。
  • 使用 128 位加密(如果您的国家/地区法律允许,则为 256 位)保护您的输出 PDF 文件。
  • 编辑现有 PDF 文件和表单,或以编程方式或使用我们的 PDF 编辑器应用程序创建新文件。
  • 向 PDF 文件添加 PDF 注释、水印、书签、图层或文件附件。
  • 将 PDF 文件另存为 PDF 1.4、1.5 或PDF/A 格式(PDF/A 旨在实现电子文档的长期存储)。
  • 向 PDF 的 XMP 元数据流添加自定义元数据。

还有更多

© . All rights reserved.