static fz_error * writeobject(fz_stream *out, pdf_xref *xref, pdf_crypt *encrypt, int oid, int gen) { pdf_xrefentry *x = xref->table + oid; fz_error *error; error = pdf_cacheobject(xref, oid, gen); if (error) return error; if (encrypt) pdf_cryptobj(encrypt, x->obj, oid, gen); fz_print(out, "%d %d obj\n", oid, gen); fz_printobj(out, x->obj, TIGHT); fz_print(out, "\n"); if (encrypt) pdf_cryptobj(encrypt, x->obj, oid, gen); if (pdf_isstream(xref, oid, gen)) { error = writestream(out, xref, encrypt, oid, gen); if (error) return error; } fz_print(out, "endobj\n\n"); return nil; }
/* * Open a stream for reading the raw (compressed but decrypted) data. * Using xref->file while this is open is a bad idea. */ fz_error * pdf_openrawstream(fz_stream **stmp, pdf_xref *xref, int oid, int gen) { pdf_xrefentry *x; fz_error *error; fz_filter *filter; if (oid < 0 || oid >= xref->len) return fz_throw("object id out of range (%d)", oid); x = xref->table + oid; error = pdf_cacheobject(xref, oid, gen); if (error) return fz_rethrow(error, "cannot load stream object (%d)", oid); if (x->stmbuf) { error = fz_openrbuffer(stmp, x->stmbuf); if (error) return fz_rethrow(error, "cannot open stream from buffer"); return fz_okay; } if (x->stmofs) { error = buildrawfilter(&filter, xref, x->obj, oid, gen); if (error) return fz_rethrow(error, "cannot create raw filter"); error = fz_seek(xref->file, x->stmofs, 0); if (error) { fz_dropfilter(filter); return fz_rethrow(error, "cannot seek to stream"); } error = fz_openrfilter(stmp, filter, xref->file); fz_dropfilter(filter); if (error) return fz_rethrow(error, "cannot open filter stream"); return fz_okay; } return fz_throw("object is not a stream"); }
fz_error pdf_loadobject(fz_obj **objp, pdf_xref *xref, int num, int gen) { fz_error error; error = pdf_cacheobject(xref, num, gen); if (error) return fz_rethrow(error, "cannot load object (%d %d R) into cache", num, gen); assert(xref->table[num].obj); *objp = fz_keepobj(xref->table[num].obj); return fz_okay; }
/* * Check if an object is a stream or not. */ int pdf_isstream(pdf_xref *xref, int oid, int gen) { fz_error *error; if (oid < 0 || oid >= xref->len) return 0; error = pdf_cacheobject(xref, oid, gen); if (error) { fz_warn("%s", error->msg); fz_droperror(error); return 0; } return xref->table[oid].stmbuf || xref->table[oid].stmofs; }