使用iTextSharp 4.1.6为特定页面添加书签

我想添加一个指向文档中特定页面的书签。 从其他PDF文件中添加书签我正在使用与下面类似的代码合并,但是当我复制它以将自定义书签添加到未加书签的项目时,它会失败:

var bookmarks = new ArrayList(); var writer = new PdfCopy(document, memorystream); // ... var uni = new Hashtable(); uni.Add("Action", "GoTo"); uni.Add("Title", "Awesome Unicorn pic"); uni.Add("Page", "8 XYZ 0 0 0"); bookmarks.Add(uni); // ... writer.Outlines = bookmarks; 

但显然("Page", "8 XYZ 0 0 0")并未引用 8 ,而是 8 或类似的内容。 是否有可用于指向任意页面的替代操作? 还是其他一些方法?

看起来PDF坐标系与我虚弱的人脑混乱。 结果是("Page", "8 XYZ 0 0 0"); 实际上是参考第8页,但“XYZ 0 0 0”不引用页面上的左上角,而是引用左下角。 因此,当点击时,这样的书签意外地将您带到第二页。 真棒。

下面的代码按预期工作,因为它获取第一页的高度并使用它链接到页面顶部。 代码是从我的源代码的不同地方收集的,所以它不是“在一起”,但仍然有效。

 var bookmarks = new ArrayList(); var rdr = new PdfReader(first); var doc = new Document(rdr.GetPageSizeWithRotation(1)); var wri = new PdfCopy(doc, memorystream); var temp = wri.GetImportedPage(rdr, 1); // get 1st page var h = temp.Height; // get height of 1st page // Add first item to bookmarks. var test = new Hashtable(); test.Add("Action", "GoTo"); test.Add("Title", "Page1 0 H 0"); test.Add("Page", "1 XYZ 0 "+h+" 0"); // use height of 1st page bookmarks.Add(test); // Do your worst and afterwards set the bookmarks to Outline. So yeah. wri.Outlines = bookmarks;