我有一个巨大的,生成的PDF文件(巨大的=几千页),我想跳进去。我无法使用a.pdf#page=123
跳转到页面,因为页码可能会更改,我不想管理页码引用。所以我想在该PDF中创建命名目的地以跳转到。这些目的地将基于书签,这些书签由生成过程创建。我没有遇到麻烦,访问和解析书签。但我似乎无法找到正确的方法调用组合来创建命名目标。
我查看了不同的文章和帖子(例如this,this甚至itextpdf.com/examples),但仍然没有成功。这是我试过的:
using(var reader = new PdfReader(sourcePath))
using(var stamper = new PdfStamper(reader, new FileStream(drainPath, FileMode.Create))
{
var dest1 = new PdfDestination(PdfDestination.XYZ, 57, 575, 0);
var page = reader.GetPageOrigRef(18);
dest1.AddPage(page);
stamper.Writer.AddNamedDestination("123", 18, dest1);
var dest2 = new PdfDestination("18 XYZ 57 575 0");
stamper.Writer.AddNamedDestination("124", 18, dest2);
var dest3 = new PdfDestination("18 XYZ 57 575 0");
page = reader.GetPageOrigRef(18);
dest3.AddPage(page);
stamper.Writer.AddNamedDestination("125", 18, dest3);
var map1 = new Dictionary<string, string> { { "126", "18 XYZ 57 575 0" } };
stamper.Writer.AddNamedDestinations(map1, 1);
var map2 = new Dictionary<string, string> { { "127", "18 /XYZ 57 575 0" } };
stamper.Writer.AddNamedDestinations(map2, 1);
var dest4 = new PdfDestination(PdfDestination.XYZ);
page = reader.GetPageOrigRef(18);
dest4.AddPage(page);
stamper.Writer.AddNamedDestination("128", 18, dest4);
}
但是当我尝试从更改的文件中读取目的地时,我没有得到任何目的地......我尝试了多种方法来获取它们:
using (var reader = new PdfReader(drainPath))
{
ICollection namedDests = reader.GetNamedDestination();
ICollection namedDestsName = reader.GetNamedDestination(true);
ICollection namedDestsNoName = reader.GetNamedDestination(false);
ICollection simpleDestName = SimpleNamedDestination.GetNamedDestination(reader, true);
ICollection simpleDestNoName = SimpleNamedDestination.GetNamedDestination(reader, false);
ICollection fromNames = reader.GetNamedDestinationFromNames();
ICollection fromNamesTrue = reader.GetNamedDestinationFromNames(true);
ICollection fromNamesFalse = reader.GetNamedDestinationFromNames(false);
ICollection fromStrings = reader.GetNamedDestinationFromStrings();
var sum = new[]
{
namedDests, namedDestsName, namedDestsNoName,
simpleDestName, simpleDestNoName, fromNames,
fromNamesTrue, fromNamesFalse, fromStrings
}.Sum(i => i.Count);
Assert.AreNotEqual(0, sum);
}
但总和仍为0,此测试失败。我甚至走得更远,在firefox中测试我的目的地,从drainPath
打开文件并附加#namedDest=123
(124,125等等),但没有成功......
所以在这一点上,我很确定,该PDF没有添加任何目的地。
我正在使用iTextSharp 5.5.10,我的源PDF有30页,使第18页的目的地有效。