⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pdf_pagetree.c.svn-base

📁 SumatraPDF是一款小型开源的pdf阅读工具。虽然玲珑小巧(只有800多KB)
💻 SVN-BASE
字号:
#include "fitz.h"#include "mupdf.h"struct stuff{	fz_obj *resources;	fz_obj *mediabox;	fz_obj *cropbox;	fz_obj *rotate;};static fz_error *loadpagetree(pdf_xref *xref, pdf_pagetree *pages,		struct stuff inherit, fz_obj *obj, fz_obj *ref, int *pagenum){	fz_error *error;	fz_obj *type;	fz_obj *kids;	fz_obj *kref, *kobj;	fz_obj *inh;	char *typestr;	int i;	type = fz_dictgets(obj, "Type");	if (!type)	{		fz_warn("pagetree node (%d %d R) lacks required type", fz_tonum(ref), fz_togen(ref));		kids = fz_dictgets(obj, "Kids");		if (kids)		{			fz_warn("guessing it may be a pagetree node, continuing...");			typestr = "Pages";		}		else		{			fz_warn("guessing it may be a page, continuing...");			typestr = "Page";		}	}	else		typestr = fz_toname(type);	if (strcmp(typestr, "Page") == 0)	{		pdf_logpage("page %d (%d %d R)\n", *pagenum, ref->u.r.oid, ref->u.r.gid);		(*pagenum)++;		if (inherit.resources && !fz_dictgets(obj, "Resources"))		{			pdf_logpage("inherit resources (%d)\n", pages->cursor);			error = fz_dictputs(obj, "Resources", inherit.resources);			if (error) return fz_rethrow(error, "cannot inherit page tree resources");		}		if (inherit.mediabox && !fz_dictgets(obj, "MediaBox"))		{			pdf_logpage("inherit mediabox (%d)\n", pages->cursor);			error = fz_dictputs(obj, "MediaBox", inherit.mediabox);			if (error) return fz_rethrow(error, "cannot inherit page tree mediabox");		}		if (inherit.cropbox && !fz_dictgets(obj, "CropBox"))		{			pdf_logpage("inherit cropbox (%d)\n", pages->cursor);			error = fz_dictputs(obj, "CropBox", inherit.cropbox);			if (error) return fz_rethrow(error, "cannot inherit page tree cropbox");		}		if (inherit.rotate && !fz_dictgets(obj, "Rotate"))		{			pdf_logpage("inherit rotate (%d)\n", pages->cursor);			error = fz_dictputs(obj, "Rotate", inherit.rotate);			if (error) return fz_rethrow(error, "cannot inherit page tree rotate");		}		pages->pref[pages->cursor] = fz_keepobj(ref);		pages->pobj[pages->cursor] = fz_keepobj(obj);		pages->cursor ++;	}	else if (strcmp(typestr, "Pages") == 0)	{		inh = fz_dictgets(obj, "Resources");		if (inh) inherit.resources = inh;		inh = fz_dictgets(obj, "MediaBox");		if (inh) inherit.mediabox = inh;		inh = fz_dictgets(obj, "CropBox");		if (inh) inherit.cropbox = inh;		inh = fz_dictgets(obj, "Rotate");		if (inh) inherit.rotate = inh;		kids = fz_dictgets(obj, "Kids");		error = pdf_resolve(&kids, xref);		if (error)			return fz_rethrow(error, "cannot resolve /Kids");		pdf_logpage("subtree %d pages (%d %d R) {\n",				fz_arraylen(kids), ref->u.r.oid, ref->u.r.gid);		for (i = 0; i < fz_arraylen(kids); i++)		{			kref = fz_arrayget(kids, i);			error = pdf_loadindirect(&kobj, xref, kref);			if (error) { fz_dropobj(kids); return fz_rethrow(error, "cannot load kid"); }			if (kobj == obj)			{				/* prevent infinite recursion possible in maliciously crafted PDFs */				fz_dropobj(kids);				return fz_throw("corrupted pdf file");			}			error = loadpagetree(xref, pages, inherit, kobj, kref, pagenum);			fz_dropobj(kobj);			if (error) { fz_dropobj(kids); return fz_rethrow(error, "cannot load pagesubtree (%d %d R)", fz_tonum(kref), fz_togen(kref)); }		}		fz_dropobj(kids);		pdf_logpage("}\n");	}	return fz_okay;}voidpdf_debugpagetree(pdf_pagetree *pages){	int i;	printf("<<\n  /Type /Pages\n  /Count %d\n  /Kids [\n", pages->count);	for (i = 0; i < pages->count; i++) {		printf("    %% page %d\n", i + 1);		printf("    ");		fz_debugobj(pages->pref[i]);	}	printf("  ]\n>>\n");}fz_error *pdf_loadpagetree(pdf_pagetree **pp, pdf_xref *xref){	fz_error *error;	struct stuff inherit;	pdf_pagetree *p = nil;	fz_obj *catalog = nil;	fz_obj *pages = nil;	fz_obj *trailer;	fz_obj *ref;	fz_obj *treeref;	int count;	int pagenum = 1;	inherit.resources = nil;	inherit.mediabox = nil;	inherit.cropbox = nil;	inherit.rotate = nil;	trailer = xref->trailer;	ref = fz_dictgets(trailer, "Root");	error = pdf_loadindirect(&catalog, xref, ref);	if (error) { error = fz_rethrow(error, "cannot load Root object"); goto cleanup; }	treeref = fz_dictgets(catalog, "Pages");	error = pdf_loadindirect(&pages, xref, treeref);	if (error) { error = fz_rethrow(error, "cannot load Pages object"); goto cleanup; }	ref = fz_dictgets(pages, "Count");	count = fz_toint(ref);	p = fz_malloc(sizeof(pdf_pagetree));	if (!p) { error = fz_throw("outofmem: page tree struct"); goto cleanup; }	pdf_logpage("load pagetree %d pages (%d %d R) ptr=%p {\n", count, treeref->u.r.oid, treeref->u.r.gid, p);	p->pref = nil;	p->pobj = nil;	p->count = count;	p->cursor = 0;	p->pref = fz_malloc(sizeof(fz_obj*) * count);	if (!p->pref) { error = fz_throw("outofmem: page tree reference array"); goto cleanup; }	p->pobj = fz_malloc(sizeof(fz_obj*) * count);	if (!p->pobj) { error = fz_throw("outofmem: page tree object array"); goto cleanup; }	error = loadpagetree(xref, p, inherit, pages, treeref, &pagenum);	if (error) { error = fz_rethrow(error, "cannot load pagetree (%d %d R)", fz_tonum(treeref), fz_togen(treeref)); goto cleanup; }	fz_dropobj(pages);	fz_dropobj(catalog);	pdf_logpage("}\n", count);	*pp = p;	return fz_okay;cleanup:	if (pages) fz_dropobj(pages);	if (catalog) fz_dropobj(catalog);	if (p) {		fz_free(p->pref);		fz_free(p->pobj);		fz_free(p);	}	return error; /* already rethrown */}intpdf_getpagecount(pdf_pagetree *pages){	return pages->count;}fz_obj *pdf_getpageobject(pdf_pagetree *pages, int p){	if (p < 0 || p >= pages->count)		return nil;	return pages->pobj[p];}voidpdf_droppagetree(pdf_pagetree *pages){	int i;	pdf_logpage("drop pagetree %p\n", pages);	for (i = 0; i < pages->count; i++) {		if (pages->pref[i])			fz_dropobj(pages->pref[i]);		if (pages->pobj[i])			fz_dropobj(pages->pobj[i]);	}	fz_free(pages->pref);	fz_free(pages->pobj);	fz_free(pages);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -