保留 Acro 字段,同时使用 itextsharp 将 pdf 溢出到页面中

本文关键字:溢出 pdf itextsharp 字段 Acro 保留 | 更新日期: 2023-09-27 18:34:13

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

要提取的代码:

public void ExtractPage(string sourcePdfPath, string outputPdfPath, int pageNumber)
{
    PdfReader reader = null;
    Document document = null;
    PdfCopy pdfCopyProvider = null;
    PdfImportedPage importedPage = null;
    try
    {
        // Intialize a new PdfReader instance with the contents of the source Pdf file:
        reader = new PdfReader(sourcePdfPath);
        // Capture the correct size and orientation for the page:
        document = new Document(reader.GetPageSizeWithRotation(pageNumber));
        // Initialize an instance of the PdfCopyClass with the source 
        // document and an output file stream:
        pdfCopyProvider = new PdfCopy(document, 
            new System.IO.FileStream(outputPdfPath, System.IO.FileMode.Create));
        document.Open();
        // Extract the desired page number:
        importedPage = pdfCopyProvider.GetImportedPage(reader, pageNumber);
        pdfCopyProvider.AddPage(importedPage);
        document.Close();
        reader.Close();
    }
    catch (Exception ex)
    {
        throw ex;
    }
}

用于检查 Acro 字段的代码:

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

保留 Acro 字段,同时使用 itextsharp 将 pdf 溢出到页面中

您使用

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

PdfReader reader = new PdfReader(sourcePdfPath);
reader.SelectPages("4");
PdfStamper stamper = new PdfStamper(reader, new FileStream(newFile, FileMode.Create, FileAccess.ReadWrite);
stamper.Close();

有关 SelectPages() 方法参数的概述,请参阅我对使用 itext 重新排序的 PDF 页面的回答

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