使用 itext7 .NET 设置标记层(自由文本)PDF

Set layer for markup (FreeText) PDF using itext7 .NET

如何使用 itext7 .NET 为现有标记 (FreeText) PDF 设置图层?我使用下面的代码,但它不起作用。请帮忙。谢谢

public void SetLayerMarkup()
{
    string inPDF = @"C:\in PDF.pdf";
    string outPDF = @"C:\out PDF.pdf";
    PdfDocument pdfDoc = new PdfDocument(new PdfReader(inPDF), new PdfWriter(outPDF));
    PdfLayer notPrint = new PdfLayer("Non Print", pdfDoc);
    int numberOfPages = pdfDoc.GetNumberOfPages();
    for (int i = 1; i <= numberOfPages; i++)
    {
        PdfDictionary page = pdfDoc.GetPage(i).GetPdfObject();
        PdfArray annotArray = page.GetAsArray(PdfName.Annots);
        if (annotArray == null)
        {
            continue;
        }
        int size = annotArray.Size();
        for (int x = 0; x < size; x++)
        {
            PdfDictionary curAnnot = annotArray.GetAsDictionary(x);
            if (curAnnot.GetAsString(PdfName.Contents) != null)
            {
                string contents = curAnnot.GetAsString(PdfName.Contents).ToString();
                if (contents != "" && contents.Contains("old content")) //set layer for a FreeText with this content
                {
                    PdfDictionary layer = new PdfDictionary();
                    layer.Put(PdfName.Type, PdfName.OCG);
                    layer.Put(PdfName.Name, new PdfString("Non Print"));
                    curAnnot.Put(PdfName.OC, layer);
                }
            }
        }
    }
    pdfDoc.Close();
}

或者如何修复上面的代码以匹配此图像(在 iText RUPS 5.5.9 中)?:

附加源 PDF 文件:here

因此您的原始文档没有任何图层:

首先,我们需要用助手 API:

创建一个
PdfLayer layer = new PdfLayer("Non Print", pdfDocument);

代码现在可以更简单一些(我的示例在 Java 但转换到 C# 应该非常简单):

PdfDocument pdfDocument = new PdfDocument(new PdfReader("in PDF.pdf"),
        new PdfWriter("out PDF.pdf"));
PdfLayer layer = new PdfLayer("Non Print", pdfDocument);

int numberOfPages = pdfDocument.getNumberOfPages();
for (int i = 1; i <= numberOfPages; i++) {
    PdfDictionary page = pdfDocument.getPage(i).getPdfObject();
    PdfArray annotArray = page.getAsArray(PdfName.Annots);
    if (annotArray == null) {
        continue;
    }
    int size = annotArray.size();
    for (int x = 0; x < size; x++) {
        PdfDictionary curAnnot = annotArray.getAsDictionary(x);
        if (curAnnot.getAsString(PdfName.Contents) != null) {
            String contents = curAnnot.getAsString(PdfName.Contents).toString();
            if (!contents.isEmpty() && contents.contains("old content")) //set layer for a FreeText with this content
            {
                curAnnot.put(PdfName.OC, layer.getPdfObject());
            }
        }
    }
}

pdfDocument.close();

因此,您得到一个包含图层的文档:

如果单击图层名称旁边的眼睛图标,图层的内容将隐藏:

根据您的代码,我修改了如下代码,效果很好,谢谢。

PdfDictionary layer = new PdfDictionary(); 
layer.Put(PdfName.Type, PdfName.OCG); 
layer.Put(PdfName.Name, new PdfString("Non Print")); 
curAnnot.Put(PdfName.OC, layer); 

至:

curAnnot.Put(PdfName.OC, notPrint.GetPdfObject());