summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pdf/pdf_interpret.c22
-rw-r--r--pdf/pdf_lex.c6
-rw-r--r--pdf/pdf_xref.c16
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;