我使用以下代码填充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"的实际内容。
我查看了文档,但它从未涵盖过这样做,甚至可能吗?
答案 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)))
{
}
}
由于表单字段不是内容的一部分,但是注释悬停在其上方,您可以在填写表单之前或之后执行此操作。