diff options
-rw-r--r-- | pdf/pdf_interpret.c | 22 | ||||
-rw-r--r-- | pdf/pdf_lex.c | 6 | ||||
-rw-r--r-- | pdf/pdf_xref.c | 16 |
3 files changed, 32 insertions, 12 deletions
diff --git a/pdf/pdf_interpret.c b/pdf/pdf_interpret.c index 14574f14..2172eb89 100644 --- a/pdf/pdf_interpret.c +++ b/pdf/pdf_interpret.c @@ -500,7 +500,7 @@ pdf_show_path(pdf_csi *csi, int doclose, int dofill, int dostroke, int even_odd) if (gstate->stroke.pattern) { fz_clip_stroke_path(csi->dev, path, &bbox, &gstate->stroke_state, gstate->ctm); - pdf_show_pattern(csi, gstate->stroke.pattern, bbox, PDF_FILL); + pdf_show_pattern(csi, gstate->stroke.pattern, bbox, PDF_STROKE); fz_pop_clip(csi->dev); } break; @@ -623,7 +623,7 @@ pdf_flush_text(pdf_csi *csi) if (gstate->stroke.pattern) { fz_clip_stroke_text(csi->dev, text, &gstate->stroke_state, gstate->ctm); - pdf_show_pattern(csi, gstate->stroke.pattern, bbox, PDF_FILL); + pdf_show_pattern(csi, gstate->stroke.pattern, bbox, PDF_STROKE); fz_pop_clip(csi->dev); } break; @@ -1491,7 +1491,7 @@ pdf_run_extgstate(pdf_csi *csi, fz_obj *rdb, fz_obj *extgstate) else if (!strcmp(s, "TR")) { - if (fz_is_name(val) && strcmp(fz_to_name(val), "Identity")) + if (!fz_is_name(val) || strcmp(fz_to_name(val), "Identity")) fz_warn(ctx, "ignoring transfer function"); } } @@ -2542,13 +2542,23 @@ pdf_run_buffer(pdf_csi *csi, fz_obj *rdb, fz_buffer *contents) fz_var(buf); fz_var(file); + if (contents == NULL) + return; + fz_try(ctx) { buf = fz_malloc(ctx, len); /* we must be re-entrant for type3 fonts */ file = fz_open_buffer(ctx, contents); save_in_text = csi->in_text; csi->in_text = 0; - pdf_run_stream(csi, rdb, file, buf, len); + fz_try(ctx) + { + pdf_run_stream(csi, rdb, file, buf, len); + } + fz_catch(ctx) + { + fz_warn(ctx, "Content stream parsing error - rendering truncated"); + } csi->in_text = save_in_text; } fz_catch(ctx) @@ -2609,7 +2619,9 @@ pdf_run_page_with_usage(pdf_xref *xref, pdf_page *page, fz_device *dev, fz_matri continue; if (flags & (1 << 1)) /* Hidden */ continue; - if (flags & (1 << 5)) /* NoView */ + if (!strcmp(event, "Print") && !(flags & (1 << 2))) /* Print */ + continue; + if (!strcmp(event, "View") && (flags & (1 << 5))) /* NoView */ continue; csi = pdf_new_csi(xref, dev, ctm, event, cookie); diff --git a/pdf/pdf_lex.c b/pdf/pdf_lex.c index edb27b7b..24828412 100644 --- a/pdf/pdf_lex.c +++ b/pdf/pdf_lex.c @@ -403,7 +403,8 @@ pdf_lex(fz_stream *f, char *buf, int n, int *sl) *sl = lex_string(f, buf, n); return PDF_TOK_STRING; case ')': - fz_throw(f->ctx, "lexical error (unexpected ')')"); + fz_warn(f->ctx, "lexical error (unexpected ')')"); + continue; case '<': c = fz_read_byte(f); if (c == '<') @@ -422,7 +423,8 @@ pdf_lex(fz_stream *f, char *buf, int n, int *sl) { return PDF_TOK_CLOSE_DICT; } - fz_throw(f->ctx, "lexical error (unexpected '>')"); + fz_warn(f->ctx, "lexical error (unexpected '>')"); + continue; case '[': return PDF_TOK_OPEN_ARRAY; case ']': diff --git a/pdf/pdf_xref.c b/pdf/pdf_xref.c index 55d7ce96..354620bb 100644 --- a/pdf/pdf_xref.c +++ b/pdf/pdf_xref.c @@ -769,8 +769,7 @@ pdf_open_xref_with_stream(fz_stream *file, char *password) } fz_catch(ctx) { - pdf_free_xref(xref); - fz_throw(ctx, "Broken Optional Content"); + fz_warn(ctx, "Ignoring Broken Optional Content"); } return xref; @@ -968,7 +967,11 @@ pdf_cache_object(pdf_xref *xref, int num, int gen) } if (rnum != num) + { + fz_drop_obj(x->obj); + x->obj = NULL; fz_throw(ctx, "found object (%d %d R) instead of (%d %d R)", rnum, rgen, num, gen); + } if (xref->crypt) pdf_crypt_obj(ctx, xref->crypt, x->obj, num, gen); @@ -1017,7 +1020,9 @@ pdf_load_object(pdf_xref *xref, int num, int gen) fz_obj * pdf_resolve_indirect(fz_obj *ref) { - if (fz_is_indirect(ref)) + int sanity = 10; + + while (fz_is_indirect(ref) && sanity--) { pdf_xref *xref = fz_get_indirect_xref(ref); if (xref) @@ -1034,8 +1039,9 @@ pdf_resolve_indirect(fz_obj *ref) fz_warn(ctx, "cannot load object (%d %d R) into cache", num, gen); return ref; } - if (xref->table[num].obj) - return xref->table[num].obj; + if (!xref->table[num].obj) + return ref; + ref = xref->table[num].obj; } } return ref; |