-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtwpages.c
93 lines (82 loc) · 3.21 KB
/
twpages.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/*
* Copyright (C) 2023 Christopher Lang
* See LICENSE for license details.
*/
#include <stdarg.h>
#include <stdlib.h>
#include "utils.h"
#include "twpdf.h"
#include "twpages.h"
void
pdf_pages_init(struct pdf *pdf, struct pdf_pages *pages)
{
pages->page_allocated = 64;
pages->page_count = 0;
pages->page_objs = xmalloc(pages->page_allocated * sizeof(void *));
pages->pages_parent_ref = pdf_allocate_indirect_obj(pdf);
}
void
pdf_pages_free(struct pdf_pages *pages)
{
free(pages->page_objs);
}
void
pdf_pages_add_page(struct pdf *pdf, struct pdf_pages *pages,
struct pdf_obj_indirect *content)
{
struct pdf_obj_dictionary *page;
page = pdf_create_dictionary(pdf);
page = pdf_prepend_dictionary(pdf, page, "Type",
(struct pdf_obj *)pdf_create_name(pdf, "Page"));
page = pdf_prepend_dictionary(pdf, page, "Parent",
(struct pdf_obj *)pages->pages_parent_ref);
page = pdf_prepend_dictionary(pdf, page, "Contents",
(struct pdf_obj *)content);
if (pages->page_count == pages->page_allocated) {
pages->page_allocated += 64;
pages->page_objs = xrealloc(pages->page_objs, pages->page_allocated * sizeof(void *));
}
pages->page_objs[pages->page_count++] = (struct pdf_obj *)page;
}
void
pdf_pages_define_catalogue(struct pdf *pdf, struct pdf_obj_indirect *ref,
struct pdf_pages *pages, struct pdf_obj *resources)
{
int i;
struct pdf_obj_indirect *page_ref;
struct pdf_obj_array *pages_array, *media_box;
struct pdf_obj_dictionary *pages_parent, *catalogue;
media_box = pdf_create_array(pdf);
media_box = pdf_prepend_array(pdf, media_box,
(struct pdf_obj *)pdf_create_integer(pdf, 842));
media_box = pdf_prepend_array(pdf, media_box,
(struct pdf_obj *)pdf_create_integer(pdf, 595));
media_box = pdf_prepend_array(pdf, media_box,
(struct pdf_obj *)pdf_create_integer(pdf, 0));
media_box = pdf_prepend_array(pdf, media_box,
(struct pdf_obj *)pdf_create_integer(pdf, 0));
pages_array = pdf_create_array(pdf);
for (i = pages->page_count - 1; i >= 0; i--) {
page_ref = pdf_allocate_indirect_obj(pdf);
pdf_define_obj(pdf, page_ref, pages->page_objs[i], 0);
pages_array = pdf_prepend_array(pdf, pages_array, (struct pdf_obj *)page_ref);
}
pages_parent = pdf_create_dictionary(pdf);
pages_parent = pdf_prepend_dictionary(pdf, pages_parent, "Type",
(struct pdf_obj *)pdf_create_name(pdf, "Pages"));
pages_parent = pdf_prepend_dictionary(pdf, pages_parent, "Kids",
(struct pdf_obj *)pages_array);
pages_parent = pdf_prepend_dictionary(pdf, pages_parent, "Count",
(struct pdf_obj *)pdf_create_integer(pdf, pages->page_count));
pages_parent = pdf_prepend_dictionary(pdf, pages_parent, "Resources",
resources);
pages_parent = pdf_prepend_dictionary(pdf, pages_parent, "MediaBox",
(struct pdf_obj *)media_box);
catalogue = pdf_create_dictionary(pdf);
catalogue = pdf_prepend_dictionary(pdf, catalogue, "Type",
(struct pdf_obj *)pdf_create_name(pdf, "Catalog"));
catalogue = pdf_prepend_dictionary(pdf, catalogue, "Pages",
(struct pdf_obj *)pages->pages_parent_ref);
pdf_define_obj(pdf, pages->pages_parent_ref, (struct pdf_obj *)pages_parent, 0);
pdf_define_obj(pdf, ref, (struct pdf_obj *)catalogue, 1);
}