From ad6da4a71f2b837a791401e658a16bf6903fd3b5 Mon Sep 17 00:00:00 2001 From: Vincent Sanders Date: Fri, 5 Jan 2018 15:40:09 +0000 Subject: split out page handling into new module --- src/Makefile | 2 +- src/document.c | 113 +--------------------------------------------- src/page.c | 138 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/pdf_doc.h | 2 + 4 files changed, 142 insertions(+), 113 deletions(-) create mode 100644 src/page.c (limited to 'src') diff --git a/src/Makefile b/src/Makefile index c4ddc7f..09bde65 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,3 +1,3 @@ -DIR_SOURCES := document.c byte_class.c cos_parse.c cos_object.c pdf_doc.c meta.c +DIR_SOURCES := document.c byte_class.c cos_parse.c cos_object.c pdf_doc.c meta.c page.c include $(NSBUILD)/Makefile.subdir diff --git a/src/document.c b/src/document.c index cef2c1a..3dea95e 100644 --- a/src/document.c +++ b/src/document.c @@ -461,117 +461,6 @@ static nspdferror decode_trailers(struct nspdf_doc *doc) } -/** - * recursively decodes a page tree - */ -static nspdferror -decode_page_tree(struct nspdf_doc *doc, - struct cos_object *page_tree_node, - unsigned int *page_index) -{ - nspdferror res; - const char *type; - - // Type = Pages - res = cos_get_dictionary_name(doc, page_tree_node, "Type", &type); - if (res != NSPDFERROR_OK) { - return res; - } - - if (strcmp(type, "Pages") == 0) { - struct cos_object *kids; - unsigned int kids_size; - unsigned int kids_index; - - if (doc->page_table == NULL) { - /* allocate top level page table */ - int64_t count; - - res = cos_get_dictionary_int(doc, page_tree_node, "Count", &count); - if (res != NSPDFERROR_OK) { - return res; - } - - doc->page_table = calloc(count, sizeof(struct page_table_entry)); - if (doc->page_table == NULL) { - return NSPDFERROR_NOMEM; - } - doc->page_table_size = count; - } - - res = cos_get_dictionary_array(doc, page_tree_node, "Kids", &kids); - if (res != NSPDFERROR_OK) { - return res; - } - - res = cos_get_array_size(doc, kids, &kids_size); - if (res != NSPDFERROR_OK) { - return res; - } - - for (kids_index = 0; kids_index < kids_size; kids_index++) { - struct cos_object *kid; - - res = cos_get_array_dictionary(doc, kids, kids_index, &kid); - if (res != NSPDFERROR_OK) { - return res; - } - - res = decode_page_tree(doc, kid, page_index); - if (res != NSPDFERROR_OK) { - return res; - } - } - - } else if (strcmp(type, "Page") == 0) { - struct page_table_entry *page; - - page = doc->page_table + (*page_index); - - /* required heritable resources */ - res = cos_heritable_dictionary_dictionary(doc, - page_tree_node, - "Resources", - &(page->resources)); - if (res != NSPDFERROR_OK) { - return res; - } - - /* required heritable mediabox */ - res = cos_heritable_dictionary_array(doc, - page_tree_node, - "MediaBox", - &(page->mediabox)); - if (res != NSPDFERROR_OK) { - return res; - } - - /* optional page contents */ - res = cos_get_dictionary_value(doc, - page_tree_node, - "Contents", - &(page->contents)); - if ((res != NSPDFERROR_OK) && - (res != NSPDFERROR_NOTFOUND)) { - return res; - } - - /* - printf("page index:%d page:%p resources:%p mediabox:%p contents:%p\n", - *page_index, - page, - page->resources, - page->mediabox, - page->contents); - */ - - (*page_index)++; - res = NSPDFERROR_OK; - } else { - res = NSPDFERROR_FORMAT; - } - return res; -} static nspdferror decode_catalog(struct nspdf_doc *doc) @@ -602,7 +491,7 @@ static nspdferror decode_catalog(struct nspdf_doc *doc) return res; } - res = decode_page_tree(doc, pages, &page_index); + res = nspdf__decode_page_tree(doc, pages, &page_index); if (res != NSPDFERROR_OK) { return res; } diff --git a/src/page.c b/src/page.c new file mode 100644 index 0000000..bca6dbc --- /dev/null +++ b/src/page.c @@ -0,0 +1,138 @@ +/* + * Copyright 2018 Vincent Sanders + * + * This file is part of libnspdf. + * + * Licensed under the MIT License, + * http://www.opensource.org/licenses/mit-license.php + */ + +#include +#include +#include +#include +#include +#include + +#include "cos_object.h" +#include "pdf_doc.h" + +/** + * recursively decodes a page tree + */ +nspdferror +nspdf__decode_page_tree(struct nspdf_doc *doc, + struct cos_object *page_tree_node, + unsigned int *page_index) +{ + nspdferror res; + const char *type; + + // Type = Pages + res = cos_get_dictionary_name(doc, page_tree_node, "Type", &type); + if (res != NSPDFERROR_OK) { + return res; + } + + if (strcmp(type, "Pages") == 0) { + struct cos_object *kids; + unsigned int kids_size; + unsigned int kids_index; + + if (doc->page_table == NULL) { + /* allocate top level page table */ + int64_t count; + + res = cos_get_dictionary_int(doc, page_tree_node, "Count", &count); + if (res != NSPDFERROR_OK) { + return res; + } + + doc->page_table = calloc(count, sizeof(struct page_table_entry)); + if (doc->page_table == NULL) { + return NSPDFERROR_NOMEM; + } + doc->page_table_size = count; + } + + res = cos_get_dictionary_array(doc, page_tree_node, "Kids", &kids); + if (res != NSPDFERROR_OK) { + return res; + } + + res = cos_get_array_size(doc, kids, &kids_size); + if (res != NSPDFERROR_OK) { + return res; + } + + for (kids_index = 0; kids_index < kids_size; kids_index++) { + struct cos_object *kid; + + res = cos_get_array_dictionary(doc, kids, kids_index, &kid); + if (res != NSPDFERROR_OK) { + return res; + } + + res = nspdf__decode_page_tree(doc, kid, page_index); + if (res != NSPDFERROR_OK) { + return res; + } + } + + } else if (strcmp(type, "Page") == 0) { + struct page_table_entry *page; + + page = doc->page_table + (*page_index); + + /* required heritable resources */ + res = cos_heritable_dictionary_dictionary(doc, + page_tree_node, + "Resources", + &(page->resources)); + if (res != NSPDFERROR_OK) { + return res; + } + + /* required heritable mediabox */ + res = cos_heritable_dictionary_array(doc, + page_tree_node, + "MediaBox", + &(page->mediabox)); + if (res != NSPDFERROR_OK) { + return res; + } + + /* optional page contents */ + res = cos_get_dictionary_value(doc, + page_tree_node, + "Contents", + &(page->contents)); + if ((res != NSPDFERROR_OK) && + (res != NSPDFERROR_NOTFOUND)) { + return res; + } + + /* + printf("page index:%d page:%p resources:%p mediabox:%p contents:%p\n", + *page_index, + page, + page->resources, + page->mediabox, + page->contents); + */ + + (*page_index)++; + res = NSPDFERROR_OK; + } else { + res = NSPDFERROR_FORMAT; + } + return res; +} + +/* exported interface documented in nspdf/page.h */ +nspdferror +nspdf_count_pages(struct nspdf_doc *doc, unsigned int *pages_out) +{ + *pages_out = doc->page_table_size; + return NSPDFERROR_OK; +} diff --git a/src/pdf_doc.h b/src/pdf_doc.h index e9bdc14..a75c90e 100644 --- a/src/pdf_doc.h +++ b/src/pdf_doc.h @@ -49,3 +49,5 @@ nspdferror doc_skip_ws(struct nspdf_doc *doc, uint64_t *offset); nspdferror doc_skip_eol(struct nspdf_doc *doc, uint64_t *offset); nspdferror xref_get_referenced(struct nspdf_doc *doc, struct cos_object **cobj_out); + +nspdferror nspdf__decode_page_tree(struct nspdf_doc *doc, struct cos_object *page_tree_node, unsigned int *page_index); -- cgit v1.2.3