C# 使用iTextSharp 4.1.6将书签添加到特定页面

C# 使用iTextSharp 4.1.6将书签添加到特定页面,c#,pdf,itextsharp,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", "Awesom

我想添加一个指向文档中特定页面的书签。从其他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;

但是显然
(“第页”,“8 XYZ 0 0”)
并没有引用第8页,而是引用第8节或类似的内容。是否有其他操作可用于指向任意页面?还是其他方法?

看起来PDF坐标系搞乱了我虚弱的人脑。结果是
(“页面”,“8xyz0”)实际上引用了第8页,但“XYZ 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;

“XYZ 0 0”不是指页面上的左上角点,而是指左下角点。-这在PDF中相当常见。实际上,你可以通过你的mediabox和cropbox条目为相关页面选择坐标原点,这些框通常从0,0开始,然后向右上移动。回想一下,在传统的数学坐标系中,这似乎是合乎逻辑的。我非常习惯于使用Java 2D和HTML/JS/CSS等系统,其中origo(0,0)位于左上角,这让我感到困惑;因为它们不指向指定的位置,而是指向页面上的某个点。唉。@Nenotlep——我是不是错过了什么?为什么不直接添加(“第1页”)?为什么要明确指定页面的“左上角”?只是wondering@BeemerGuy老实说,我不记得了。可能是我从来没有试过。我很幸运,因为我不再有那个代码了,我甚至不在同一家公司工作,所以我不会测试它。但是如果让我猜,
Add(“Page”,“1”)
转换为
Add(“Page”,“1xyz0”)0
引用了第1页的最底部,所以它会滚动,这样你就可以看到第2页了。