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 diff --git a/src/main/java/com/shockwave/pdfium/PdfiumCore.java b/src/main/java/com/shockwave/pdfium/PdfiumCore.java index f312d65b..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; @@ -29,12 +31,27 @@ 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 String textGetText(int textPage, int start, int count); + 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"; private static Field mFdField = null; private int mCurrentDpi; + public PdfiumCore(Context ctx){ mCurrentDpi = ctx.getResources().getDisplayMetrics().densityDpi; } @@ -115,7 +132,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..e51dfa26 100644 --- a/src/main/jni/src/mainJNILib.cpp +++ b/src/main/jni/src/mainJNILib.cpp @@ -9,10 +9,14 @@ extern "C" { #include #include +#include #include using namespace android; + #include +#include +#include static Mutex sLibraryLock; @@ -255,4 +259,135 @@ 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(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); + 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, 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){ + + 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; + 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