C# 用iTextsharp填充PDF,然后隐藏基础层

C# 用iTextsharp填充PDF,然后隐藏基础层,c#,asp.net,pdf,itext,C#,Asp.net,Pdf,Itext,我使用以下代码填充PDF中的字段,如下所示: string fileNameExisting = @"C:\Old.pdf"; string fileNameNew = @"C:\New.pdf"; using (FileStream existingFileStream = new FileStream(fileNameExisting, FileMode.Open)) { using (FileStream newFileStream = new FileStream(fil

我使用以下代码填充PDF中的字段,如下所示:

string fileNameExisting = @"C:\Old.pdf";
string fileNameNew = @"C:\New.pdf";
using (FileStream existingFileStream = new FileStream(fileNameExisting, FileMode.Open))
{
        using (FileStream newFileStream = new FileStream(fileNameNew, FileMode.Create))
    {
        Font font = FontFactory.GetFont(FontFactory.COURIER, 6f, Font.BOLD);
        PdfReader pdfReader = new PdfReader(existingFileStream);
        PdfStamper stamper = new PdfStamper(pdfReader, newFileStream);
        AcroFields form = stamper.AcroFields;
        ICollection fieldKeys = form.Fields.Keys;
        foreach (string fieldKey in fieldKeys)
        {
            stamper.AcroFields.SetFieldProperty(fieldKey, "textsize", 6f, null);
            stamper.AcroFields.AddSubstitutionFont(font.BaseFont);
            form.SetField(fieldKey, fieldKey); //Just for testing
        }                           
        stamper.Close();
    }
}
它工作得很好,但我的最终目标是将bool传递给这个方法,它将决定是否呈现文档的底层。(即)如果用户只需要呈现字段内容并隐藏“Old.pdf”的实际内容

我查阅了文档,但没有特别提到这一点,有可能吗

指定是否呈现文档的基础层

首先,在PDF上下文中,规范中未定义术语层;但是,如果使用它,它通常作为可选内容组(OCG)的笔名,因为某些PDF处理程序使用它。但由于OCG必须在内容中明确标记,因此在这里使用它们似乎并不合适

不过,你可以很容易地做到的是

  • 或者用一些白色矩形覆盖现有内容

    using (PdfReader pdfReader = new PdfReader(input))
    using (PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(output, FileMode.Create, FileAccess.Write)))
    {
        for (int page = 1; page <= pdfReader.NumberOfPages; page++)
        {
            Rectangle pageSize = pdfReader.GetPageSize(page);
            PdfContentByte canvas = pdfStamper.GetOverContent(page);
            canvas.SetColorFill(BaseColor.WHITE);
            canvas.Rectangle(pageSize.Left, pageSize.Bottom, pageSize.Width, pageSize.Height);
            canvas.Fill();
        }
    }
    
    使用(PdfReader PdfReader=新PdfReader(输入))
    使用(PdfStamper PdfStamper=newpdfstamper(pdfReader,newfilestream(输出,FileMode.Create,FileAccess.Write)))
    {
    
    对于(int page=1;page感谢您的回答!我使用了以下行
    PdfDictionary pageDictionary=pdfReader.GetPageN(page);dictional.Remove(PdfName.CONTENTS)
    而且它工作得很好!不过,我注意到没有大小变化-没关系!没有,没有大小变化。为什么会有变化?我们删除了内容,而不是维度。我指的是文件大小-我假设删除内容(表、文本、颜色)将减小文件大小,因为这些对象的数据不再存在。我们通常删除的内容流实际上没有那么大。更大的部分通常是资源,特别是图像和嵌入字体。您也可以尝试使用
    pageDictionary.Remove(PdfName.resources)
    删除资源。
    using (PdfReader pdfReader = new PdfReader(input))
    {
        for (int page = 1; page <= pdfReader.NumberOfPages; page++)
        {
            PdfDictionary pageDictionary = pdfReader.GetPageN(page);
            pageDictionary.Remove(PdfName.CONTENTS);
        }
        using (PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileStream(output, FileMode.Create, FileAccess.Write)))
        {
        }
    }