Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
7639 views
1
#include "mupdf/pdf.h"
2
3
static fz_outline *
4
pdf_load_outline_imp(fz_context *ctx, pdf_document *doc, pdf_obj *dict)
5
{
6
fz_outline *node, **prev, *first;
7
pdf_obj *obj;
8
pdf_obj *odict = dict;
9
10
fz_var(dict);
11
fz_var(first);
12
13
fz_try(ctx)
14
{
15
first = NULL;
16
prev = &first;
17
while (dict && pdf_is_dict(ctx, dict))
18
{
19
if (pdf_mark_obj(ctx, dict))
20
break;
21
node = fz_malloc_struct(ctx, fz_outline);
22
node->title = NULL;
23
node->dest.kind = FZ_LINK_NONE;
24
node->down = NULL;
25
node->next = NULL;
26
node->is_open = 0;
27
*prev = node;
28
prev = &node->next;
29
30
obj = pdf_dict_get(ctx, dict, PDF_NAME_Title);
31
if (obj)
32
node->title = pdf_to_utf8(ctx, doc, obj);
33
34
if ((obj = pdf_dict_get(ctx, dict, PDF_NAME_Dest)) != NULL)
35
node->dest = pdf_parse_link_dest(ctx, doc, FZ_LINK_GOTO, obj);
36
else if ((obj = pdf_dict_get(ctx, dict, PDF_NAME_A)) != NULL)
37
node->dest = pdf_parse_action(ctx, doc, obj);
38
39
obj = pdf_dict_get(ctx, dict, PDF_NAME_First);
40
if (obj)
41
{
42
node->down = pdf_load_outline_imp(ctx, doc, obj);
43
44
obj = pdf_dict_get(ctx, dict, PDF_NAME_Count);
45
if (pdf_to_int(ctx, obj) > 0)
46
node->is_open = 1;
47
}
48
49
dict = pdf_dict_get(ctx, dict, PDF_NAME_Next);
50
}
51
}
52
fz_always(ctx)
53
{
54
for (dict = odict; dict && pdf_obj_marked(ctx, dict); dict = pdf_dict_get(ctx, dict, PDF_NAME_Next))
55
pdf_unmark_obj(ctx, dict);
56
}
57
fz_catch(ctx)
58
{
59
fz_drop_outline(ctx, first);
60
fz_rethrow(ctx);
61
}
62
63
return first;
64
}
65
66
fz_outline *
67
pdf_load_outline(fz_context *ctx, pdf_document *doc)
68
{
69
pdf_obj *root, *obj, *first;
70
71
root = pdf_dict_get(ctx, pdf_trailer(ctx, doc), PDF_NAME_Root);
72
obj = pdf_dict_get(ctx, root, PDF_NAME_Outlines);
73
first = pdf_dict_get(ctx, obj, PDF_NAME_First);
74
if (first)
75
return pdf_load_outline_imp(ctx, doc, first);
76
77
return NULL;
78
}
79
80