从相同的PDF表单加入页面会在itextSharp中生成不可保存的PDF

时间:2014-06-09 22:09:17

标签: c# forms merge itextsharp

我有一份包含2页的申请PDF表格。仅当第一页没有足够的空间时,才应使用第二页。如果第二页没有,则应该打印第2页的新副本。 因此,我的目标是构建一个方法来创建一个页面1 +可变页数为2的表单。 好像我只是使用PDFcopyfields连接pdf会重复字段,我使用Lowagie的方法重新编号重复的字段。 到目前为止,我只能复制整个文件' n'使用pdfcopyfields的次数(即,具有相同页数1 +第2页的文档)。而且,最糟糕的是文档无法保存。

public void Write()
{
    PdfCopyFields copy = new PdfCopyFields(new FileStream(@"C:\users\u19\desktop\33.pdf", FileMode.Create));
    copy.AddDocument(new PdfReader(RenameFieldsIn(@"C:\users\u19\desktop\1.pdf", 1)));
    copy.AddDocument(new PdfReader(RenameFieldsIn(@"C:\users\u19\desktop\1.pdf", 2)));
    // close the PdfCopyFields object
    copy.Close();

}

private static byte[] RenameFieldsIn(string datasheet, int i)
{
    List<string> form_keys = new List<string>();
    using (var ms = new MemoryStream())
    {
        // Create the stamper
        using (PdfStamper stamper = new PdfStamper(new PdfReader(datasheet), ms))
        {
            // Get the fields
            AcroFields form = stamper.AcroFields;
            // so we aren't hit with 'Collection was modified' exception
            foreach (string k in stamper.AcroFields.Fields.Keys)
            {
                form_keys.Add(k);
            }
            // Loop over the fields
            foreach (string key in form_keys)
            {
                // rename the fields
                form.RenameField(key, string.Format("{0}_{1}", key, i));
            }
        }
        return ms.ToArray();
    }
}  

1 个答案:

答案 0 :(得分:1)

正如我在评论中已经解释的那样,您的PDF是“启用阅读器”。阅读器启用涉及使用Adobe私钥的数字签名。您声称您尝试填写的PDF不包含任何签名。但是,您共享了PDF,当我查看此文档时,我清楚地看到使用权利(UR)签名:

enter image description here

此签名(如果有效)解锁Adobe Reader中的功能,例如:保存文档的权限。合并这样的表单不可避免地会破坏数字签名并删除该许可。您只能使用Adobe软件恢复该权限。 仔细观察,您可以看到您的PDF使用Acrobat v8.0启用了阅读器。

换句话说:如果没有Adobe,您需要尝试实现一些不可能实现的功能,因为您需要使用Adobe的属性对该文档进行数字签名。