From f8a3b0e56cbdd3816bcb60ecbe51961e46007c78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mads=20M=C3=B8ller?= Date: Fri, 12 Jun 2015 16:03:47 +0200 Subject: [PATCH 1/4] Start working on the Text Module --- .../java/com/shockwave/pdfium/PdfiumCore.java | 12 +++- src/main/jni/src/mainJNILib.cpp | 56 +++++++++++++++++++ 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/shockwave/pdfium/PdfiumCore.java b/src/main/java/com/shockwave/pdfium/PdfiumCore.java index f312d65b..37ac87c0 100644 --- a/src/main/java/com/shockwave/pdfium/PdfiumCore.java +++ b/src/main/java/com/shockwave/pdfium/PdfiumCore.java @@ -29,6 +29,16 @@ private native void nativeRenderPage(long pagePtr, Surface surface, int dpi, int startX, int startY, int drawSizeHor, int drawSizeVer); + // Text Module + public static native int textLoadPage(long page); + public static native int textFindStart(int textPage, String findWhat, + long flags, int startIndex); + public static native int textFindNext(int handle); + public static native int textFindPrev(int handle); + public static native int textGetSchResultIndex(int handle); + public static native int textGetSchCount(int handle); + public static native void textFindClose(int handle); + private static final Class FD_CLASS = FileDescriptor.class; private static final String FD_FIELD_NAME = "descriptor"; private static Field mFdField = null; @@ -115,7 +125,7 @@ public void renderPage(PdfDocument doc, Surface surface, int pageIndex, try{ //nativeRenderPage(doc.mNativePagesPtr.get(pageIndex), surface, mCurrentDpi); nativeRenderPage(doc.mNativePagesPtr.get(pageIndex), surface, mCurrentDpi, - startX, startY, drawSizeX, drawSizeY); + startX, startY, drawSizeX, drawSizeY); }catch(NullPointerException e){ Log.e(TAG, "mContext may be null"); e.printStackTrace(); diff --git a/src/main/jni/src/mainJNILib.cpp b/src/main/jni/src/mainJNILib.cpp index 425817da..373ed25e 100644 --- a/src/main/jni/src/mainJNILib.cpp +++ b/src/main/jni/src/mainJNILib.cpp @@ -12,7 +12,10 @@ extern "C" { #include using namespace android; + #include +#include +#include static Mutex sLibraryLock; @@ -255,4 +258,57 @@ JNI_FUNC(void, PdfiumCore, nativeRenderPage)(JNI_ARGS, jlong pagePtr, jobject ob ANativeWindow_release(nativeWindow); } + +// Text Module API + +JNI_FUNC(jint*, PdfiumCore, textLoadPage)(JNI_ARGS, jlong pagePtr){ + FPDF_PAGE page = reinterpret_cast(pagePtr); + return (jint*)FPDFText_LoadPage(page); +} + +JNI_FUNC(jint*, PdfiumCore, textFindStart)(JNI_ARGS, jint textpage, jstring findwhat, jlong flag, jint startindex){ + + int length = env->GetStringLength(findwhat); + const FPDF_WCHAR* wcFind = env->GetStringChars(findwhat, 0); + + FPDF_TEXTPAGE pTextPage = reinterpret_cast(textpage); + FPDF_SCHHANDLE searchHandle = NULL; + LOGI("wcFind is %x %x %x %x",wcFind[0],wcFind[1],wcFind[2],wcFind[3]); + + searchHandle = FPDFText_FindStart(pTextPage,(FPDF_WCHAR*)wcFind, flag, startindex); + + if(searchHandle == NULL){ + LOGE("FPDFTextFindStart: FPDFTextFindStart did not return success"); + } + + return (jint*)searchHandle; +} + +JNI_FUNC(jint, PdfiumCore, textGetSchResultIndex)(JNI_ARGS, jint searchHandle){ + FPDF_SCHHANDLE pSearchHandle = reinterpret_cast(searchHandle); + int index = -1; + index = FPDFText_GetSchResultIndex(pSearchHandle); + if(index == -1){ + LOGE("FPDFTextGetSchResultIndex: FPDFTextGetSchResultIndex did not return success"); + } + return index; +} + +JNI_FUNC(jint, PdfiumCore, textGetSchCount)(JNI_ARGS, jint searchHandle){ + FPDF_SCHHANDLE pSearchHandle = reinterpret_cast(searchHandle); + int count = -1; + count = FPDFText_GetSchCount(pSearchHandle); + if(count == -1){ + LOGE("FPDFTextGetSchCount: FPDFTextGetSchCount did not return success"); + } + return count; +} + +JNI_FUNC(void, PdfiumCore, textFindClose)(JNI_ARGS, jint searchHandle){ + FPDF_SCHHANDLE pSearchHandle = reinterpret_cast(searchHandle); + FPDFText_FindClose(pSearchHandle); +} + + + }//extern C From 5784ded61d7c47553419da756ebf3c5102ac0025 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mads=20M=C3=B8ller?= Date: Fri, 12 Jun 2015 16:48:14 +0200 Subject: [PATCH 2/4] idea ignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index b8fc28ab..052ebc87 100644 --- a/.gitignore +++ b/.gitignore @@ -2,5 +2,5 @@ src/main/libs src/main/obj - +.idea *.iml \ No newline at end of file From 9e3c2c1a73cfb634c385c2066cf2908f473f9e06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mads=20M=C3=B8ller?= Date: Mon, 15 Jun 2015 15:56:27 +0200 Subject: [PATCH 3/4] Added textGetText, textGetRect, textCountRects and textCountChars --- .../java/com/shockwave/pdfium/PdfiumCore.java | 27 +++++++- src/main/jni/src/mainJNILib.cpp | 65 +++++++++++++++++++ 2 files changed, 90 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/shockwave/pdfium/PdfiumCore.java b/src/main/java/com/shockwave/pdfium/PdfiumCore.java index 37ac87c0..35069d08 100644 --- a/src/main/java/com/shockwave/pdfium/PdfiumCore.java +++ b/src/main/java/com/shockwave/pdfium/PdfiumCore.java @@ -31,12 +31,15 @@ private native void nativeRenderPage(long pagePtr, Surface surface, int dpi, // Text Module public static native int textLoadPage(long page); - public static native int textFindStart(int textPage, String findWhat, - long flags, int startIndex); + public static native int textFindStart(int textPage, String findWhat, long flags, int startIndex); public static native int textFindNext(int handle); public static native int textFindPrev(int handle); public static native int textGetSchResultIndex(int handle); public static native int textGetSchCount(int handle); + public static native String textGetText(int textPage, int start, int count); + public static native RectangleF textGetRect(int textPage, int index); + public static native int textCountRects(int textPage, int start, int count); + public static native int textCountChars(int textPage); public static native void textFindClose(int handle); private static final Class FD_CLASS = FileDescriptor.class; @@ -45,6 +48,26 @@ public static native int textFindStart(int textPage, String findWhat, private int mCurrentDpi; + + public class Rectangle { + public int left; + public int top; + public int right; + public int bottom; + + } + + public class RectangleF { + public float left; + public float top; + public float right; + public float bottom; + } + + public class PointF { + public float x, y; + } + public PdfiumCore(Context ctx){ mCurrentDpi = ctx.getResources().getDisplayMetrics().densityDpi; } diff --git a/src/main/jni/src/mainJNILib.cpp b/src/main/jni/src/mainJNILib.cpp index 373ed25e..8c864d48 100644 --- a/src/main/jni/src/mainJNILib.cpp +++ b/src/main/jni/src/mainJNILib.cpp @@ -9,6 +9,7 @@ extern "C" { #include #include +#include #include using namespace android; @@ -284,6 +285,70 @@ JNI_FUNC(jint*, PdfiumCore, textFindStart)(JNI_ARGS, jint textpage, jstring find return (jint*)searchHandle; } +// TODO: incomplete +JNI_FUNC(jstring, PdfiumCore, textGetText)(JNI_ARGS, jint textpage, jint nStart, jint nCount){ + + FPDF_DWORD bufflen = 0; + + FPDF_TEXTPAGE pTextPage = reinterpret_cast(textpage); + + //TODO: How to fix this ???? + FPDF_WCHAR* pBuff = new FPDF_WCHAR[bufflen+1]; + pBuff[bufflen] = 0; + + int ret = FPDFText_GetText(pTextPage, nStart, nCount, pBuff); + + if(ret == 0){ + LOGE("FPDFTextGetText: FPDFTextGetText did not return success"); + } + + return env->NewString(pBuff, bufflen); +} + +JNI_FUNC(jint, PdfiumCore, textCountChars)(JNI_ARGS, jint textPage){ + + FPDF_TEXTPAGE pTextPage = reinterpret_cast(textPage); + int count = 0; + count = FPDFText_CountChars(pTextPage); + return count; +} + +JNI_FUNC(jint, PdfiumCore, textCountRects)(JNI_ARGS, jint textPage, jint start, jint count){ + + FPDF_TEXTPAGE pTextPage = reinterpret_cast(textPage); + int rectCount = 0; + rectCount = FPDFText_CountRects(pTextPage, start, count); + return rectCount; +} + + +JNI_FUNC(jobject, PdfiumCore, textGetRect)(JNI_ARGS, jint textpage, jint index){ + + jclass cls_r; + double rectLeft, rectTop, rectRight, rectBottom; + FPDF_TEXTPAGE pTextPage = reinterpret_cast(textpage); + + FPDFText_GetRect(pTextPage, index, &rectLeft, &rectTop, &rectRight, &rectBottom); + + // get android RectF + cls_r = env->FindClass((const char*)"android/graphics/RectF"); + if (cls_r == NULL){ + return NULL; + } + + jobject obj = env->AllocObject(cls_r); + jfieldID left = env->GetFieldID( cls_r, (const char*)"left", "F"); + jfieldID right = env->GetFieldID(cls_r, (const char*)"right", "F"); + jfieldID top = env->GetFieldID(cls_r, (const char*)"top", "F"); + jfieldID bottom = env->GetFieldID( cls_r, (const char*)"bottom", "F"); + + env->SetFloatField( obj, left, rectLeft); + env->SetFloatField( obj, right, rectRight); + env->SetFloatField( obj, top, rectTop); + env->SetFloatField( obj, bottom, rectBottom); + return obj; +} + JNI_FUNC(jint, PdfiumCore, textGetSchResultIndex)(JNI_ARGS, jint searchHandle){ FPDF_SCHHANDLE pSearchHandle = reinterpret_cast(searchHandle); int index = -1; From 78f7f67cbb4dcfdcda6f2885aeae168f8ea11c9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mads=20M=C3=B8ller?= Date: Mon, 15 Jun 2015 16:32:07 +0200 Subject: [PATCH 4/4] Added textGetRect, textClosePage --- .../java/com/shockwave/pdfium/PdfiumCore.java | 24 ++++--------------- src/main/jni/src/mainJNILib.cpp | 14 +++++++++++ 2 files changed, 18 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/shockwave/pdfium/PdfiumCore.java b/src/main/java/com/shockwave/pdfium/PdfiumCore.java index 35069d08..1705d4bd 100644 --- a/src/main/java/com/shockwave/pdfium/PdfiumCore.java +++ b/src/main/java/com/shockwave/pdfium/PdfiumCore.java @@ -3,6 +3,8 @@ import android.content.Context; import android.util.Log; import android.view.Surface; +import android.graphics.RectF; +import android.graphics.PointF; import java.io.FileDescriptor; import java.lang.reflect.Field; @@ -37,10 +39,11 @@ private native void nativeRenderPage(long pagePtr, Surface surface, int dpi, public static native int textGetSchResultIndex(int handle); public static native int textGetSchCount(int handle); public static native String textGetText(int textPage, int start, int count); - public static native RectangleF textGetRect(int textPage, int index); + public static native RectF textGetRect(int textPage, int index); public static native int textCountRects(int textPage, int start, int count); public static native int textCountChars(int textPage); public static native void textFindClose(int handle); + public static native void textClosePage(int textPage); private static final Class FD_CLASS = FileDescriptor.class; private static final String FD_FIELD_NAME = "descriptor"; @@ -49,25 +52,6 @@ private native void nativeRenderPage(long pagePtr, Surface surface, int dpi, private int mCurrentDpi; - public class Rectangle { - public int left; - public int top; - public int right; - public int bottom; - - } - - public class RectangleF { - public float left; - public float top; - public float right; - public float bottom; - } - - public class PointF { - public float x, y; - } - public PdfiumCore(Context ctx){ mCurrentDpi = ctx.getResources().getDisplayMetrics().densityDpi; } diff --git a/src/main/jni/src/mainJNILib.cpp b/src/main/jni/src/mainJNILib.cpp index 8c864d48..e51dfa26 100644 --- a/src/main/jni/src/mainJNILib.cpp +++ b/src/main/jni/src/mainJNILib.cpp @@ -267,6 +267,11 @@ JNI_FUNC(jint*, PdfiumCore, textLoadPage)(JNI_ARGS, jlong pagePtr){ return (jint*)FPDFText_LoadPage(page); } +JNI_FUNC(void, PdfiumCore, textClosePage)(JNI_ARGS, jint textpage){ + FPDF_TEXTPAGE pTextPage = reinterpret_cast(textpage); + FPDFText_ClosePage(pTextPage); +} + JNI_FUNC(jint*, PdfiumCore, textFindStart)(JNI_ARGS, jint textpage, jstring findwhat, jlong flag, jint startindex){ int length = env->GetStringLength(findwhat); @@ -285,6 +290,15 @@ JNI_FUNC(jint*, PdfiumCore, textFindStart)(JNI_ARGS, jint textpage, jstring find return (jint*)searchHandle; } +JNI_FUNC(jint, PdfiumCore, textFindNext)(JNI_ARGS, jint searchHandle){ + + FPDF_SCHHANDLE pSearchHandle = reinterpret_cast(searchHandle); + FPDF_BOOL isMatch = 0; + isMatch = FPDFText_FindNext(pSearchHandle); + LOGD("FPDFText_FindNext Match is %x",isMatch); + return isMatch; +} + // TODO: incomplete JNI_FUNC(jstring, PdfiumCore, textGetText)(JNI_ARGS, jint textpage, jint nStart, jint nCount){