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





0/5 (0投票)
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 编辑功能。
回顾我们的目标,我们希望能够
- 将表单字段显示为 Silverlight 中的可编辑组件
- 将这些字段的值提交到服务器(例如,我们可以将其存储在数据库中)
- 将值放回 PDF 文件中。
- 将填写好的 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>
首先,让我们回顾一下我们的 Silverlight 查看器样本的内部架构,我们有一个包含 Silverlight 控件 PDFSilverlightControl 的库,我们的基于 XAML 的包从提供的 URL 加载,并且我们有一个托管该控件的 Silverlight 样本应用程序。
在我们的 PDFSilverlightControl 样本类中,我们有属性
/// <summary>
/// Returns editable text fields from the PDF file.
/// </summary>
public List<TextBox> FormFields { get;}
此属性可用于在 Silverlight 应用程序中检索表单字段。
将所有字段的值提交到服务器
我们知道每个 PDF 表单字段都有一个对应的名称,该名称在 PDF 文件中的所有页面上都是唯一的。从示例 1 中,我们可以看到此名称已添加到我们 XAML 包中的 TextBox 标签中
<TextBox … Name="acField1"> ... </TextBox>M
相应的 TextBox
类中的 name 属性可用于创建键值集合,我们可以从 Silverlight 客户端应用程序将其提交到服务器。有几种可能的方法,仅举 2 种
- 我们可以将键值对作为查询字符串提交到 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 - 我们可以使用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);
将填写好的 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
它看起来像什么?
尝试我们在 Silverlight - 上的 PDF 表单编辑器 http://www.amyuni.ca/Silverlight4/。
可以与此样本结合使用的其他功能
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 元数据流添加自定义元数据。
还有更多