iTextSharp:根据书签将命名目的地添加到现有pdf

时间:2017-01-26 10:20:36

标签: c# pdf itext

我有一个巨大的,生成的PDF文件(巨大的=几千页),我想跳进去。我无法使用a.pdf#page=123跳转到页面,因为页码可能会更改,我不想管理页码引用。所以我想在该PDF中创建命名目的地以跳转到。这些目的地将基于书签,这些书签由生成过程创建。我没有遇到麻烦,访问和解析书签。但我似乎无法找到正确的方法调用组合来创建命名目标。

我查看了不同的文章和帖子(例如thisthis甚至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页的目的地有效。

0 个答案:

没有答案