【问题标题】:Reading PDF Bookmarks in VB.NET using iTextSharp使用 iTextSharp 在 VB.NET 中阅读 PDF 书签
【发布时间】:2015-02-28 15:31:30
【问题描述】:

我正在制作一个扫描 PDF 文件并在 PDF 书签和正文中搜索文本的工具。我正在使用带有 iTextSharp 的 VB.NET 的 Visual Studio 2008。

如何从现有 PDF 文件加载书签列表?

【问题讨论】:

  • 到目前为止,我已经开始使用 PDFReader 类,但不知道如何枚举书签。

标签: vb.net pdf itextsharp itext


【解决方案1】:

这取决于你说“书签”时的理解。

您想要大纲(书签面板中可见的条目):

CreateOnlineTree 示例向您展示了如何使用SimpleBookmark 类创建包含完整大纲树的 XML 文件(在 PDF 行话中,书签称为大纲)。

Java:

PdfReader reader = new PdfReader(src);
List<HashMap<String, Object>> list = SimpleBookmark.getBookmark(reader);
SimpleBookmark.exportToXML(list,
        new FileOutputStream(dest), "ISO8859-1", true);
reader.close();

C#:

PdfReader reader = new PdfReader(pdfIn);
var list = SimpleBookmark.GetBookmark(reader);
using (MemoryStream ms = new MemoryStream()) {
    SimpleBookmark.ExportToXML(list, ms, "ISO8859-1", true); 
    ms.Position = 0;
    using (StreamReader sr =  new StreamReader(ms)) {
        return sr.ReadToEnd();
    }              
} 

list 对象也可用于以编程方式一一检查不同的书签元素(这在官方文档中都有解释)。

您想要指定的目的地(文档中您可以通过名称链接到的特定位置):

现在假设您的意思是命名目的地,那么您需要 SimpleNamedDestination 类,如 LinkActions 示例所示:

Java:

PdfReader reader = new PdfReader(src);
HashMap<String,String> map = SimpleNamedDestination.getNamedDestination(reader, false);
SimpleNamedDestination.exportToXML(map, new FileOutputStream(dest),
        "ISO8859-1", true);
reader.close();

C#:

PdfReader reader = new PdfReader(src);
Dictionary<string,string> map = SimpleNamedDestination
      .GetNamedDestination(reader, false);
using (MemoryStream ms = new MemoryStream()) {
    SimpleNamedDestination.ExportToXML(map, ms, "ISO8859-1", true);
    ms.Position = 0;
    using (StreamReader sr =  new StreamReader(ms)) {
      return sr.ReadToEnd();
    }
}

map 对象还可用于以编程方式一一检查不同的命名目的地。请注意检索命名目标时使用的Boolean 参数。可以使用 PDF 名称对象作为名称或使用 PDF 字符串对象来存储命名目的地。 Boolean 参数表示您想要前者(true = 存储为 PDF 名称对象)还是后者(false = 存储为 PDF 字符串对象)类型的命名目的地。

命名目标是 PDF 文件中的预定义目标,可通过其名称找到。虽然正式名称为destinations,但有些人也称它们为书签(但当我们在PDF上下文中说书签时,我们通常要指代大纲)。

【讨论】:

  • 嗯?为什么投反对票?如果投反对票的人解释了我的回答有什么问题,那将会有所帮助。我给出了关于如何检索大纲和命名目的地的 Java/C# 示例,这两个概念可以解释为“书签”。还有什么可以期待的?
  • 好的,-1 让我稍微改进了答案,例如解释提取命名目的地时Boolean 参数的含义。
  • 我的书签是指大纲,所以答案的第一部分为我指明了正确的方向。但是对我来说,转换为 XML 是没有用的,因为我只需要执行搜索,所以我将使用“列表”对象来枚举书签。由于 iText 文档分为类参考和一本书(我没有),我需要一个起点。干杯!附言我没有投反对票。
  • XML 将让您深入了解list 中的元素。这个列表应该被解释为一棵树,其中每个条目的值可以是叶子(例如标题)或分支(例如一系列新的“孩子”)。也许对答案投反对票的人就是对问题投反对票的人......
  • 对好的答案投反对票可能会无意中发生(很少见),由于一时的分心而意外点击了错误的箭头;或者投反对票的人度过了糟糕的一天(也很少见)......我曾经不小心投了一个我知道我肯定打算投赞成票的答案。几天后通过检查我自己的投票历史发现了它。当然,我回复了该投票并使其成为赞成票。
【解决方案2】:

如果有人仍在搜索 vb.net 解决方案,试图简化,我有大量使用 reportbuilder 创建的 pdf,使用 documentmap 我会自动添加书签“标题”。因此,我使用 iTextSharp 阅读了 pdf 并仅提取了第一个书签值:

    Dim oReader As New iTextSharp.text.pdf.PdfReader(PdfFileName)
    Dim list As Object
    list = SimpleBookmark.GetBookmark(oReader)
    Dim string_book As String
    string_book = list(0).item("Title")

对于搜索起点以了解其工作原理的人来说,这是一个非常简单的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多