使用 iText 库在 PDF 中生成分层书签

Posted

技术标签:

【中文标题】使用 iText 库在 PDF 中生成分层书签【英文标题】:Hierarchical Bookmark Generation in PDF using iText library 【发布时间】:2015-02-26 04:28:01 【问题描述】:

我在 ArrayList 中有如下数据:

static ArrayList<DTONodeDetail> tree;
public static void main(String[] args) 
    // TODO Auto-generated method stub
    tree=new ArrayList<DTONodeDetail>();

     //first argument->NodeId
     //second->NodeName
     // third -> ParentNodeId

    tree.add(getDTO(1,"Root",0));
    tree.add(getDTO(239,"Node-1",1));
    tree.add(getDTO(242,"Node-2",239));
    tree.add(getDTO(243,"Node-3",239));
    tree.add(getDTO(244,"Node-4",242));
    tree.add(getDTO(245,"Node-5",243));
    displayTree(tree.get(0));       



public static DTONodeDetail getDTO(int nodeId,String nodeName,int parentID)

    DTONodeDetail dto=new DTONodeDetail();
    dto.setNodeId(nodeId);
    dto.setNodeDisplayName(nodeName);
    dto.setParentID(parentID);

    return dto;

我可以在tree structure 中显示以上数据,如下所示:

Root
-----Node-1
------------Node-2
------------------Node-4
------------Node-3
------------------Node-5

我尝试使用 itext 库的 Chapter 类,但不知道如何生成分层书签。

我的问题是我可以使用 itext java 库在 pdf 中创建分层书签(如上)吗?

【问题讨论】:

【参考方案1】:

在 PDF 术语中,书签被称为 大纲。请查看我书中的CreateOutline 示例,了解如何创建大纲树,如本PDF 所示:outline_tree.pdf

我们从树的根开始:

PdfOutline root = writer.getRootOutline();

然后我们添加一个分支:

PdfOutline movieBookmark = new PdfOutline(root, 
            new PdfDestination(
                PdfDestination.FITH, writer.getVerticalPosition(true)),
            title, true);

在这个分支上,我们添加一个叶子:

PdfOutline link = new PdfOutline(movieBookmark,
            new PdfAction(String.format(RESOURCE, movie.getImdb())),
            "link to IMDB");

等等。

关键是使用PdfOutline,并在构造子大纲时将父大纲作为参数传递。

根据评论更新:

还有一个名为 BookmarkedTimeTable 的示例,我们以完全不同的方式创建大纲树:

ArrayList<HashMap<String, Object>> outlines = new ArrayList<HashMap<String, Object>>();
HashMap<String, Object> map = new HashMap<String, Object>();
outlines.add(map);

在这种情况下,map 是我们可以添加分支和叶子的根对象。完成后,我们将大纲树添加到PdfStamper,如下所示:

stamper.setOutlines(outlines);

请注意,PdfStamper 是我们在操作现有 PDF 时需要的类(而不是在我们从头开始创建 PDF 时使用的 PdfWriter)。

基于另一条评论的其他更新:

要创建层次结构,您只需添加孩子。

第一级:

HashMap<String, Object> calendar = new HashMap<String, Object>();
calendar.put("Title", "Calendar");

二级:

HashMap<String, Object> day = new HashMap<String, Object>();
day.put("Title", "Monday");
ArrayList<HashMap<String, Object>> days = new ArrayList<HashMap<String, Object>>();
days.add(day);
calendar.put("Kids", days);

第三级:

HashMap<String, Object> hour = new HashMap<String, Object>();
hour.put("Title", "10 AM");
ArrayList<HashMap<String, Object>> hours = new ArrayList<HashMap<String, Object>>();
hours.add(hour);
day.put("Kids", hours);

等等……

【讨论】:

我可以在现有的 pdf 中做吗?我的意思是不创建新的 pdf 我想在现有的 pdf 中添加书签。 谢谢布鲁诺。我无法使用它添加第三级。我的意思是假设在您的示例中我想将孩子添加到日期中。(例如日历-> 2014-03-02-> 星期一之类的分支) 这是初级编程@ButaniVijay,我会再次更新我的答案。

以上是关于使用 iText 库在 PDF 中生成分层书签的主要内容,如果未能解决你的问题,请参考以下文章

如何从iText 7中的PDF格式的轮廓/书签访问矩形,拟合类型,缩放,页码

使用 iText 将命名目的地添加到现有 PDF 文档

使用 iText 7 和 C# 在可访问的 pdf 中将标题添加为 H1

Java PDF书签——添加编辑删除读取书签

Office三件套批量转PDF以及PDF书签读写与加水印

PPT模板中的”书签”