【问题标题】:how navigate one page to another page in PDF file by using itextsharp c#?如何使用 itextsharp c# 将一个页面导航到 PDF 文件中的另一个页面?
【发布时间】:2015-07-06 08:17:06
【问题描述】:

通过使用 itextsharp c#,我有一个 PDF 文件。在那个 PDF 文件中,我们有 10 页。在 PDF 文件的第一页,我想在底部有一个超链接来导航 PDF 文件的特定页面。例如,在 PDF 的第一页中,我希望底部的超链接转到第 5 页。注意:- 它不是新创建的文件。我想应用已经创建的文件。

【问题讨论】:

标签: c# pdf itextsharp


【解决方案1】:

非常很容易找到this 页面。您必须使用Anchor 并为其命名。然后你使用#name引用它:

Anchor click = new Anchor("Click to go to Target");
click.Reference = "#target";
Paragraph p1 = new Paragraph();
p1.Add(click);
doc.Add(p1);

Paragraph p2 = new Paragraph();
p2.Add(new Chunk("\n\n\n\n\n\n\n\n"));
doc.Add(p2);

Anchor target = new Anchor("This is the Target");
target.Name = "target";
Paragraph p3 = new Paragraph();
p3.Add(target);
doc.Add(p3);

在您的情况下:在每一页上放置这样的锚点,在第一页上引用所有这些锚点。

顺便说一句,你知道吗

当您打开 PDF 文件时,您的 PDF 查看器应用程序通常会显示文档结构的树形视图,每个分支或叶都充当指向相应章节或章节的链接。 iTextSharp 提供了通过其 Chapter 和 Section 类生成此树视图的功能。

这表示你不需要做任何事情,只需正确使用ChapterSection,你就会得到你需要的。

【讨论】:

  • “我没有得到正确的结果”不是一个准确的诊断。记录您想要什么、您尝试了什么以及结果与您想要的有何不同。
  • 实际上,上面的代码只在同一个页面中工作。我想转到 pdf 文件中的特定页面。
  • 例如,我有一个 10 页的 PDF 文件,我想转到第 5 页。
  • 如何拆分页面?如果您是通过自己插入分页符来做到这一点的(我认为Chapter 也这样做,不确定,是我上次使用ITextSharp 时的一段时间),那么只需为每个添加锚点然后引用。如果您没有明确拆分内容(例如,没有分页符的普通文档),那么您就有麻烦了,也许您必须进行一些事件处理和手动工作,请参阅this 问题。
  • @Sinatr 这似乎是一个失败的案例。您是否看过 OP 在我的回答中写的 cmets:他认为 variables a1a10 的名称指的是页码。啧啧……
【解决方案2】:

请查看AddNavigation 示例。这是您需要执行的 Java 版本:

public void manipulatePdf(String src, String dest) throws IOException, DocumentException {
    PdfReader reader = new PdfReader(src);
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
    PdfDestination d1 = new PdfDestination(PdfDestination.FIT);
    Rectangle rect = new Rectangle(0, 806, 595, 842);
    PdfAnnotation vijay = PdfAnnotation.createLink(stamper.getWriter(), rect, PdfAnnotation.HIGHLIGHT_INVERT, 10, d1);
    stamper.addAnnotation(vijay, 1);
    PdfDestination d2 = new PdfDestination(PdfDestination.FIT);
    PdfAnnotation krishna = PdfAnnotation.createLink(stamper.getWriter(), rect, PdfAnnotation.HIGHLIGHT_PUSH, 1, d2);
    stamper.addAnnotation(krishna, 10);
    stamper.close();
}

您想使用 iTextSharp 从第 1 页导航到第 5 页。这意味着我们必须进行一些小的调整:

首先你需要创建一个PdfDestination:

PdfDestination d = new PdfDestination(PdfDestination.FIT);

C# 代码与 Java 代码相同。

然后你需要创建一个Rectangle。这是人们可以点击的区域:

Rectangle rect = new Rectangle(0, 806, 595, 842);

C# 代码与 Java 代码相同,但请注意我在这里使用的是 harc 编码的坐标。我有一个包含 A4 页面的现有文档,该文档的创建方式是页面左下角的坐标为(0, 0)。我的坐标对应于页面的半英寸上边距。

现在我们创建一个链接注解:

PdfAnnotation a = PdfAnnotation.CreateLink(stamper.Writer,
    rect, PdfAnnotation.HIGHLIGHT_PUSH, 5, d);

您注意到 C# 和 Java 之间的细微差别了吗?方法CreateLink() 在C# 中以大写字母开头,而PdfStamper 中不存在getWriter(),您需要Writer 属性。在这种情况下,我跳转到第 5 页。

最后,我们给压模添加注解:

stamper.AddAnnotation(a, 1);

请注意,我再次将小写 (Java) 更改为大写 (C#)。

这会创建一个从第 1 页到第 5 页的链接。

完整示例创建了一个从第 1 页到第 10 页的链接以及从第 10 页到第 1 页的链接。您可以在此处进行测试:primes_links.pdf

【讨论】:

  • 我想将第一页导航到第五页。我现在在做什么?
  • 我的示例向您展示了如何从第 1 页导航到第 10 页。将 10 替换为 5,您将导航到第 5 页。您尝试过吗?我将在我的答案中更新 C# 代码。
  • 好的。感谢你。最后一个疑问。 a10和a1?我认为这些是页码。
  • a10a1变量名!你可以选择任何你想要的。你想让我用vijay替换a10,用krishna替换a1吗?代码将继续工作。
  • 完成!现在,变量名称指的是您个人@VijayKrishna。现在您不能再将变量名与页码混淆了。请尝试示例,如果可行,请接受答案。
猜你喜欢
  • 2016-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多