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

时间:2013-10-14 13:05:49

标签: c# pdf itextsharp

我想添加指向文档中特定页面的书签。从其他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")并未引用 Page 8,而是 Section 8或类似的东西。是否有可用于指向任意页面的替代操作?还是其他一些方法?

1 个答案:

答案 0 :(得分:3)

看起来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;