C# 使用itextsharp将pdf溢出到页面时保留Acro字段

C# 使用itextsharp将pdf溢出到页面时保留Acro字段,c#,itextsharp,C#,Itextsharp,我使用下面给定的c代码,使用itextsharp从pdf文档中提取页面。 页面被很好地提取出来,但是它以某种方式弄乱了acro字段。 我能够在提取的页面acro字段上查看和输入数据,但当我检查代码中acro字段的计数时,它显示为0 要提取的代码: 检查Acro字段的代码: 您使用了错误的代码来提取页面。您应该使用PdfStamper而不是PdfCopy。例如:如果要创建一个新的PDF,其中只包含现有文档的第4页,则应使用以下代码: PdfReader reader = new PdfReader

我使用下面给定的c代码,使用itextsharp从pdf文档中提取页面。 页面被很好地提取出来,但是它以某种方式弄乱了acro字段。 我能够在提取的页面acro字段上查看和输入数据,但当我检查代码中acro字段的计数时,它显示为0

要提取的代码:

检查Acro字段的代码:


您使用了错误的代码来提取页面。您应该使用PdfStamper而不是PdfCopy。例如:如果要创建一个新的PDF,其中只包含现有文档的第4页,则应使用以下代码:

PdfReader reader = new PdfReader(sourcePdfPath);
reader.SelectPages("4");
PdfStamper stamper = new PdfStamper(reader, new FileStream(newFile, FileMode.Create, FileAccess.ReadWrite);
stamper.Close();
有关SelectPages方法参数的概述,请参阅我对的回答

请注意,从已签名的PDF文档中提取页面将始终使签名无效。相反,这将违反有关数字签名的规范

private static int GetNumberOfSignatures(string FileName)
{
    int best = 0; if (Path.GetExtension(FileName) != ".pdf" || !File.Exists(FileName)) return   0;
    var form = new PdfReader(FileName).AcroFields;
    var formFields = form.Fields;
    foreach (var cur in formFields)
    {
        if (cur.Key.ToLower().StartsWith("signature_placeholder_"))
        {
            int val = 0;
            if (!int.TryParse(cur.Key.Substring(22), out val)) val = 0;
            if (val > best) best = val;
        }
        if (cur.Key.ToLower() == "signature_placeholder" && best < 1) best = 1;
    }
    return best;
}
PdfReader reader = new PdfReader(sourcePdfPath);
reader.SelectPages("4");
PdfStamper stamper = new PdfStamper(reader, new FileStream(newFile, FileMode.Create, FileAccess.ReadWrite);
stamper.Close();