我想使用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
}
}
}
}
答案 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);