static void gatherresourceinfo(int page, pdf_obj *rsrc) { pdf_obj *pageobj; pdf_obj *pageref; pdf_obj *font; pdf_obj *xobj; pdf_obj *shade; pdf_obj *pattern; pdf_obj *subrsrc; int i; pageobj = xref->page_objs[page-1]; pageref = xref->page_refs[page-1]; if (!pageobj) fz_throw(ctx, "cannot retrieve info from page %d", page); font = pdf_dict_gets(rsrc, "Font"); if (font) { int n; gatherfonts(page, pageref, pageobj, font); n = pdf_dict_len(font); for (i = 0; i < n; i++) { pdf_obj *obj = pdf_dict_get_val(font, i); subrsrc = pdf_dict_gets(obj, "Resources"); if (subrsrc && pdf_objcmp(rsrc, subrsrc)) gatherresourceinfo(page, subrsrc); } } xobj = pdf_dict_gets(rsrc, "XObject"); if (xobj) { int n; gatherimages(page, pageref, pageobj, xobj); gatherforms(page, pageref, pageobj, xobj); gatherpsobjs(page, pageref, pageobj, xobj); n = pdf_dict_len(xobj); for (i = 0; i < n; i++) { pdf_obj *obj = pdf_dict_get_val(xobj, i); subrsrc = pdf_dict_gets(obj, "Resources"); if (subrsrc && pdf_objcmp(rsrc, subrsrc)) gatherresourceinfo(page, subrsrc); } } shade = pdf_dict_gets(rsrc, "Shading"); if (shade) gathershadings(page, pageref, pageobj, shade); pattern = pdf_dict_gets(rsrc, "Pattern"); if (pattern) { int n; gatherpatterns(page, pageref, pageobj, pattern); n = pdf_dict_len(pattern); for (i = 0; i < n; i++) { pdf_obj *obj = pdf_dict_get_val(pattern, i); subrsrc = pdf_dict_gets(obj, "Resources"); if (subrsrc && pdf_objcmp(rsrc, subrsrc)) gatherresourceinfo(page, subrsrc); } } }
static void gatherresourceinfo(int page, pdf_obj *rsrc, int show) { pdf_obj *pageobj; pdf_obj *pageref; pdf_obj *font; pdf_obj *xobj; pdf_obj *shade; pdf_obj *pattern; pdf_obj *subrsrc; int i; pageref = pdf_lookup_page_obj(doc, page-1); pageobj = pdf_resolve_indirect(pageref); if (!pageobj) fz_throw(ctx, FZ_ERROR_GENERIC, "cannot retrieve info from page %d", page); font = pdf_dict_gets(rsrc, "Font"); if (show & FONTS && font) { int n; gatherfonts(page, pageref, pageobj, font); n = pdf_dict_len(font); for (i = 0; i < n; i++) { pdf_obj *obj = pdf_dict_get_val(font, i); subrsrc = pdf_dict_gets(obj, "Resources"); if (subrsrc && pdf_objcmp(rsrc, subrsrc)) gatherresourceinfo(page, subrsrc, show); } } xobj = pdf_dict_gets(rsrc, "XObject"); if (show & XOBJS && xobj) { int n; gatherimages(page, pageref, pageobj, xobj); gatherforms(page, pageref, pageobj, xobj); gatherpsobjs(page, pageref, pageobj, xobj); n = pdf_dict_len(xobj); for (i = 0; i < n; i++) { pdf_obj *obj = pdf_dict_get_val(xobj, i); subrsrc = pdf_dict_gets(obj, "Resources"); if (subrsrc && pdf_objcmp(rsrc, subrsrc)) gatherresourceinfo(page, subrsrc, show); } } shade = pdf_dict_gets(rsrc, "Shading"); if (show & SHADINGS && shade) gathershadings(page, pageref, pageobj, shade); pattern = pdf_dict_gets(rsrc, "Pattern"); if (show & PATTERNS && pattern) { int n; gatherpatterns(page, pageref, pageobj, pattern); n = pdf_dict_len(pattern); for (i = 0; i < n; i++) { pdf_obj *obj = pdf_dict_get_val(pattern, i); subrsrc = pdf_dict_gets(obj, "Resources"); if (subrsrc && pdf_objcmp(rsrc, subrsrc)) gatherresourceinfo(page, subrsrc, show); } } }
static void gatherinfo(int show, int page) { fz_error error; fz_obj *pageobj; fz_obj *rsrc; fz_obj *font; fz_obj *xobj; fz_obj *shade; fz_obj *pattern; pageobj = pdf_getpageobject(xref, page); if (!pageobj) die(fz_throw("cannot retrieve info from page %d", page)); if (show & DIMENSIONS) { error = gatherdimensions(page, pageobj); if (error) die(fz_rethrow(error, "gathering dimensions at page %d (%d %d R)", page, fz_tonum(pageobj), fz_togen(pageobj))); } rsrc = fz_dictgets(pageobj, "Resources"); if (show & FONTS) { font = fz_dictgets(rsrc, "Font"); if (font) { error = gatherfonts(page, pageobj, font); if (error) die(fz_rethrow(error, "gathering fonts at page %d (%d %d R)", page, fz_tonum(pageobj), fz_togen(pageobj))); } } if (show & IMAGES || show & XOBJS) { xobj = fz_dictgets(rsrc, "XObject"); if (xobj) { error = gatherimages(page, pageobj, xobj); if (error) die(fz_rethrow(error, "gathering images at page %d (%d %d R)", page, fz_tonum(pageobj), fz_togen(pageobj))); error = gatherforms(page, pageobj, xobj); if (error) die(fz_rethrow(error, "gathering forms at page %d (%d %d R)", page, fz_tonum(pageobj), fz_togen(pageobj))); error = gatherpsobjs(page, pageobj, xobj); if (error) die(fz_rethrow(error, "gathering postscript objects at page %d (%d %d R)", page, fz_tonum(pageobj), fz_togen(pageobj))); } } if (show & SHADINGS) { shade = fz_dictgets(rsrc, "Shading"); if (shade) { error = gathershadings(page, pageobj, shade); if (error) die(fz_rethrow(error, "gathering shadings at page %d (%d %d R)", page, fz_tonum(pageobj), fz_togen(pageobj))); } } if (show & PATTERNS) { pattern = fz_dictgets(rsrc, "Pattern"); if (pattern) { error = gatherpatterns(page, pageobj, pattern); if (error) die(fz_rethrow(error, "gathering shadings at page %d (%d %d R)", page, fz_tonum(pageobj), fz_togen(pageobj))); } } }