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

时间:2017-05-09 13:00:16

标签: 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(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"的实际内容。

我查看了文档,但它从未涵盖过这样做,甚至可能吗?

1 个答案:

答案 0 :(得分:1)

  

指示是否呈现文档的基础层。

首先,在PDF的上下文中,术语 layer 未在规范中定义;但是,如果使用它,这通常是作为可选内容组(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();
        }
    }
    
  • 或删除整个内容。

    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)))
        {
        }
    }
    

由于表单字段不是内容的一部分,但是注释悬停在其上方,您可以在填写表单之前或之后执行此操作。