diff options
-rw-r--r-- | include/mupdf/pdf/annot.h | 8 | ||||
-rw-r--r-- | include/mupdf/pdf/object.h | 11 | ||||
-rw-r--r-- | include/mupdf/pdf/widget.h | 6 | ||||
-rw-r--r-- | platform/gl/gl-annotate.c | 12 | ||||
-rw-r--r-- | platform/java/mupdf_native.c | 5 | ||||
-rw-r--r-- | platform/x11/jstest_main.c | 2 | ||||
-rw-r--r-- | platform/x11/pdfapp.c | 9 | ||||
-rw-r--r-- | platform/x11/pdfapp.h | 2 | ||||
-rw-r--r-- | platform/x11/win_main.c | 2 | ||||
-rw-r--r-- | platform/x11/x11_main.c | 2 | ||||
-rw-r--r-- | source/pdf/pdf-annot.c | 12 | ||||
-rw-r--r-- | source/pdf/pdf-appearance.c | 11 | ||||
-rw-r--r-- | source/pdf/pdf-form.c | 21 | ||||
-rw-r--r-- | source/pdf/pdf-link.c | 2 | ||||
-rw-r--r-- | source/pdf/pdf-nametree.c | 10 | ||||
-rw-r--r-- | source/pdf/pdf-object.c | 53 | ||||
-rw-r--r-- | source/pdf/pdf-outline.c | 2 | ||||
-rw-r--r-- | source/pdf/pdf-parse.c | 36 | ||||
-rw-r--r-- | source/pdf/pdf-xref.c | 5 | ||||
-rw-r--r-- | source/tools/murun.c | 40 |
20 files changed, 129 insertions, 122 deletions
diff --git a/include/mupdf/pdf/annot.h b/include/mupdf/pdf/annot.h index e9b91da9..d616436c 100644 --- a/include/mupdf/pdf/annot.h +++ b/include/mupdf/pdf/annot.h @@ -220,9 +220,9 @@ void pdf_set_annot_vertex(fz_context *ctx, pdf_annot *annot, int i, fz_point p); void pdf_set_text_annot_position(fz_context *ctx, pdf_annot *annot, fz_point pt); /* - pdf_copy_annot_contents: return a copy of the contents of an annotation. + pdf_get_annot_contents: return the contents of an annotation. */ -char *pdf_copy_annot_contents(fz_context *ctx, pdf_annot *annot); +const char *pdf_get_annot_contents(fz_context *ctx, pdf_annot *annot); /* pdf_set_annot_contents: set the contents of an annotation. @@ -230,9 +230,9 @@ char *pdf_copy_annot_contents(fz_context *ctx, pdf_annot *annot); void pdf_set_annot_contents(fz_context *ctx, pdf_annot *annot, const char *text); /* - pdf_copy_annot_author: return a copy of the author of an annotation. + pdf_get_annot_author: return the author of an annotation. */ -char *pdf_copy_annot_author(fz_context *ctx, pdf_annot *annot); +const char *pdf_get_annot_author(fz_context *ctx, pdf_annot *annot); /* pdf_set_annot_author: set the author of an annotation. diff --git a/include/mupdf/pdf/object.h b/include/mupdf/pdf/object.h index 4bb368ea..71a8d9d8 100644 --- a/include/mupdf/pdf/object.h +++ b/include/mupdf/pdf/object.h @@ -79,6 +79,8 @@ int pdf_to_int(fz_context *ctx, pdf_obj *obj); int64_t pdf_to_int64(fz_context *ctx, pdf_obj *obj); float pdf_to_real(fz_context *ctx, pdf_obj *obj); const char *pdf_to_name(fz_context *ctx, pdf_obj *obj); +const char *pdf_to_text_string(fz_context *ctx, pdf_obj *obj); +const char *pdf_to_string(fz_context *ctx, pdf_obj *obj, size_t *sizep); char *pdf_to_str_buf(fz_context *ctx, pdf_obj *obj); int pdf_to_str_len(fz_context *ctx, pdf_obj *obj); int pdf_to_num(fz_context *ctx, pdf_obj *obj); @@ -135,6 +137,7 @@ int pdf_dict_get_int(fz_context *ctx, pdf_obj *dict, pdf_obj *key); float pdf_dict_get_real(fz_context *ctx, pdf_obj *dict, pdf_obj *key); const char *pdf_dict_get_name(fz_context *ctx, pdf_obj *dict, pdf_obj *key); const char *pdf_dict_get_string(fz_context *ctx, pdf_obj *dict, pdf_obj *key, size_t *sizep); +const char *pdf_dict_get_text_string(fz_context *ctx, pdf_obj *dict, pdf_obj *key); void pdf_array_push_bool(fz_context *ctx, pdf_obj *array, int x); void pdf_array_push_int(fz_context *ctx, pdf_obj *array, int64_t x); @@ -148,6 +151,8 @@ pdf_obj *pdf_array_push_dict(fz_context *ctx, pdf_obj *array, int initial); int pdf_array_get_bool(fz_context *ctx, pdf_obj *array, int index); int pdf_array_get_int(fz_context *ctx, pdf_obj *array, int index); float pdf_array_get_real(fz_context *ctx, pdf_obj *array, int index); +const char *pdf_array_get_string(fz_context *ctx, pdf_obj *array, int index, size_t *sizep); +const char *pdf_array_get_text_string(fz_context *ctx, pdf_obj *array, int index); /* Recurse through the object structure setting the node's parent_num to num. @@ -168,10 +173,10 @@ int pdf_print_encrypted_obj(fz_context *ctx, fz_output *out, pdf_obj *obj, int t void pdf_debug_obj(fz_context *ctx, pdf_obj *obj); -char *pdf_to_utf8(fz_context *ctx, pdf_obj *src); -char *pdf_load_stream_as_utf8(fz_context *ctx, pdf_obj *src); +char *pdf_new_utf8_from_pdf_string(fz_context *ctx, const char *srcptr, size_t srclen); +char *pdf_new_utf8_from_pdf_string_obj(fz_context *ctx, pdf_obj *src); +char *pdf_new_utf8_from_pdf_stream_obj(fz_context *ctx, pdf_obj *src); char *pdf_load_stream_or_string_as_utf8(fz_context *ctx, pdf_obj *src); -pdf_obj *pdf_to_utf8_name(fz_context *ctx, pdf_obj *src); fz_rect *pdf_to_rect(fz_context *ctx, pdf_obj *array, fz_rect *rect); fz_matrix *pdf_to_matrix(fz_context *ctx, pdf_obj *array, fz_matrix *mat); diff --git a/include/mupdf/pdf/widget.h b/include/mupdf/pdf/widget.h index 5f2c38af..04c9f887 100644 --- a/include/mupdf/pdf/widget.h +++ b/include/mupdf/pdf/widget.h @@ -100,7 +100,7 @@ int pdf_text_widget_set_text(fz_context *ctx, pdf_document *doc, pdf_widget *tw, is true, then the export values will be returned and not the list values if there are export values present. */ -int pdf_choice_widget_options(fz_context *ctx, pdf_document *doc, pdf_widget *tw, int exportval, char *opts[]); +int pdf_choice_widget_options(fz_context *ctx, pdf_document *doc, pdf_widget *tw, int exportval, const char *opts[]); /* pdf_choice_widget_is_multiselect: returns whether a list box or @@ -115,13 +115,13 @@ int pdf_choice_widget_is_multiselect(fz_context *ctx, pdf_document *doc, pdf_wid with NULL as the array to find out how big the array need to be. The filled in elements should not be freed by the caller. */ -int pdf_choice_widget_value(fz_context *ctx, pdf_document *doc, pdf_widget *tw, char *opts[]); +int pdf_choice_widget_value(fz_context *ctx, pdf_document *doc, pdf_widget *tw, const char *opts[]); /* pdf_widget_set_value: set the value of a choice widget. The caller should pass the number of options selected and an array of their names */ -void pdf_choice_widget_set_value(fz_context *ctx, pdf_document *doc, pdf_widget *tw, int n, char *opts[]); +void pdf_choice_widget_set_value(fz_context *ctx, pdf_document *doc, pdf_widget *tw, int n, const char *opts[]); #endif diff --git a/platform/gl/gl-annotate.c b/platform/gl/gl-annotate.c index 304f0f10..9d88dabc 100644 --- a/platform/gl/gl-annotate.c +++ b/platform/gl/gl-annotate.c @@ -314,10 +314,9 @@ static void do_annotate_author(void) { if (pdf_annot_has_author(ctx, selected_annot)) { - char *author = pdf_copy_annot_author(ctx, selected_annot); - if (author && strlen(author) > 0) + const char *author = pdf_get_annot_author(ctx, selected_annot); + if (strlen(author) > 0) ui_label("Author: %s", author); - fz_free(ctx, author); } } @@ -344,14 +343,13 @@ static void do_annotate_contents(void) { static pdf_annot *last_annot = NULL; static struct input input; - char *contents; + const char *contents; if (selected_annot != last_annot) { last_annot = selected_annot; - contents = pdf_copy_annot_contents(ctx, selected_annot); + contents = pdf_get_annot_contents(ctx, selected_annot); ui_input_init(&input, contents); - fz_free(ctx, contents); } ui_label("Contents:"); @@ -387,7 +385,7 @@ static void do_widget_value() } else if (type == PDF_WIDGET_TYPE_COMBOBOX || type == PDF_WIDGET_TYPE_LISTBOX) { - char **options; + const char **options; int n, choice; ui_label("Value:"); n = pdf_choice_widget_options(ctx, selected_annot->page->doc, selected_annot, 0, NULL); diff --git a/platform/java/mupdf_native.c b/platform/java/mupdf_native.c index 74ba2d11..8e9e9f3f 100644 --- a/platform/java/mupdf_native.c +++ b/platform/java/mupdf_native.c @@ -8800,7 +8800,7 @@ FUN(PDFAnnotation_getContents)(JNIEnv *env, jobject self) if (!ctx || !annot) return NULL; fz_try(ctx) - contents = pdf_copy_annot_contents(ctx, annot); + contents = pdf_get_annot_contents(ctx, annot); fz_catch(ctx) { jni_rethrow(env, ctx); @@ -8808,7 +8808,6 @@ FUN(PDFAnnotation_getContents)(JNIEnv *env, jobject self) } result = (*env)->NewStringUTF(env, contents); - fz_free(ctx, contents); return result; } @@ -8846,7 +8845,7 @@ FUN(PDFAnnotation_getAuthor)(JNIEnv *env, jobject self) if (!ctx || !annot) return NULL; fz_try(ctx) - author = pdf_copy_annot_author(ctx, annot); + author = pdf_get_annot_author(ctx, annot); fz_catch(ctx) { jni_rethrow(env, ctx); diff --git a/platform/x11/jstest_main.c b/platform/x11/jstest_main.c index 14577bd2..0c729b86 100644 --- a/platform/x11/jstest_main.c +++ b/platform/x11/jstest_main.c @@ -81,7 +81,7 @@ char *wintextinput(pdfapp_t *app, char *inittext, int retry) return inittext; } -int winchoiceinput(pdfapp_t *app, int nopts, char *opts[], int *nvals, char *vals[]) +int winchoiceinput(pdfapp_t *app, int nopts, const char *opts[], int *nvals, const char *vals[]) { return 0; } diff --git a/platform/x11/pdfapp.c b/platform/x11/pdfapp.c index f011b5b0..1c5ae45d 100644 --- a/platform/x11/pdfapp.c +++ b/platform/x11/pdfapp.c @@ -1680,8 +1680,8 @@ void pdfapp_onmouse(pdfapp_t *app, int x, int y, int btn, int modifiers, int sta { int nopts; int nvals; - char **opts = NULL; - char **vals = NULL; + const char **opts = NULL; + const char **vals = NULL; fz_var(opts); fz_var(vals); @@ -1706,12 +1706,7 @@ void pdfapp_onmouse(pdfapp_t *app, int x, int y, int btn, int modifiers, int sta } fz_always(ctx) { - int i; - for (i=0; i < nopts; ++i) - fz_free(ctx, opts[i]); fz_free(ctx, opts); - for (i=0; i < nvals; ++i) - fz_free(ctx, vals[i]); fz_free(ctx, vals); } fz_catch(ctx) diff --git a/platform/x11/pdfapp.h b/platform/x11/pdfapp.h index 09d8f16a..b6c2127c 100644 --- a/platform/x11/pdfapp.h +++ b/platform/x11/pdfapp.h @@ -30,7 +30,7 @@ extern void winrepaint(pdfapp_t*); extern void winrepaintsearch(pdfapp_t*); extern char *winpassword(pdfapp_t*, char *filename); extern char *wintextinput(pdfapp_t*, char *inittext, int retry); -extern int winchoiceinput(pdfapp_t*, int nopts, char *opts[], int *nvals, char *vals[]); +extern int winchoiceinput(pdfapp_t*, int nopts, const char *opts[], int *nvals, const char *vals[]); extern void winopenuri(pdfapp_t*, char *s); extern void wincursor(pdfapp_t*, int curs); extern void windocopy(pdfapp_t*); diff --git a/platform/x11/win_main.c b/platform/x11/win_main.c index 877f8c73..dd406c42 100644 --- a/platform/x11/win_main.c +++ b/platform/x11/win_main.c @@ -450,7 +450,7 @@ char *wintextinput(pdfapp_t *app, char *inittext, int retry) return NULL; } -int winchoiceinput(pdfapp_t *app, int nopts, char *opts[], int *nvals, char *vals[]) +int winchoiceinput(pdfapp_t *app, int nopts, const char *opts[], int *nvals, const char *vals[]) { int code; cd_nopts = nopts; diff --git a/platform/x11/x11_main.c b/platform/x11/x11_main.c index edbb9fa8..7e5942bf 100644 --- a/platform/x11/x11_main.c +++ b/platform/x11/x11_main.c @@ -184,7 +184,7 @@ char *wintextinput(pdfapp_t *app, char *inittext, int retry) return NULL; } -int winchoiceinput(pdfapp_t *app, int nopts, char *opts[], int *nvals, char *vals[]) +int winchoiceinput(pdfapp_t *app, int nopts, const char *opts[], int *nvals, const char *vals[]) { /* FIXME: temporary dummy implementation */ return 0; diff --git a/source/pdf/pdf-annot.c b/source/pdf/pdf-annot.c index ed6856de..ba92b7ef 100644 --- a/source/pdf/pdf-annot.c +++ b/source/pdf/pdf-annot.c @@ -392,10 +392,10 @@ pdf_set_annot_rect(fz_context *ctx, pdf_annot *annot, const fz_rect *rect) pdf_dirty_annot(ctx, annot); } -char * -pdf_copy_annot_contents(fz_context *ctx, pdf_annot *annot) +const char * +pdf_get_annot_contents(fz_context *ctx, pdf_annot *annot) { - return pdf_to_utf8(ctx, pdf_dict_get(ctx, annot->obj, PDF_NAME(Contents))); + return pdf_dict_get_text_string(ctx, annot->obj, PDF_NAME(Contents)); } void @@ -1397,11 +1397,11 @@ pdf_annot_has_author(fz_context *ctx, pdf_annot *annot) return is_allowed_subtype(ctx, annot, PDF_NAME(T), markup_subtypes); } -char * -pdf_copy_annot_author(fz_context *ctx, pdf_annot *annot) +const char * +pdf_get_annot_author(fz_context *ctx, pdf_annot *annot) { check_allowed_subtypes(ctx, annot, PDF_NAME(T), markup_subtypes); - return pdf_to_utf8(ctx, pdf_dict_get(ctx, annot->obj, PDF_NAME(T))); + return pdf_dict_get_text_string(ctx, annot->obj, PDF_NAME(T)); } void diff --git a/source/pdf/pdf-appearance.c b/source/pdf/pdf-appearance.c index c3e94baa..9753be92 100644 --- a/source/pdf/pdf-appearance.c +++ b/source/pdf/pdf-appearance.c @@ -906,11 +906,12 @@ pdf_write_free_text_appearance(fz_context *ctx, pdf_annot *annot, fz_buffer *buf { const char *font; float size, color[3]; - char *text; + const char *text; float w, h, t, b; int q, r; /* /Rotate is an undocumented annotation property supported by Adobe */ + text = pdf_get_annot_contents(ctx, annot); r = pdf_dict_get_int(ctx, annot->obj, PDF_NAME(Rotate)); q = pdf_annot_quadding(ctx, annot); pdf_annot_default_appearance(ctx, annot, &font, &size, color); @@ -933,13 +934,7 @@ pdf_write_free_text_appearance(fz_context *ctx, pdf_annot *annot, fz_buffer *buf fz_append_printf(ctx, buf, "%g %g %g %g re\nS\n", b/2, b/2, w-b, h-b); } - text = pdf_copy_annot_contents(ctx, annot); - fz_try(ctx) - write_variable_text(ctx, annot, buf, res, text, font, size, color, q, w, h, b*2, 1); - fz_always(ctx) - fz_free(ctx, text); - fz_catch(ctx) - fz_rethrow(ctx); + write_variable_text(ctx, annot, buf, res, text, font, size, color, q, w, h, b*2, 1); } static void diff --git a/source/pdf/pdf-form.c b/source/pdf/pdf-form.c index 54cb1472..93b88e2c 100644 --- a/source/pdf/pdf-form.c +++ b/source/pdf/pdf-form.c @@ -1102,7 +1102,7 @@ int pdf_text_widget_set_text(fz_context *ctx, pdf_document *doc, pdf_widget *tw, } /* Get either the listed value or the export value. */ -int pdf_choice_widget_options(fz_context *ctx, pdf_document *doc, pdf_widget *tw, int exportval, char *opts[]) +int pdf_choice_widget_options(fz_context *ctx, pdf_document *doc, pdf_widget *tw, int exportval, const char *opts[]) { pdf_annot *annot = (pdf_annot *)tw; pdf_obj *optarr; @@ -1122,11 +1122,11 @@ int pdf_choice_widget_options(fz_context *ctx, pdf_document *doc, pdf_widget *tw /* If it is a two element array, the second item is the one that we want if we want the listing value. */ if (m == 2) if (exportval) - opts[i] = pdf_to_utf8(ctx, pdf_array_get(ctx, pdf_array_get(ctx, optarr, i), 0)); + opts[i] = pdf_array_get_text_string(ctx, pdf_array_get(ctx, optarr, i), 0); else - opts[i] = pdf_to_utf8(ctx, pdf_array_get(ctx, pdf_array_get(ctx, optarr, i), 1)); + opts[i] = pdf_array_get_text_string(ctx, pdf_array_get(ctx, optarr, i), 1); else - opts[i] = pdf_to_utf8(ctx, pdf_array_get(ctx, optarr, i)); + opts[i] = pdf_array_get_text_string(ctx, optarr, i); } } return n; @@ -1148,7 +1148,7 @@ int pdf_choice_widget_is_multiselect(fz_context *ctx, pdf_document *doc, pdf_wid } } -int pdf_choice_widget_value(fz_context *ctx, pdf_document *doc, pdf_widget *tw, char *opts[]) +int pdf_choice_widget_value(fz_context *ctx, pdf_document *doc, pdf_widget *tw, const char *opts[]) { pdf_annot *annot = (pdf_annot *)tw; pdf_obj *optarr; @@ -1162,32 +1162,27 @@ int pdf_choice_widget_value(fz_context *ctx, pdf_document *doc, pdf_widget *tw, if (pdf_is_string(ctx, optarr)) { if (opts) - opts[0] = pdf_to_utf8(ctx, optarr); - + opts[0] = pdf_to_text_string(ctx, optarr); return 1; } else { n = pdf_array_len(ctx, optarr); - if (opts) { for (i = 0; i < n; i++) { pdf_obj *elem = pdf_array_get(ctx, optarr, i); - if (pdf_is_array(ctx, elem)) elem = pdf_array_get(ctx, elem, 1); - - opts[i] = pdf_to_utf8(ctx, elem); + opts[i] = pdf_to_text_string(ctx, elem); } } - return n; } } -void pdf_choice_widget_set_value(fz_context *ctx, pdf_document *doc, pdf_widget *tw, int n, char *opts[]) +void pdf_choice_widget_set_value(fz_context *ctx, pdf_document *doc, pdf_widget *tw, int n, const char *opts[]) { pdf_annot *annot = (pdf_annot *)tw; pdf_obj *optarr = NULL, *opt; diff --git a/source/pdf/pdf-link.c b/source/pdf/pdf-link.c index 56c11973..e9f1c36f 100644 --- a/source/pdf/pdf-link.c +++ b/source/pdf/pdf-link.c @@ -134,7 +134,7 @@ pdf_parse_file_spec(fz_context *ctx, pdf_document *doc, pdf_obj *file_spec, pdf_ return NULL; } - path = pdf_to_utf8(ctx, filename); + path = fz_strdup(ctx, pdf_to_text_string(ctx, filename)); #ifdef _WIN32 if (!pdf_name_eq(ctx, pdf_dict_get(ctx, file_spec, PDF_NAME(FS)), PDF_NAME(URL))) { diff --git a/source/pdf/pdf-nametree.c b/source/pdf/pdf-nametree.c index 30dd5974..4682024f 100644 --- a/source/pdf/pdf-nametree.c +++ b/source/pdf/pdf-nametree.c @@ -140,9 +140,13 @@ pdf_load_name_tree_imp(fz_context *ctx, pdf_obj *dict, pdf_document *doc, pdf_ob pdf_obj *val = pdf_array_get(ctx, names, i + 1); if (pdf_is_string(ctx, key)) { - key = pdf_to_utf8_name(ctx, key); - pdf_dict_put(ctx, dict, key, val); - pdf_drop_obj(ctx, key); + key = pdf_new_name(ctx, pdf_to_text_string(ctx, key)); + fz_try(ctx) + pdf_dict_put(ctx, dict, key, val); + fz_always(ctx) + pdf_drop_obj(ctx, key); + fz_catch(ctx) + fz_rethrow(ctx); } else if (pdf_is_name(ctx, key)) { diff --git a/source/pdf/pdf-object.c b/source/pdf/pdf-object.c index ec66376a..bc856644 100644 --- a/source/pdf/pdf-object.c +++ b/source/pdf/pdf-object.c @@ -59,6 +59,7 @@ typedef struct pdf_obj_num_s typedef struct pdf_obj_string_s { pdf_obj super; + char *text; /* utf8 encoded text string */ unsigned int len; char buf[1]; } pdf_obj_string; @@ -141,6 +142,7 @@ pdf_new_string(fz_context *ctx, const char *str, size_t len) obj->super.refs = 1; obj->super.kind = PDF_STRING; obj->super.flags = 0; + obj->text = NULL; obj->len = l; memcpy(obj->buf, str, len); obj->buf[len] = '\0'; @@ -336,6 +338,32 @@ int pdf_to_str_len(fz_context *ctx, pdf_obj *obj) return 0; } +const char *pdf_to_string(fz_context *ctx, pdf_obj *obj, size_t *sizep) +{ + RESOLVE(obj); + if (OBJ_IS_STRING(obj)) + { + if (sizep) + *sizep = STRING(obj)->len; + return STRING(obj)->buf; + } + if (sizep) + *sizep = 0; + return ""; +} + +const char *pdf_to_text_string(fz_context *ctx, pdf_obj *obj) +{ + RESOLVE(obj); + if (OBJ_IS_STRING(obj)) + { + if (!STRING(obj)->text) + STRING(obj)->text = pdf_new_utf8_from_pdf_string(ctx, STRING(obj)->buf, STRING(obj)->len); + return STRING(obj)->text; + } + return ""; +} + void pdf_set_int(fz_context *ctx, pdf_obj *obj, int64_t i) { if (OBJ_IS_INT(obj)) @@ -1669,6 +1697,11 @@ pdf_drop_obj(fz_context *ctx, pdf_obj *obj) pdf_drop_array(ctx, obj); else if (obj->kind == PDF_DICT) pdf_drop_dict(ctx, obj); + else if (obj->kind == PDF_STRING) + { + fz_free(ctx, STRING(obj)->text); + fz_free(ctx, obj); + } else fz_free(ctx, obj); } @@ -2254,10 +2287,12 @@ const char *pdf_dict_get_name(fz_context *ctx, pdf_obj *dict, pdf_obj *key) const char *pdf_dict_get_string(fz_context *ctx, pdf_obj *dict, pdf_obj *key, size_t *sizep) { - pdf_obj *val = pdf_dict_get(ctx, dict, key); - if (sizep) - *sizep = pdf_to_str_len(ctx, val); - return pdf_to_str_buf(ctx, val); + return pdf_to_string(ctx, pdf_dict_get(ctx, dict, key), sizep); +} + +const char *pdf_dict_get_text_string(fz_context *ctx, pdf_obj *dict, pdf_obj *key) +{ + return pdf_to_text_string(ctx, pdf_dict_get(ctx, dict, key)); } int pdf_array_get_bool(fz_context *ctx, pdf_obj *array, int index) @@ -2274,3 +2309,13 @@ float pdf_array_get_real(fz_context *ctx, pdf_obj *array, int index) { return pdf_to_real(ctx, pdf_array_get(ctx, array, index)); } + +const char *pdf_array_get_string(fz_context *ctx, pdf_obj *array, int index, size_t *sizep) +{ + return pdf_to_string(ctx, pdf_array_get(ctx, array, index), sizep); +} + +const char *pdf_array_get_text_string(fz_context *ctx, pdf_obj *array, int index) +{ + return pdf_to_text_string(ctx, pdf_array_get(ctx, array, index)); +} diff --git a/source/pdf/pdf-outline.c b/source/pdf/pdf-outline.c index ea8ecbeb..b091cf4a 100644 --- a/source/pdf/pdf-outline.c +++ b/source/pdf/pdf-outline.c @@ -24,7 +24,7 @@ pdf_load_outline_imp(fz_context *ctx, pdf_document *doc, pdf_obj *dict) obj = pdf_dict_get(ctx, dict, PDF_NAME(Title)); if (obj) - node->title = pdf_to_utf8(ctx, obj); + node->title = fz_strdup(ctx, pdf_to_text_string(ctx, obj)); if ((obj = pdf_dict_get(ctx, dict, PDF_NAME(Dest))) != NULL) node->uri = pdf_parse_link_dest(ctx, doc, obj); diff --git a/source/pdf/pdf-parse.c b/source/pdf/pdf-parse.c index f4075c5a..fb1cc595 100644 --- a/source/pdf/pdf-parse.c +++ b/source/pdf/pdf-parse.c @@ -80,9 +80,11 @@ skip_language_code_utf8(const unsigned char *s, size_t n, size_t i) return 0; } +/* Convert Unicode/PdfDocEncoding string into utf-8 */ char * -pdf_to_utf8_imp(fz_context *ctx, const unsigned char *srcptr, size_t srclen) +pdf_new_utf8_from_pdf_string(fz_context *ctx, const char *ssrcptr, size_t srclen) { + const unsigned char *srcptr = (const unsigned char*)ssrcptr; char *dstptr, *dst; size_t dstlen = 0; int ucs; @@ -168,30 +170,29 @@ pdf_to_utf8_imp(fz_context *ctx, const unsigned char *srcptr, size_t srclen) return dst; } -/* Convert Unicode/PdfDocEncoding string into utf-8 */ +/* Convert text string object to UTF-8 */ char * -pdf_to_utf8(fz_context *ctx, pdf_obj *src) +pdf_new_utf8_from_pdf_string_obj(fz_context *ctx, pdf_obj *src) { - unsigned char *srcptr; + const char *srcptr; size_t srclen; - srcptr = (unsigned char *) pdf_to_str_buf(ctx, src); - srclen = pdf_to_str_len(ctx, src); - return pdf_to_utf8_imp(ctx, srcptr, srclen); + srcptr = pdf_to_string(ctx, src, &srclen); + return pdf_new_utf8_from_pdf_string(ctx, srcptr, srclen); } /* Load text stream and convert to UTF-8 */ char * -pdf_load_stream_as_utf8(fz_context *ctx, pdf_obj *src) +pdf_new_utf8_from_pdf_stream_obj(fz_context *ctx, pdf_obj *src) { fz_buffer *stmbuf; - unsigned char *srcptr; + char *srcptr; size_t srclen; char *dst = NULL; stmbuf = pdf_load_stream(ctx, src); - srclen = fz_buffer_storage(ctx, stmbuf, &srcptr); + srclen = fz_buffer_storage(ctx, stmbuf, (unsigned char **)&srcptr); fz_try(ctx) - dst = pdf_to_utf8_imp(ctx, srcptr, srclen); + dst = pdf_new_utf8_from_pdf_string(ctx, srcptr, srclen); fz_always(ctx) fz_drop_buffer(ctx, stmbuf); fz_catch(ctx) @@ -204,17 +205,8 @@ char * pdf_load_stream_or_string_as_utf8(fz_context *ctx, pdf_obj *src) { if (pdf_is_stream(ctx, src)) - return pdf_load_stream_as_utf8(ctx, src); - return pdf_to_utf8(ctx, src); -} - -pdf_obj * -pdf_to_utf8_name(fz_context *ctx, pdf_obj *src) -{ - char *buf = pdf_to_utf8(ctx, src); - pdf_obj *dst = pdf_new_name(ctx, buf); - fz_free(ctx, buf); - return dst; + return pdf_new_utf8_from_pdf_stream_obj(ctx, src); + return pdf_new_utf8_from_pdf_string_obj(ctx, src); } static pdf_obj * diff --git a/source/pdf/pdf-xref.c b/source/pdf/pdf-xref.c index 9d32ea5e..d60eb089 100644 --- a/source/pdf/pdf-xref.c +++ b/source/pdf/pdf-xref.c @@ -2220,7 +2220,7 @@ pdf_lookup_metadata(fz_context *ctx, pdf_document *doc, const char *key, char *b if (strstr(key, "info:") == key) { pdf_obj *info; - char *s; + const char *s; int n; info = pdf_dict_get(ctx, pdf_trailer(ctx, doc), PDF_NAME(Info)); @@ -2231,9 +2231,8 @@ pdf_lookup_metadata(fz_context *ctx, pdf_document *doc, const char *key, char *b if (!info) return -1; - s = pdf_to_utf8(ctx, info); + s = pdf_to_text_string(ctx, info); n = (int)fz_strlcpy(buf, s, size); - fz_free(ctx, s); return n; } diff --git a/source/tools/murun.c b/source/tools/murun.c index 3ed840fb..c74e4bbc 100644 --- a/source/tools/murun.c +++ b/source/tools/murun.c @@ -3837,19 +3837,14 @@ static void ffi_PDFObject_asString(js_State *J) { fz_context *ctx = js_getcontext(J); pdf_obj *obj = js_touserdata(J, 0, "pdf_obj"); - char *string = NULL; + const char *string = NULL; fz_try(ctx) - string = pdf_to_utf8(ctx, obj); + string = pdf_to_text_string(ctx, obj); fz_catch(ctx) rethrow(J); - if (js_try(J)) { - fz_free(ctx, string); - js_throw(J); - } js_pushstring(J, string); - fz_free(ctx, string); js_endtry(J); } @@ -3858,12 +3853,11 @@ static void ffi_PDFObject_asByteString(js_State *J) fz_context *ctx = js_getcontext(J); pdf_obj *obj = js_touserdata(J, 0, "pdf_obj"); const char *buf; - int i, len = 0; + size_t i, len = 0; - fz_try(ctx) { - buf = pdf_to_str_buf(ctx, obj); - len = pdf_to_str_len(ctx, obj); - } fz_catch(ctx) + fz_try(ctx) + buf = pdf_to_string(ctx, obj, &len); + fz_catch(ctx) rethrow(J); js_newarray(J); @@ -4076,21 +4070,14 @@ static void ffi_PDFAnnotation_getContents(js_State *J) { fz_context *ctx = js_getcontext(J); pdf_annot *annot = js_touserdata(J, 0, "pdf_annot"); - char *contents = NULL; + const char *contents = NULL; fz_try(ctx) - contents = pdf_copy_annot_contents(ctx, annot); + contents = pdf_get_annot_contents(ctx, annot); fz_catch(ctx) rethrow(J); - if (js_try(J)) { - fz_free(ctx, contents); - js_throw(J); - } js_pushstring(J, contents); - js_endtry(J); - - fz_free(ctx, contents); } static void ffi_PDFAnnotation_setContents(js_State *J) @@ -4375,21 +4362,14 @@ static void ffi_PDFAnnotation_getAuthor(js_State *J) { fz_context *ctx = js_getcontext(J); pdf_annot *annot = js_touserdata(J, 0, "pdf_annot"); - char *author = NULL; + const char *author = NULL; fz_try(ctx) - author = pdf_copy_annot_author(ctx, annot); + author = pdf_get_annot_author(ctx, annot); fz_catch(ctx) rethrow(J); - if (js_try(J)) { - fz_free(ctx, author); - js_throw(J); - } js_pushstring(J, author); - js_endtry(J); - - fz_free(ctx, author); } static void ffi_PDFAnnotation_setAuthor(js_State *J) |