pdf_obj *obj;
int num;
+ /* If we have attempted a repair, then everything will have been
+ * loaded already. */
+ if (doc->repair_attempted)
+ return;
+
+ fz_var(num);
+
/* xref_len may change due to repair, so check it every iteration */
for (num = 0; num < pdf_xref_len(ctx, doc); num++)
{
- if (pdf_get_xref_entry_no_null(ctx, doc, num)->type == 'o')
+ fz_try(ctx)
+ {
+ for (; num < pdf_xref_len(ctx, doc); num++)
+ {
+ if (pdf_get_xref_entry_no_null(ctx, doc, num)->type == 'o')
+ {
+ obj = pdf_load_object(ctx, doc, num);
+ pdf_drop_obj(ctx, obj);
+ }
+ }
+ }
+ fz_catch(ctx)
{
- obj = pdf_load_object(ctx, doc, num);
- pdf_drop_obj(ctx, obj);
+ /* Ignore the error, so we can carry on trying to load. */
+ fz_warn(ctx, fz_caught_message(ctx));
}
}
}
if (try_repair)
{
+perform_repair:
fz_try(ctx)
{
pdf_repair_xref(ctx, doc);
if (x == NULL)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot load object stream containing object (%d 0 R)", num);
if (!x->obj)
- fz_throw(ctx, FZ_ERROR_GENERIC, "object (%d 0 R) was not found in its object stream", num);
+ {
+ x->type = 'f';
+ orig_x->type = 'f';
+ if (doc->repair_attempted)
+ fz_throw(ctx, FZ_ERROR_GENERIC, "object (%d 0 R) was not found in its object stream", num);
+ goto perform_repair;
+ }
}
}
else if (doc->hint_obj_offsets && read_hinted_object(ctx, doc, num))