添加GotoLocalPage的新操作以在PDF中显示注释

时间:2017-01-28 20:58:55

标签: c# itext

我想使用iTextSharp添加GotoLocalPage动作。遗憾的是,书iText in Action - Second Edition(仅适用于Java的示例)中没有涉及到这一点。

到目前为止,我做了什么?我的注释包含JavaScript代码,我将其删除:

//remove current JavaScript action
annotAction.Remove(PdfName.S);
annotAction.Remove(PdfName.JAVASCRIPT);

我不知道这是否应该这样做,但它工作正常。现在,当我删除reductant动作时,我想为此(已存在的)注释添加一个新动作。但是,以下代码不会添加操作。

PdfAction action = PdfAction.GotoLocalPage(1,
new PdfDestination(PdfDestination.XYZ, 0, 0, 0.75f), stamper.Writer);
annotAction.Put(PdfName.D,action);

修改

以下是我的更多代码:

for (int i = 1; i <= reader.NumberOfPages; i++)
{
    // Get a page a PDF page
    PdfDictionary page = reader.GetPageN(i);
    // Get all the annotations of page i
    PdfArray annotsArray = page.GetAsArray(PdfName.ANNOTS);

    // If page does not have annotations
    if (annotsArray == null)
    {
        continue;
    }

    // For each annotation
    for (int j = 0; j < annotsArray.Size; ++j)
    {
        // For current annotation
        PdfDictionary curAnnot = annotsArray.GetAsDict(j);

        // check if has JS
        PdfDictionary annotAction = curAnnot.GetAsDict(PdfName.A);
        if (annotAction == null)
        {
            Console.Write("Page {0}, ", i);
            Console.Write("annotation {0}: ", j);
            Console.Write("no action\n");
        }

        // test if it is a JavaScript action
        else if (PdfName.JAVASCRIPT.Equals(annotAction.Get(PdfName.S)))
        {
            PdfObject scriptObject = annotAction.GetDirectObject(PdfName.JS);
            if (scriptObject == null)
            {
                continue;
            }
            if (scriptObject.IsString())
                script = ((PdfString)scriptObject).ToUnicodeString();
            else if (scriptObject.IsStream())
            {
                using (MemoryStream stream = new MemoryStream())
                {
                    ((PdfStream)scriptObject).WriteContent(stream);
                    script = stream.ToString();
                }
            }
            else
            {
                Console.WriteLine("malformed JS entry");
                continue;
            }
            if (script.Contains("if (this.hostContainer"))
            {
                //your code here
                }
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

为动作设置

/D键以指定目的地。在您的特定情况下,您的action将使用/D键,其中包含您正在创建的PdfDestination对象的值。

但是,您尝试将操作对象设置为/D键的值,但是您应该设置目标,即

annotAction.Put(PdfName.D, action.get(PdfName.D));

但是,这还不够,因为您删除了/S键,这是操作所必需的键,在您尝试实现的情况下应该是GoTo。所以你也需要这一行:

annotAction.Put(PdfName.S, PdfName.GOTO);

但是,有一种更简单,更清洁的方式来达到你想要的效果。您可以使用最初的curAnnot对象,从中获取annotAction。您可以使用您创建的新操作替换现有的JavaScript操作,并正确设置/A键:

PdfAction action = PdfAction.GotoLocalPage(1, new PdfDestination(PdfDestination.XYZ, 0, 0, 0.75f), stamper.Writer);
curAnnot.Put(PdfName.A, action);