2

我想添加一个指向文档中特定页面的书签。从其他 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 节或类似的内容。有没有可以用来指向任意页面的替代操作?还是别的什么方法?

4

1 回答 1

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;
于 2013-10-15T06:33:41.593 回答