diff options
4 files changed, 157 insertions, 84 deletions
diff --git a/platform/android/example/mupdf/src/main/java/com/artifex/mupdf/android/DocActivityView.java b/platform/android/example/mupdf/src/main/java/com/artifex/mupdf/android/DocActivityView.java index cbad6fa5..03739349 100644 --- a/platform/android/example/mupdf/src/main/java/com/artifex/mupdf/android/DocActivityView.java +++ b/platform/android/example/mupdf/src/main/java/com/artifex/mupdf/android/DocActivityView.java @@ -770,72 +770,33 @@ public class DocActivityView extends FrameLayout implements TabHost.OnTabChangeL private String getEmbeddedProfileName() { - PDFDocument doc = mDoc.toPDFDocument(); - if (doc == null) - return null; - PDFObject obj = doc.getTrailer(); - if (obj == null) - return null; - obj = obj.get("Root"); - if (obj == null) - return null; - PDFObject outputIntents = obj.get("OutputIntents"); + PDFObject outputIntents = mDoc.toPDFDocument().getTrailer().get("Root").get("OutputIntents"); if (outputIntents == null) return null; int length = outputIntents.size(); int i; - for (i = 0 ; i < length; i++) - { + for (i = 0 ; i < length; i++) { PDFObject intent = outputIntents.get(i); - if (intent == null || !intent.isDictionary()) - continue; - - /* FIXME: Getting a name as a ByteString is horrible */ - obj = intent.get("S"); - if (obj == null) - continue; - byte name[] = obj.toByteString(); - if (name == null || name.length != 9) - continue; - if (name[0] != 'G' || name[1] != 'T' || name[2] != 'S' || name[3] != '_' || - name[4] != 'P' || name[5] != 'D' || name[6] != 'F' || name[7] != 'X' || name[8] != 0) + String name = intent.get("S").asName(); + if (!name.equals("GTS_PDFX")) continue; /* We can't use the embedded profile if it's not CMYK based. */ - obj = intent.get("DestOutputProfile"); - if (obj == null) - continue; - obj = obj.get("N"); - if (obj == null) - continue; - if (obj.toInteger() != 4) + if (intent.get("DestOutputProfile").get("N").asInteger() != 4) continue; - String id; - obj = intent.get("Info"); - if (obj != null) - { - id = obj.toString(); - if (id != null) - return id; - } - obj = intent.get("OutputConditionIdentifier"); - if (obj != null) - { - id = obj.toString(); - if (id != null) - return id; - } - obj = intent.get("OutputCondition"); - if (obj != null) - { - id = obj.toString(); - if (id != null) - return id; - } + PDFObject id = intent.get("Info"); + if (id.isString()) + return id.asString(); + id = intent.get("OutputConditionIdentifier"); + if (id.isString()) + return id.asString(); + id = intent.get("OutputCondition"); + if (id.isString()) + return id.asString(); } return null; } diff --git a/platform/java/mupdf_native.c b/platform/java/mupdf_native.c index 4b9565c5..79a9e53f 100644 --- a/platform/java/mupdf_native.c +++ b/platform/java/mupdf_native.c @@ -117,6 +117,7 @@ static jfieldID fid_Path_pointer; static jfieldID fid_PDFDocument_pointer; static jfieldID fid_PDFGraftMap_pointer; static jfieldID fid_PDFObject_pointer; +static jfieldID fid_PDFObject_Null; static jfieldID fid_Pixmap_pointer; static jfieldID fid_Rect_x0; static jfieldID fid_Rect_x1; @@ -309,6 +310,22 @@ static jfieldID get_field(int *failed, JNIEnv *env, const char *field, const cha return fid; } +static jfieldID get_static_field(int *failed, JNIEnv *env, const char *field, const char *sig) +{ + jfieldID fid; + + if (*failed || !current_class) return NULL; + + fid = (*env)->GetStaticFieldID(env, current_class, field, sig); + if (fid == 0) + { + LOGI("Failed to get static field for %s %s %s", current_class_name, field, sig); + *failed = 1; + } + + return fid; +} + static jmethodID get_method(int *failed, JNIEnv *env, const char *method, const char *sig) { jmethodID mid; @@ -449,6 +466,7 @@ static int find_fids(JNIEnv *env) cls_PDFObject = get_class(&err, env, PKG"PDFObject"); fid_PDFObject_pointer = get_field(&err, env, "pointer", "J"); + fid_PDFObject_Null = get_static_field(&err, env, "Null", "L"PKG"PDFObject;"); mid_PDFObject_init = get_method(&err, env, "<init>", "(J)V"); cls_Pixmap = get_class(&err, env, PKG"Pixmap"); @@ -997,8 +1015,10 @@ static inline jobject to_PDFDocument_safe(fz_context *ctx, JNIEnv *env, pdf_docu static inline jobject to_PDFObject_safe(fz_context *ctx, JNIEnv *env, jobject pdf, pdf_obj *obj) { - if (!ctx || !obj || !pdf) return NULL; + if (!ctx || !pdf) return NULL; + if (obj == NULL) + return (*env)->GetStaticObjectField(env, cls_PDFObject, fid_PDFObject_Null); pdf_keep_obj(ctx, obj); return (*env)->NewObject(env, cls_PDFObject, mid_PDFObject_init, jlong_cast(obj), pdf); } @@ -6254,6 +6274,17 @@ FUN(PDFObject_finalize)(JNIEnv *env, jobject self) pdf_drop_obj(ctx, obj); } +JNIEXPORT jlong JNICALL +FUN(PDFObject_newNull)(JNIEnv *env, jclass cls) +{ + fz_context *ctx = get_context(env); + + if (!ctx) return 0; + + /* Not nice to pass doc as NULL, but it is unused */ + return jlong_cast(pdf_new_null(ctx, NULL)); +} + JNIEXPORT jint JNICALL FUN(PDFObject_toIndirect)(JNIEnv *env, jobject self) { @@ -6705,7 +6736,6 @@ FUN(PDFObject_resolve)(JNIEnv *env, jobject self) pdf_obj *ind = NULL; if (!ctx || !obj) return NULL; - if (!obj) { jni_throw_arg(env, "object must not be null"); return NULL; } fz_try(ctx) ind = pdf_resolve_indirect(ctx, obj); @@ -6748,21 +6778,21 @@ FUN(PDFObject_getDictionary)(JNIEnv *env, jobject self, jstring jname) pdf_obj *val = NULL; if (!ctx || !dict) return NULL; - if (jname) - { + + if (!jname) name = (*env)->GetStringUTFChars(env, jname, NULL); - if (!name) return NULL; - } - fz_try(ctx) - val = pdf_dict_gets(ctx, dict, name); - fz_always(ctx) - if (name) - (*env)->ReleaseStringUTFChars(env, jname, name); - fz_catch(ctx) + if (name) { - jni_rethrow(env, ctx); - return NULL; + fz_try(ctx) + val = pdf_dict_gets(ctx, dict, name); + fz_always(ctx) + (*env)->ReleaseStringUTFChars(env, jname, name); + fz_catch(ctx) + { + jni_rethrow(env, ctx); + return NULL; + } } return to_PDFObject_safe(ctx, env, self, val); @@ -7232,7 +7262,7 @@ FUN(PDFObject_deleteDictionaryPDFObject)(JNIEnv *env, jobject self, jobject jnam } JNIEXPORT jboolean JNICALL -FUN(PDFObject_toBoolean)(JNIEnv *env, jobject self) +FUN(PDFObject_asBoolean)(JNIEnv *env, jobject self) { fz_context *ctx = get_context(env); pdf_obj *obj = from_PDFObject(env, self); @@ -7252,7 +7282,7 @@ FUN(PDFObject_toBoolean)(JNIEnv *env, jobject self) } JNIEXPORT jint JNICALL -FUN(PDFObject_toInteger)(JNIEnv *env, jobject self) +FUN(PDFObject_asInteger)(JNIEnv *env, jobject self) { fz_context *ctx = get_context(env); pdf_obj *obj = from_PDFObject(env, self); @@ -7272,7 +7302,7 @@ FUN(PDFObject_toInteger)(JNIEnv *env, jobject self) } JNIEXPORT jfloat JNICALL -FUN(PDFObject_toFloat)(JNIEnv *env, jobject self) +FUN(PDFObject_asFloat)(JNIEnv *env, jobject self) { fz_context *ctx = get_context(env); pdf_obj *obj = from_PDFObject(env, self); @@ -7291,34 +7321,108 @@ FUN(PDFObject_toFloat)(JNIEnv *env, jobject self) return f; } +JNIEXPORT jstring JNICALL +FUN(PDFObject_asString)(JNIEnv *env, jobject self) +{ + fz_context *ctx = get_context(env); + pdf_obj *obj = from_PDFObject(env, self); + const char *str = NULL; + + if (!ctx || !obj) return NULL; + + fz_try(ctx) + str = pdf_to_str_buf(ctx, obj); + fz_catch(ctx) + { + jni_rethrow(env, ctx); + return NULL; + } + + return (*env)->NewStringUTF(env, str); +} + JNIEXPORT jobject JNICALL -FUN(PDFObject_toByteString)(JNIEnv *env, jobject self) +FUN(PDFObject_asByteString)(JNIEnv *env, jobject self) { fz_context *ctx = get_context(env); pdf_obj *obj = from_PDFObject(env, self); const char *str = NULL; jobject jbs = NULL; jbyte *bs = NULL; + int len; if (!ctx || !obj) return NULL; fz_try(ctx) - if (pdf_is_name(ctx, obj)) - str = pdf_to_name(ctx, obj); - else - str = pdf_to_str_buf(ctx, obj); + { + str = pdf_to_str_buf(ctx, obj); + len = pdf_to_str_len(ctx, obj); + } fz_catch(ctx) { jni_rethrow(env, ctx); return NULL; } - jbs = (*env)->NewByteArray(env, strlen(str) + 1); + jbs = (*env)->NewByteArray(env, len); if (!jbs) return NULL; bs = (*env)->GetByteArrayElements(env, jbs, NULL); if (!bs) return NULL; - memcpy(bs, str, strlen(str) + 1); + memcpy(bs, str, len); + + (*env)->ReleaseByteArrayElements(env, jbs, bs, 0); + + return jbs; +} + +JNIEXPORT jstring JNICALL +FUN(PDFObject_asName)(JNIEnv *env, jobject self) +{ + fz_context *ctx = get_context(env); + pdf_obj *obj = from_PDFObject(env, self); + const char *str = NULL; + + if (!ctx || !obj) return NULL; + + fz_try(ctx) + str = pdf_to_name(ctx, obj); + fz_catch(ctx) + { + jni_rethrow(env, ctx); + return NULL; + } + + return (*env)->NewStringUTF(env, str); +} + +JNIEXPORT jobject JNICALL +FUN(PDFObject_asByteName)(JNIEnv *env, jobject self) +{ + fz_context *ctx = get_context(env); + pdf_obj *obj = from_PDFObject(env, self); + const char *str = NULL; + jobject jbs = NULL; + jbyte *bs = NULL; + int len; + + if (!ctx || !obj) return NULL; + + fz_try(ctx) + str = pdf_to_name(ctx, obj); + fz_catch(ctx) + { + jni_rethrow(env, ctx); + return NULL; + } + + len = strlen(str); + jbs = (*env)->NewByteArray(env, len); + if (!jbs) return NULL; + bs = (*env)->GetByteArrayElements(env, jbs, NULL); + if (!bs) return NULL; + + memcpy(bs, str, len); (*env)->ReleaseByteArrayElements(env, jbs, bs, 0); @@ -7460,7 +7564,7 @@ JNIEXPORT jstring JNICALL FUN(PDFObject_toString)(JNIEnv *env, jobject self, jboolean tight) { fz_context *ctx = get_context(env); - pdf_obj *obj = from_PDFObject(env, self); + pdf_obj *obj = from_PDFObject_safe(env, self); jstring string = NULL; char *s = NULL; int n = 0; diff --git a/platform/java/src/com/artifex/mupdf/fitz/PDFDocument.java b/platform/java/src/com/artifex/mupdf/fitz/PDFDocument.java index 93fd5ebe..601919d7 100644 --- a/platform/java/src/com/artifex/mupdf/fitz/PDFDocument.java +++ b/platform/java/src/com/artifex/mupdf/fitz/PDFDocument.java @@ -42,7 +42,7 @@ public class PDFDocument public native void deleteObject(int i); public void deleteObject(PDFObject obj) { - deleteObject(obj.toIndirect()); + deleteObject(obj.asIndirect()); } public native PDFGraftMap newPDFGraftMap(); diff --git a/platform/java/src/com/artifex/mupdf/fitz/PDFObject.java b/platform/java/src/com/artifex/mupdf/fitz/PDFObject.java index 10a0e7a8..0f9741b5 100644 --- a/platform/java/src/com/artifex/mupdf/fitz/PDFObject.java +++ b/platform/java/src/com/artifex/mupdf/fitz/PDFObject.java @@ -19,6 +19,8 @@ public class PDFObject pointer = p; } + private static native long newNull(); + public native boolean isIndirect(); public native boolean isNull(); public native boolean isBoolean(); @@ -31,11 +33,15 @@ public class PDFObject public native boolean isDictionary(); public native boolean isStream(); - public native boolean toBoolean(); - public native int toInteger(); - public native float toFloat(); - public native byte[] toByteString(); - public native int toIndirect(); + public native boolean asBoolean(); + public native int asInteger(); + public native float asFloat(); + public native int asIndirect(); + public native String asName(); + public native byte[] asByteName(); + public native String asString(); + public native byte[] asByteString(); + public native String toString(boolean tight); public String toString() { @@ -201,4 +207,6 @@ public class PDFObject public void push(PDFObject obj) { pushPDFObject(obj); } + + public static final PDFObject Null = new PDFObject(newNull()); } |