Browse Source

ComPDFKit(flutter) - 1.缩略图列表功能

liuxiaolong 1 year ago
parent
commit
a524b63c34
32 changed files with 1078 additions and 372 deletions
  1. BIN
      android/src/main/assets/PDF32000_2008.pdf
  2. 3 1
      android/src/main/java/com/compdfkit/flutter/compdfkit_flutter/CompdfkitFlutterPlugin.java
  3. 5 6
      android/src/main/java/com/compdfkit/flutter/compdfkit_flutter/common/pdfstyle/provider/CStyleProvider.java
  4. 103 0
      android/src/main/java/com/compdfkit/flutter/compdfkit_flutter/common/pdfstyle/provider/CPDFDocumentDataProvider.java
  5. 112 0
      android/src/main/java/com/compdfkit/flutter/compdfkit_flutter/common/pdfstyle/provider/CPDFViewCtrlDataProvider.java
  6. 0 101
      android/src/main/java/com/compdfkit/flutter/compdfkit_flutter/common/pdfstyle/provider/CPDFViewCtrlStyle.java
  7. 18 0
      android/src/main/java/com/compdfkit/flutter/compdfkit_flutter/common/pdfstyle/provider/ParamsUtil.java
  8. 12 11
      android/src/main/java/com/compdfkit/flutter/compdfkit_flutter/common/views/cpdfviewctrl/CPDFViewCtrlFlutter.java
  9. 16 5
      android/src/main/java/com/compdfkit/flutter/compdfkit_flutter/plugin/BaseMethodChannelPlugin.java
  10. 14 19
      android/src/main/java/com/compdfkit/flutter/compdfkit_flutter/plugin/CPDFDocumentPlugin.java
  11. 7 27
      android/src/main/java/com/compdfkit/flutter/compdfkit_flutter/plugin/CPDFViewCtrlPlugin.java
  12. 16 7
      android/src/main/java/com/compdfkit/flutter/compdfkit_flutter/plugin/ComPDFKitSDKPlugin.java
  13. 2 0
      example/android/app/src/main/AndroidManifest.xml
  14. 8 12
      example/lib/main.dart
  15. 0 90
      example/lib/widgets/cpdf_readerview_page.dart
  16. 0 8
      example/pubspec.lock
  17. 0 2
      example/pubspec.yaml
  18. 14 0
      lib/common/util/Strings.dart
  19. 15 7
      lib/compdfkit.dart
  20. 17 10
      lib/core/cpdf_view_ctrl.dart
  21. 29 2
      lib/core/document/cpdf_document.dart
  22. 30 0
      lib/core/document/cpdf_document_error.dart
  23. 6 7
      lib/cpdf_configuration.dart
  24. 10 0
      lib/theme/themes.dart
  25. 52 9
      lib/widgets/common/views/cpdf_main_tool_bar.dart
  26. 2 3
      lib/widgets/common/views/cpdf_tool_bar.dart
  27. 98 0
      lib/widgets/cpdf_readerview_page.dart
  28. 63 34
      lib/widgets/viewer/pdfbota/cpdf_bota_page.dart
  29. 157 4
      lib/widgets/viewer/pdfbota/pdfthumbnail/cpdf_thumbnail_page.dart
  30. 253 5
      pubspec.lock
  31. 3 2
      pubspec.yaml
  32. 13 0
      test/cpdf_document_test.dart

BIN
android/src/main/assets/PDF32000_2008.pdf


+ 3 - 1
android/src/main/java/com/compdfkit/flutter/compdfkit_flutter/CompdfkitFlutterPlugin.java

@@ -13,6 +13,7 @@ import androidx.annotation.NonNull;
 
 import com.compdfkit.core.document.CPDFSdk;
 import com.compdfkit.flutter.compdfkit_flutter.common.views.cpdfviewctrl.CPDFViewCtrlFactory;
+import com.compdfkit.flutter.compdfkit_flutter.plugin.CPDFDocumentPlugin;
 import com.compdfkit.flutter.compdfkit_flutter.plugin.ComPDFKitSDKPlugin;
 
 import io.flutter.embedding.engine.plugins.FlutterPlugin;
@@ -38,7 +39,8 @@ public class CompdfkitFlutterPlugin implements FlutterPlugin, ActivityAware {
     public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBinding) {
         mRegistry = flutterPluginBinding.getPlatformViewRegistry();
         mMessenger = flutterPluginBinding.getBinaryMessenger();
-        new ComPDFKitSDKPlugin(mMessenger);
+        new ComPDFKitSDKPlugin(mMessenger, flutterPluginBinding.getApplicationContext());
+        new CPDFDocumentPlugin(mMessenger);
     }
 
     @Override

+ 5 - 6
android/src/main/java/com/compdfkit/flutter/compdfkit_flutter/common/pdfstyle/provider/CStyleProvider.java

@@ -10,13 +10,12 @@
 package com.compdfkit.flutter.compdfkit_flutter.common.pdfstyle.provider;
 
 
-import java.util.Map;
+import io.flutter.plugin.common.MethodCall;
+import io.flutter.plugin.common.MethodChannel;
 
-public interface CStyleProvider {
+public interface CPDFDataProvider {
 
-    void updateStyle(Map<String, Object> params);
+    void updateConfig(String method, Object arguments);
 
-    Map<String, Object> getStyles();
-
-    Object getStyle(String key);
+    void resultConfig(MethodCall call, MethodChannel.Result result);
 }

+ 103 - 0
android/src/main/java/com/compdfkit/flutter/compdfkit_flutter/common/pdfstyle/provider/CPDFDocumentDataProvider.java

@@ -0,0 +1,103 @@
+/**
+ * Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+ * <p>
+ * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+ * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+ * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+ * This notice may not be removed from this file.
+ */
+
+package com.compdfkit.flutter.compdfkit_flutter.common.pdfstyle.provider;
+
+import android.graphics.Bitmap;
+import android.graphics.RectF;
+import android.graphics.drawable.Drawable;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+
+import com.bumptech.glide.Glide;
+import com.bumptech.glide.load.engine.DiskCacheStrategy;
+import com.bumptech.glide.request.target.CustomTarget;
+import com.bumptech.glide.request.transition.Transition;
+import com.compdfkit.core.document.CPDFDocument;
+import com.compdfkit.flutter.compdfkit_flutter.common.views.cpdfviewctrl.CPDFViewCtrl;
+import com.compdfkit.tools.common.utils.glide.CPDFWrapper;
+import com.compdfkit.tools.common.utils.glide.GlideApp;
+
+import java.io.ByteArrayOutputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+import io.flutter.plugin.common.MethodCall;
+import io.flutter.plugin.common.MethodChannel;
+
+
+public class CPDFDocumentDataProvider implements CPDFDataProvider {
+
+    CPDFDocument document;
+
+    public CPDFDocumentDataProvider(CPDFDocument document) {
+        this.document = document;
+    }
+
+    @Override
+    public void updateConfig(String method, Object arguments) {
+    }
+
+    @Override
+    public void resultConfig(MethodCall call, MethodChannel.Result result) {
+        switch (call.method) {
+            case Method.GET_PAGE_COUNT:
+                result.success(document.getPageCount());
+                break;
+            case Method.GET_PAGE_SIZE:
+                RectF size = document.getPageSize((int) call.arguments);
+                Map<String, Float> map = new HashMap<>(2);
+                map.put("width", size.width());
+                map.put("height", size.height());
+                result.success(map);
+                break;
+            case Method.RENDER_PAGE_AT_INDEX:
+                Map<String, Object> arguments = (Map<String, Object>) call.arguments;
+                int pageIndex = ParamsUtil.getInt(arguments, "pageIndex");
+                int width = ParamsUtil.getInt(arguments, "width");
+                int height = ParamsUtil.getInt(arguments, "height");
+                CPDFWrapper wrapper = CPDFWrapper.fromDocument(document, pageIndex);
+                wrapper.setSize(width, height);
+                GlideApp.with(document.getContext())
+                        .asBitmap()
+                        .load(wrapper)
+                        .diskCacheStrategy(DiskCacheStrategy.NONE)
+                        .into(new CustomTarget<Bitmap>() {
+                            @Override
+                            public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
+                                ByteArrayOutputStream stream = new ByteArrayOutputStream();
+                                resource.compress(Bitmap.CompressFormat.JPEG, 100, stream);
+                                byte[] byteArray = stream.toByteArray();
+                                resource.recycle();;
+                                result.success(byteArray);
+                            }
+
+                            @Override
+                            public void onLoadCleared(@Nullable Drawable placeholder) {
+
+                            }
+                        });
+                break;
+            default:
+                break;
+        }
+    }
+
+    private static class Method {
+
+        public static final String GET_PAGE_COUNT = "getPageCount";
+
+        public static final String GET_PAGE_SIZE = "getPageSize";
+
+        public static final String RENDER_PAGE_AT_INDEX = "renderPageAtIndex";
+
+        public static final String OPEN_DOCUMENT = "openDocument";
+    }
+}

+ 112 - 0
android/src/main/java/com/compdfkit/flutter/compdfkit_flutter/common/pdfstyle/provider/CPDFViewCtrlDataProvider.java

@@ -0,0 +1,112 @@
+/**
+ * Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+ *
+ * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+ * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+ * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+ * This notice may not be removed from this file.
+ */
+
+package com.compdfkit.flutter.compdfkit_flutter.common.pdfstyle.provider;
+
+
+import android.graphics.Color;
+
+import com.compdfkit.flutter.compdfkit_flutter.common.utils.ColorUtils;
+import com.compdfkit.flutter.compdfkit_flutter.common.views.cpdfviewctrl.CPDFViewCtrl;
+import com.compdfkit.ui.reader.CPDFReaderView;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import io.flutter.plugin.common.MethodCall;
+import io.flutter.plugin.common.MethodChannel;
+
+public class CPDFViewCtrlDataProvider implements CPDFDataProvider {
+
+    private CPDFViewCtrl pdfView;
+
+    public CPDFViewCtrlDataProvider(CPDFViewCtrl pdfView){
+        this.pdfView = pdfView;
+    }
+
+
+    @Override
+    public void updateConfig(String method, Object arguments) {
+        if (pdfView != null){
+            CPDFReaderView readerView = pdfView.getCPdfReaderView();
+            switch (method) {
+                case Method.SET_VERTICAL_MODE:
+                    readerView.setVerticalMode(ParamsUtil.getBoolean(arguments, true));
+                    break;
+                case Method.SET_DOUBLE_PAGE:
+                    readerView.setDoublePageMode(ParamsUtil.getBoolean(arguments, false));
+                    break;
+                case Method.SET_CONTINUE_MODE:
+                    readerView.setContinueMode(ParamsUtil.getBoolean(arguments, true));
+                    break;
+                case Method.SET_CROP_MODE:
+                    readerView.setCropMode(ParamsUtil.getBoolean(arguments, false));
+                    break;
+                case Method.SET_READ_BACKGROUND_COLOR:
+                    String hexColor = ParamsUtil.getValue(arguments);
+                    readerView.setReadBackgroundColor(Color.parseColor(hexColor));
+                    break;
+                case Method.SET_DISPLAY_PAGE_INDEX:
+                    Map<String, Object> map = ParamsUtil.getValue(arguments);
+                    int pageIndex = (int) map.get("pageIndex");
+                    boolean animation = (boolean) map.get("animation");
+                    readerView.setDisplayPageIndex(pageIndex, animation);
+                    break;
+                default:break;
+            }
+        }
+    }
+
+    @Override
+    public void resultConfig(MethodCall call, MethodChannel.Result result) {
+        if (pdfView != null){
+            CPDFReaderView readerView = pdfView.getCPdfReaderView();
+            switch (call.method){
+                case Method.IS_VERTICAL_MODE:
+                    result.success(readerView.isVerticalMode());
+                    break;
+                case Method.IS_DOUBLE_PAGE:
+                    result.success(readerView.isDoublePageMode());
+                    break;
+                case Method.IS_CONTINUE_MODE:
+                    result.success(readerView.isContinueMode());
+                    break;
+                case Method.IS_CROP_MODE:
+                    result.success(readerView.isCropMode());
+                    break;
+                case Method.GET_READ_BACKGROUND_COLOR:
+                    result.success(ColorUtils.hexColor(readerView.getReadBackgroundColor()));
+                    break;
+                default:break;
+            }
+        }
+    }
+
+
+
+    private static class Method{
+
+        public static final String SET_VERTICAL_MODE = "setVerticalMode";
+        public static final String IS_VERTICAL_MODE = "isVerticalMode";
+
+        public static final String SET_DOUBLE_PAGE = "setDoublePage";
+        public static final String IS_DOUBLE_PAGE = "isDoublePage";
+
+        public static final String SET_CONTINUE_MODE = "setContinueMode";
+        public static final String IS_CONTINUE_MODE = "isContinueMode";
+
+        public static final String SET_CROP_MODE = "setCropMode";
+        public static final String IS_CROP_MODE = "isCropMode";
+
+        public static final String SET_READ_BACKGROUND_COLOR = "setReadBackgroundColor";
+        public static final String GET_READ_BACKGROUND_COLOR = "getReadBackgroundColor";
+
+        public static final String SET_DISPLAY_PAGE_INDEX = "setDisplayPageIndex";
+    }
+}

+ 0 - 101
android/src/main/java/com/compdfkit/flutter/compdfkit_flutter/common/pdfstyle/provider/CPDFViewCtrlStyle.java

@@ -1,101 +0,0 @@
-/**
- * Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
- *
- * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
- * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
- * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
- * This notice may not be removed from this file.
- */
-
-package com.compdfkit.flutter.compdfkit_flutter.common.pdfstyle.provider;
-
-
-import android.graphics.Color;
-
-import com.compdfkit.flutter.compdfkit_flutter.common.utils.ColorUtils;
-import com.compdfkit.flutter.compdfkit_flutter.common.views.cpdfviewctrl.CPDFViewCtrl;
-import com.compdfkit.flutter.compdfkit_flutter.core.document.viewer.CPDFScrollDirection;
-import com.compdfkit.ui.reader.CPDFReaderView;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class CPDFViewCtrlStyle implements CStyleProvider{
-
-    private CPDFViewCtrl pdfView;
-
-    public CPDFViewCtrlStyle(CPDFViewCtrl pdfView){
-        this.pdfView = pdfView;
-    }
-
-    public static final String IS_VERTICAL_MODE = "isVerticalMode";
-
-    public static final String IS_DOUBLE_PAGE = "isDoublePage";
-
-    public static final String IS_CONTINUE_MODE = "isContinueMode";
-
-    public static final String IS_CROP_MODE = "isCropMode";
-
-    public static final String READ_BACKGROUND_COLOR = "readBackgroundColor";
-
-    public static final String SET_DISPLAY_PAGE_INDEX = "setDisplayPageIndex";
-
-    @Override
-    public void updateStyle(Map<String, Object> params) {
-        if (pdfView != null) {
-            CPDFReaderView readerView = pdfView.getCPdfReaderView();
-            if (params.containsKey(IS_VERTICAL_MODE)) {
-                readerView.setVerticalMode(ParamsUtil.getBoolean(params, IS_VERTICAL_MODE, true));
-            }
-            if (params.containsKey(IS_DOUBLE_PAGE)){
-                readerView.setDoublePageMode(ParamsUtil.getBoolean(params, IS_DOUBLE_PAGE, false));
-            }
-            if (params.containsKey(IS_CONTINUE_MODE)){
-                readerView.setContinueMode(ParamsUtil.getBoolean(params, IS_CONTINUE_MODE, false));
-            }
-            if (params.containsKey(IS_CROP_MODE)){
-                readerView.setCropMode(ParamsUtil.getBoolean(params, IS_CROP_MODE, false));
-            }
-            if (params.containsKey(READ_BACKGROUND_COLOR)){
-                String hexColor = ParamsUtil.getString(params, READ_BACKGROUND_COLOR);
-                readerView.setReadBackgroundColor(Color.parseColor(hexColor));
-            }
-            if (params.containsKey(SET_DISPLAY_PAGE_INDEX)){
-                readerView.setDisplayPageIndex(ParamsUtil.getInt(params, SET_DISPLAY_PAGE_INDEX));
-            }
-        }
-    }
-
-    @Override
-    public Map<String, Object> getStyles() {
-        Map<String, Object> params = new HashMap<>();
-        params.put(IS_VERTICAL_MODE, getStyle(IS_VERTICAL_MODE));
-        params.put(IS_DOUBLE_PAGE, getStyle(IS_DOUBLE_PAGE));
-        params.put(IS_CONTINUE_MODE, getStyle(IS_CONTINUE_MODE));
-        params.put(IS_CROP_MODE, getStyle(IS_CROP_MODE));
-        params.put(READ_BACKGROUND_COLOR, getStyle(READ_BACKGROUND_COLOR));
-        return params;
-    }
-
-    @Override
-    public Object getStyle(String key) {
-        if (pdfView != null){
-            CPDFReaderView readerView = pdfView.getCPdfReaderView();
-            switch (key){
-                case IS_VERTICAL_MODE:
-                    return readerView.isVerticalMode();
-                case IS_DOUBLE_PAGE:
-                    return readerView.isDoublePageMode();
-                case IS_CONTINUE_MODE:
-                    return readerView.isContinueMode();
-                case IS_CROP_MODE:
-                    return readerView.isCropMode();
-                case READ_BACKGROUND_COLOR:
-                    return ColorUtils.hexColor(readerView.getReadBackgroundColor());
-                default:return "";
-            }
-        } else {
-            return "";
-        }
-    }
-}

+ 18 - 0
android/src/main/java/com/compdfkit/flutter/compdfkit_flutter/common/pdfstyle/provider/ParamsUtil.java

@@ -33,6 +33,24 @@ public class ParamsUtil {
         }
     }
 
+    public static boolean getBoolean(Object arguments, boolean defaultValue) {
+        try{
+            boolean value = (boolean) arguments;
+            return value;
+        }catch (Exception e){
+            return defaultValue;
+        }
+    }
+
+    public static <E> E getValue(Object arguments){
+        try{
+            E value = (E) arguments;
+            return value;
+        }catch (Exception e){
+            return null;
+        }
+    }
+
     public static int getInt(Map<String, Object> params, String key){
         try{
             Object value = params.get(key);

+ 12 - 11
android/src/main/java/com/compdfkit/flutter/compdfkit_flutter/common/views/cpdfviewctrl/CPDFViewCtrlFlutter.java

@@ -12,29 +12,25 @@ package com.compdfkit.flutter.compdfkit_flutter.common.views.cpdfviewctrl;
 
 import android.content.Context;
 import android.text.TextUtils;
-import android.view.TextureView;
 import android.view.View;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 
-import com.compdfkit.flutter.compdfkit_flutter.common.pdfstyle.provider.CPDFViewCtrlStyle;
+import com.compdfkit.flutter.compdfkit_flutter.common.pdfstyle.provider.CPDFDocumentDataProvider;
+import com.compdfkit.flutter.compdfkit_flutter.common.pdfstyle.provider.CPDFViewCtrlDataProvider;
 import com.compdfkit.flutter.compdfkit_flutter.common.utils.task.CExtractAssetFileTask;
 import com.compdfkit.flutter.compdfkit_flutter.plugin.CPDFDocumentPlugin;
 import com.compdfkit.flutter.compdfkit_flutter.plugin.CPDFViewCtrlPlugin;
-import com.compdfkit.flutter.compdfkit_flutter.plugin.ComPDFKitSDKPlugin;
-
-import org.json.JSONObject;
 
 import java.util.Map;
 
-import io.flutter.Log;
 import io.flutter.plugin.common.BinaryMessenger;
 import io.flutter.plugin.platform.PlatformView;
 
 public class CPDFViewCtrlFlutter implements PlatformView {
 
-    public static final String QUICK_START_GUIDE = "Quick Start Guide.pdf";
+    public static final String QUICK_START_GUIDE = "PDF32000_2008.pdf";
 
     private CPDFViewCtrl pdfView;
 
@@ -48,27 +44,33 @@ public class CPDFViewCtrlFlutter implements PlatformView {
         // Initialize CPDFViewCtrl and initialize related configuration information
         initCPDFViewCtrl(context, creationParams);
 
-        registerPlugin();
     }
 
     private void initCPDFViewCtrl(Context context, Map<String, Object> creationParams) {
         pdfView = new CPDFViewCtrl(context);
         pdfView.registerPlugin(binaryMessenger, viewId);
         Map<String, Object> configuration = (Map<String, Object>) creationParams.get("configuration");
-        new CPDFViewCtrlStyle(pdfView).updateStyle(configuration);
+        CPDFViewCtrlDataProvider provider = new CPDFViewCtrlDataProvider(pdfView);
+        for (Map.Entry<String, Object> stringObjectEntry : configuration.entrySet()) {
+            provider.updateConfig(stringObjectEntry.getKey(), stringObjectEntry.getValue());
+        }
         if (creationParams.get("document") != null) {
             String documentPath = (String) creationParams.get("document");
             if (!TextUtils.isEmpty(documentPath)) {
                 pdfView.openPDF(documentPath);
+                registerPlugin();
+
             } else {
                 CExtractAssetFileTask.extract(context, QUICK_START_GUIDE, QUICK_START_GUIDE, (filePath) -> {
                             pdfView.openPDF(filePath);
+                            registerPlugin();
                         }
                 );
             }
         } else {
             CExtractAssetFileTask.extract(context, QUICK_START_GUIDE, QUICK_START_GUIDE, (filePath) -> {
                         pdfView.openPDF(filePath);
+                        registerPlugin();
                     }
             );
         }
@@ -76,8 +78,7 @@ public class CPDFViewCtrlFlutter implements PlatformView {
 
     private void registerPlugin() {
         new CPDFViewCtrlPlugin(binaryMessenger, viewId, pdfView);
-        new CPDFDocumentPlugin(binaryMessenger, viewId, pdfView);
-
+        new CPDFDocumentPlugin(binaryMessenger, viewId, pdfView.getCPdfReaderView().getPDFDocument());
     }
 
     @Nullable

+ 16 - 5
android/src/main/java/com/compdfkit/flutter/compdfkit_flutter/plugin/BaseMethodChannelPlugin.java

@@ -11,19 +11,30 @@ package com.compdfkit.flutter.compdfkit_flutter.plugin;
 
 
 
+import android.util.Log;
+
 import io.flutter.plugin.common.BinaryMessenger;
 import io.flutter.plugin.common.MethodChannel;
 
 
 public abstract class BaseMethodChannelPlugin implements MethodChannel.MethodCallHandler {
 
+    protected BinaryMessenger binaryMessenger;
+
+    protected String methodName;
+
+
     protected MethodChannel methodChannel = null;
 
-    public BaseMethodChannelPlugin(BinaryMessenger binaryMessenger) {
-        methodChannel = new MethodChannel(binaryMessenger, methodName());
-        methodChannel.setMethodCallHandler(this);
+    public BaseMethodChannelPlugin(BinaryMessenger binaryMessenger, String methodName) {
+        this.binaryMessenger = binaryMessenger;
+        this.methodName = methodName;
+        initMethodChannel();
     }
 
-    public abstract String methodName();
-
+    protected void initMethodChannel(){
+        Log.e("名称", methodName);
+        methodChannel = new MethodChannel(binaryMessenger, methodName);
+        methodChannel.setMethodCallHandler(this);
+    }
 }

+ 14 - 19
android/src/main/java/com/compdfkit/flutter/compdfkit_flutter/plugin/CPDFDocumentPlugin.java

@@ -3,41 +3,36 @@ package com.compdfkit.flutter.compdfkit_flutter.plugin;
 import androidx.annotation.NonNull;
 
 import com.compdfkit.core.document.CPDFDocument;
+import com.compdfkit.flutter.compdfkit_flutter.common.pdfstyle.provider.CPDFDataProvider;
+import com.compdfkit.flutter.compdfkit_flutter.common.pdfstyle.provider.CPDFDocumentDataProvider;
 import com.compdfkit.flutter.compdfkit_flutter.common.views.cpdfviewctrl.CPDFViewCtrl;
 
-import io.flutter.Log;
 import io.flutter.plugin.common.BinaryMessenger;
 import io.flutter.plugin.common.MethodCall;
 import io.flutter.plugin.common.MethodChannel;
 
 public class CPDFDocumentPlugin extends BaseMethodChannelPlugin {
 
-    private int viewId = 0;
 
-    private CPDFViewCtrl pdfView;
+    private CPDFDocument document;
 
-    public CPDFDocumentPlugin(BinaryMessenger binaryMessenger, int viewId, CPDFViewCtrl pdfView) {
-        super(binaryMessenger);
-        this.viewId = viewId;
-        this.pdfView = pdfView;
+    private CPDFDataProvider provider;
+
+    public CPDFDocumentPlugin(BinaryMessenger binaryMessenger, int viewId, CPDFDocument document) {
+        super(binaryMessenger,"com.compdfkit.flutter.pdfviewer.document." + viewId);
+        this.document = document;
+        provider = new CPDFDocumentDataProvider(document);
     }
 
-    @Override
-    public String methodName() {
-        return "com.compdfkit.flutter.pdfviewer.document." + viewId;
+    public CPDFDocumentPlugin(BinaryMessenger binaryMessenger){
+        super(binaryMessenger,"com.compdfkit.flutter.pdfviewer.document.1000");
     }
 
     @Override
     public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result result) {
-        if (pdfView != null) {
-            CPDFDocument document = pdfView.getCPdfReaderView().getPDFDocument();
-            switch (call.method) {
-                case "getPageCount":
-                    result.success(document.getPageCount());
-                    break;
-                default:
-                    break;
-            }
+        if (document != null) {
+            provider.updateConfig(call.method, call.arguments);
+            provider.resultConfig(call, result);
         } else {
             result.notImplemented();
         }

+ 7 - 27
android/src/main/java/com/compdfkit/flutter/compdfkit_flutter/plugin/CPDFViewCtrlPlugin.java

@@ -10,15 +10,12 @@
 package com.compdfkit.flutter.compdfkit_flutter.plugin;
 
 
-import android.util.Log;
-
 import androidx.annotation.NonNull;
 
-import com.compdfkit.flutter.compdfkit_flutter.common.pdfstyle.provider.CPDFViewCtrlStyle;
-import com.compdfkit.flutter.compdfkit_flutter.common.pdfstyle.provider.CStyleProvider;
+import com.compdfkit.flutter.compdfkit_flutter.common.pdfstyle.provider.CPDFViewCtrlDataProvider;
+import com.compdfkit.flutter.compdfkit_flutter.common.pdfstyle.provider.CPDFDataProvider;
 import com.compdfkit.flutter.compdfkit_flutter.common.views.cpdfviewctrl.CPDFViewCtrl;
 
-import java.util.Map;
 
 import io.flutter.plugin.common.BinaryMessenger;
 import io.flutter.plugin.common.MethodCall;
@@ -26,34 +23,17 @@ import io.flutter.plugin.common.MethodChannel;
 
 public class CPDFViewCtrlPlugin extends BaseMethodChannelPlugin {
 
-    private int viewId;
-
-    private CStyleProvider provider;
 
-    private CPDFViewCtrl pdfView;
+    private CPDFViewCtrlDataProvider provider;
 
     public CPDFViewCtrlPlugin(BinaryMessenger binaryMessenger, int viewId, CPDFViewCtrl pdfView) {
-        super(binaryMessenger);
-        this.viewId = viewId;
-        this.pdfView = pdfView;
-        this.provider = new CPDFViewCtrlStyle(pdfView);
-    }
-
-    @Override
-    public String methodName() {
-        return "com.compdfkit.flutter.pdfviewer.settings." + viewId;
+        super(binaryMessenger, "com.compdfkit.flutter.pdfviewer.settings." + viewId);
+        this.provider = new CPDFViewCtrlDataProvider(pdfView);
     }
 
     @Override
     public void onMethodCall(@NonNull MethodCall call, @NonNull MethodChannel.Result result) {
-        switch (call.method) {
-            case "settings":
-                Map<String, Object> config = (Map<String, Object>) call.arguments;
-                provider.updateStyle(config);
-                break;
-            default:
-                result.success(provider.getStyle(call.method));
-                break;
-        }
+        provider.updateConfig(call.method, call.arguments);
+        provider.resultConfig(call, result);
     }
 }

+ 16 - 7
android/src/main/java/com/compdfkit/flutter/compdfkit_flutter/plugin/ComPDFKitSDKPlugin.java

@@ -9,8 +9,12 @@
 
 package com.compdfkit.flutter.compdfkit_flutter.plugin;
 
+import android.content.Context;
+
 import androidx.annotation.NonNull;
 
+import com.compdfkit.core.common.CPDFDocumentException;
+import com.compdfkit.core.document.CPDFDocument;
 import com.compdfkit.core.document.CPDFSdk;
 
 import io.flutter.plugin.common.BinaryMessenger;
@@ -26,8 +30,15 @@ public class ComPDFKitSDKPlugin extends BaseMethodChannelPlugin {
 
     public static final String SDK_BUILD_TAG = "sdk_build_tag";
 
-    public ComPDFKitSDKPlugin(BinaryMessenger binaryMessenger) {
-        super(binaryMessenger);
+    public static final String GET_TEMPORARY_DIRECTORY = "getTemporaryDirectory";
+
+    public static final String CREATE_TEST_FILE = "createTestFile";
+
+    private Context context;
+
+    public ComPDFKitSDKPlugin(BinaryMessenger binaryMessenger, Context context) {
+        super(binaryMessenger,"com.compdfkit.flutter.plugin");
+        this.context = context;
     }
 
     @Override
@@ -42,13 +53,11 @@ public class ComPDFKitSDKPlugin extends BaseMethodChannelPlugin {
             case SDK_BUILD_TAG:
                 result.success(CPDFSdk.getSDKBuildTag());
                 break;
+            case GET_TEMPORARY_DIRECTORY:
+                result.success(context.getCacheDir().getAbsolutePath());
+                break;
             default:
                 break;
         }
     }
-
-    @Override
-    public String methodName() {
-        return "com.compdfkit.flutter.plugin";
-    }
 }

+ 2 - 0
example/android/app/src/main/AndroidManifest.xml

@@ -1,5 +1,7 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     package="com.compdfkit.flutter.example">
+    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
 
     <application
         android:name="${applicationName}"

+ 8 - 12
example/lib/main.dart

@@ -1,5 +1,5 @@
 import 'package:compdfkit_flutter/compdfkit.dart';
-import 'package:compdfkit_flutter_example/widgets/cpdf_readerview_page.dart';
+import 'package:compdfkit_flutter/widgets/cpdf_readerview_page.dart';
 
 import 'package:flutter/material.dart';
 
@@ -26,29 +26,25 @@ class _MyAppState extends State<MyApp> {
   }
 
   void _init() async {
-    ComPDFKit comPDFKit = ComPDFKit();
-    comPDFKit.init(
+    ComPDFKit.init(
         'rgFNqsZykKZ9g+uUEl59uYolfyQQha7hfKF3ojzs41pP3PBGfzPS/9CMwsBkJsqNBfULy7kBiUGXelugMdloJ+DWqE5Zjt4+xP6t2paXuFOPX/uXy6G/9vZkuEGSIFfBpUzrCgcXs4xxh8k5+sAfW+EA7DvUgt7u0CcPRyqr1Jg=',
         'mG0c3O3Mzeu5dkZJW3gpqiAYrD3HuVAh2a+2rjOsIRhyTBaXPgPRGke3LtDII3XZqZRGhToxzSR51pXlzib4f0WpLOaOv47bs7x+UqfQzn9hrp9sGpqfp0B228KI+IMTu4aGVjtYuk+Uxs/kosIBwyVLBY93oKLBB8UJg4t07605BGbaBKUlDopA0iGq1HSncUNNe38VRnoTm6ibgXyIGz5dhD0tvZsf2Vt2my9XP/2scnSpUeS12jwHQXiCsaaK/oKTJGcYKLPGdXenrzHolQ==');
-    String ver = await comPDFKit.getVersionCode();
+    String ver = await ComPDFKit.getVersionCode();
     setState(() {
       _version = ver;
     });
-    comPDFKit.getSDKBuildTag().then((value) {
+    ComPDFKit.getSDKBuildTag().then((value) {
       setState(() {
         _buildTag = value;
       });
     });
+    ComPDFKit.getTemporaryDirectory().then((value) {
+      print('临时路径:${value.path}');
+    });
   }
 
   @override
   Widget build(BuildContext context) {
-    return const MaterialApp(
-      home: Scaffold(
-          body: SafeArea(
-              child: CPDFReaderViewPage(
-        isDark: true,
-      ))),
-    );
+    return const CPDFReaderViewPage(isDark: false);
   }
 }

+ 0 - 90
example/lib/widgets/cpdf_readerview_page.dart

@@ -1,90 +0,0 @@
-import 'package:compdfkit_flutter/core/cpdf_view_ctrl.dart';
-import 'package:compdfkit_flutter/cpdf_configuration.dart';
-import 'package:compdfkit_flutter/theme/colors.dart';
-import 'package:compdfkit_flutter/theme/themes.dart';
-import 'package:compdfkit_flutter/widgets/common/pdfview/cpdf_page_indicator.dart';
-import 'package:compdfkit_flutter/widgets/common/pdfview/cpdf_page_slider_bar.dart';
-import 'package:compdfkit_flutter/widgets/common/pdfview/cpdf_reader_widget.dart';
-import 'package:compdfkit_flutter/widgets/common/slider/cpdf_slider_theme.dart';
-import 'package:compdfkit_flutter/widgets/common/views/cpdf_main_tool_bar.dart';
-import 'package:flutter/material.dart';
-
-///  Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
-///
-///  THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
-///  AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
-///  UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
-///  This notice may not be removed from this file.
-
-class CPDFReaderViewPage extends StatefulWidget {
-  final bool isDark;
-
-  const CPDFReaderViewPage({super.key, this.isDark = false});
-
-  @override
-  State<CPDFReaderViewPage> createState() => _CPDFReaderViewPageState();
-}
-
-class _CPDFReaderViewPageState extends State<CPDFReaderViewPage> {
-  CPDFViewCtrl? ctrl;
-
-  @override
-  void initState() {
-    super.initState();
-  }
-
-  @override
-  Widget build(BuildContext context) {
-    return Theme(
-        data: widget.isDark ? comPDFKitDarkTheme : comPDFKitLightTheme,
-        child: Builder(builder: (context) {
-          return Container(
-              color: Theme.of(context).colorScheme.background,
-              child: Stack(
-                alignment: Alignment.center,
-                children: [
-                  CPDFReaderWidget(
-                    documentPath: "",
-                    configuration: CPDFConfiguration(),
-                    onComPDFKitWidgetCreate: (ctrl) {
-                      setState(() {
-                        this.ctrl = ctrl;
-                        setReaderViewCallback();
-                      });
-                    },
-                  ),
-                  if (ctrl != null) ...{
-                    Positioned(
-                        bottom: 20,
-                        child: CPDFPageIndicator(
-                          ctrl: ctrl!,
-                          isDark: widget.isDark,
-                        )),
-                    Positioned(
-                        right: 0,
-                        top: 0,
-                        bottom: 0,
-                        child: CPDFPageNavigationSliderBar(
-                            ctrl: ctrl!,
-                            position: CPDFSliderIndicatorPosition.right)),
-                    Positioned(
-                        top: 0,
-                        left: 0,
-                        right: 0,
-                        child: CPDFMainToolbar.normal(
-                          isDark: widget.isDark,
-                          ctrl: ctrl!,
-                        )),
-                  },
-                ],
-              ));
-        }));
-  }
-
-  void setReaderViewCallback() {
-    ctrl!.setReaderViewCallback(
-        onMoveToChild: (pageIndex) {},
-        onScrollEnd: () {},
-        onRecordLastJumpPageNum: (pageIndex) {});
-  }
-}

+ 0 - 8
example/pubspec.lock

@@ -105,14 +105,6 @@ packages:
     description: flutter
     source: sdk
     version: "0.0.0"
-  intl:
-    dependency: transitive
-    description:
-      name: intl
-      sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d"
-      url: "https://pub.dev"
-    source: hosted
-    version: "0.18.1"
   js:
     dependency: transitive
     description:

+ 0 - 2
example/pubspec.yaml

@@ -53,8 +53,6 @@ flutter:
   # included with your application, so that you can use the icons in
   # the material Icons class.
   uses-material-design: true
-  assets:
-    - assets/images/
   # To add assets to your application, add an assets section, like this:
   # assets:
   #   - images/a_dot_burr.jpeg

+ 14 - 0
lib/common/util/Strings.dart

@@ -0,0 +1,14 @@
+///  Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+///
+///  THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+///  AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+///  UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+///  This notice may not be removed from this file.
+
+class Strings {
+
+  static const String Thumbnails = 'Thumbnails';
+  static const String Annotations = 'Annotations';
+  static const String Bookmarks = 'Bookmarks';
+  static const String Outlines = 'Outlines';
+}

+ 15 - 7
lib/compdfkit.dart

@@ -5,29 +5,37 @@
 ///  UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
 ///  This notice may not be removed from this file.
 
+import 'dart:io';
+
 import 'package:flutter/services.dart';
 
 class ComPDFKit {
-  var methodChannel = const MethodChannel('com.compdfkit.flutter.plugin');
+
+  static const _methodChannel = MethodChannel('com.compdfkit.flutter.plugin');
 
   static const initSDK = 'init_sdk';
   static const sdkVersionCode = 'sdk_version_code';
   static const sdkBuildTag = "sdk_build_tag";
 
   /// init ComPDFKit sdk, please enter your ComPDFKit key and secret
-  void init(String key, String secret) async {
-    methodChannel.invokeMethod(initSDK, {'key': key, 'secret': secret});
+  static void init(String key, String secret) async {
+    _methodChannel.invokeMethod(initSDK, {'key': key, 'secret': secret});
   }
 
   /// get ComPDFKit SDK version code
-  Future<String> getVersionCode() async {
+  static Future<String> getVersionCode() async {
     String versionCode =
-        await methodChannel.invokeMethod(ComPDFKit.sdkVersionCode);
+        await _methodChannel.invokeMethod(ComPDFKit.sdkVersionCode);
     return versionCode;
   }
 
-  Future<String> getSDKBuildTag() async {
-    String buildTag = await methodChannel.invokeMethod(ComPDFKit.sdkBuildTag);
+  static Future<String> getSDKBuildTag() async {
+    String buildTag = await _methodChannel.invokeMethod(ComPDFKit.sdkBuildTag);
     return buildTag;
   }
+
+  static Future<Directory> getTemporaryDirectory() async {
+    String path = await _methodChannel.invokeMethod('getTemporaryDirectory');
+    return Directory(path);
+  }
 }

+ 17 - 10
lib/core/cpdf_view_ctrl.dart

@@ -12,7 +12,6 @@ import 'document/cpdf_document.dart';
 ///  This notice may not be removed from this file.
 
 class CPDFViewCtrl {
-
   int _viewId = 0;
 
   late final MethodChannel _methodChannel;
@@ -21,12 +20,17 @@ class CPDFViewCtrl {
 
   late final CPDFDocument document;
 
+  // Monitor the page number currently displayed when the page slides
   var currentPageIndexStream = StreamController<int>.broadcast();
-  var _currentPageIndex = 0;
+  var currentPageIndex = 0;
 
+  // The sliding state of the current page, sliding or stopped
   var scrollStatusController = StreamController<bool>.broadcast();
   var _isScrolling = false;
 
+  var onTapMainDocArea = StreamController<bool>.broadcast();
+  var _onTapMainDocArea = false;
+
   StreamSubscription? _streamSubscription;
 
   CPDFViewCtrl(int id) {
@@ -36,6 +40,7 @@ class CPDFViewCtrl {
         MethodChannel('com.compdfkit.flutter.pdfviewer.settings.$_viewId');
     _readerViewCallbackEventChannel = EventChannel(
         'com.compdfkit.flutter.pdfviewer.readerview.callback.$_viewId');
+    setReaderViewCallback();
   }
 
   /// get cpdf_reader_widget scroll Direction
@@ -47,13 +52,13 @@ class CPDFViewCtrl {
 
   /// set scroll direction
   void setVerticalMode(bool verticalMode) async {
-    await _methodChannel
-        .invokeMethod('settings', {'isVerticalMode': verticalMode});
+    await _methodChannel.invokeMethod('setVerticalMode', verticalMode);
   }
 
   void setDisplayPageIndex(int pageIndex) async {
-    await _methodChannel.invokeMethod('settings', {
-      'setDisplayPageIndex' : pageIndex
+    await _methodChannel.invokeMethod('setDisplayPageIndex', {
+      'pageIndex' : pageIndex,
+      'animation' : true
     });
   }
 
@@ -73,6 +78,8 @@ class CPDFViewCtrl {
           if (onTapMainDocArea != null) {
             onTapMainDocArea();
           }
+          _onTapMainDocArea = true;
+          this.onTapMainDocArea.sink.add(_onTapMainDocArea);
           break;
         case 'onMoveToChild':
           int pageIndex = result['pageIndex'];
@@ -80,8 +87,8 @@ class CPDFViewCtrl {
             int pageIndex = result['pageIndex'];
             onMoveToChild(pageIndex);
           }
-          _currentPageIndex = pageIndex;
-          currentPageIndexStream.sink.add(_currentPageIndex);
+          currentPageIndex = pageIndex;
+          currentPageIndexStream.sink.add(currentPageIndex);
           break;
         case 'onRecordLastJumpPageNum':
           if (onRecordLastJumpPageNum != null) {
@@ -93,7 +100,7 @@ class CPDFViewCtrl {
           if (onScrollEnd != null) {
             onScrollEnd();
           }
-          if (_isScrolling){
+          if (_isScrolling) {
             _isScrolling = false;
             scrollStatusController.sink.add(_isScrolling);
           }
@@ -111,7 +118,7 @@ class CPDFViewCtrl {
     }, cancelOnError: true);
   }
 
-  void dispose(){
+  void dispose() {
     currentPageIndexStream.close();
     scrollStatusController.close();
     _streamSubscription?.cancel();

+ 29 - 2
lib/core/document/cpdf_document.dart

@@ -1,5 +1,8 @@
+import 'dart:ui' as ui;
 import 'package:flutter/services.dart';
 
+import 'cpdf_document_error.dart';
+
 ///  Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
 ///
 ///  THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
@@ -12,14 +15,38 @@ class CPDFDocument {
 
   late final MethodChannel _methodChannel;
 
-  CPDFDocument(int viewId) {
-    _viewId = viewId;
+  CPDFDocument(this._viewId) {
     _methodChannel =
         MethodChannel('com.compdfkit.flutter.pdfviewer.document.$_viewId');
   }
 
+  CPDFDocument.create() : this(1000);
+
+  Future<PDFDocumentError> open(String document, {String password = ''}) async {
+    int errorCode = await _methodChannel.invokeMethod('openPDF',{
+      'document' : document,
+      'password' : password
+    });
+    return PDFDocumentError.values.firstWhere((element) => element.index == errorCode);
+  }
+
+  /// Get the number of pages in a pdf file
   Future<int> getPageCount() async {
     return await _methodChannel.invokeMethod('getPageCount');
   }
 
+  /// Get the page size of the specified page number in the pdf file
+  Future<List<double>> getPageSize(int pageIndex) async {
+    Map<dynamic, dynamic> map =
+        await _methodChannel.invokeMethod('getPageSize', pageIndex);
+    return Future(() => [map['width'], map['height']]);
+  }
+
+  /// Render the page with the specified page number and return the image
+  Future<Uint8List> renderPageAtIndex(
+      int pageIndex, int width, int height) async {
+    Uint8List imageData = await _methodChannel.invokeMethod('renderPageAtIndex',
+        {'pageIndex': pageIndex, 'width': width, 'height': height});
+    return imageData;
+  }
 }

+ 30 - 0
lib/core/document/cpdf_document_error.dart

@@ -0,0 +1,30 @@
+///
+///  Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+///
+///  THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+///  AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+///  UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+///  This notice may not be removed from this file.
+
+
+enum PDFDocumentError {
+
+  pdfDocumentErrorNoReadPermission,
+
+  pdfDocumentNotVerifyLicense,
+
+  pdfDocumentErrorSuccess,
+
+  pdfDocumentErrorUnknown,
+
+  pdfDocumentErrorFile,
+
+  pdfDocumentErrorFormat,
+
+  pdfDocumentErrorPassword,
+
+  pdfDocumentErrorSecurity,
+
+  pdfDocumentErrorPage
+
+}

+ 6 - 7
lib/cpdf_configuration.dart

@@ -1,7 +1,6 @@
 import 'dart:ui';
 
 import 'package:compdfkit_flutter/common/util/cpdf_color_extension.dart';
-import 'package:compdfkit_flutter/core/document/viewer/cpdf_scroll_direction.dart';
 import 'package:flutter/material.dart';
 
 import 'core/annotation/cpdf_border_style.dart';
@@ -32,12 +31,12 @@ class CPDFConfiguration {
 
   Map<String, dynamic> toConfiguration(){
     return {
-      'isVerticalMode': isVerticalMode,
-      'isDoublePage': isDoublePage,
-      'isContinueMode': isContinueMode,
-      'isCoverPageMode': isCoverPageMode,
-      'isCropMode': isCropMode,
-      'readBackgroundColor': readBackgroundColor.toHex(),
+      'setVerticalMode': isVerticalMode,
+      'setDoublePage': isDoublePage,
+      'setContinueMode': isContinueMode,
+      'setCoverPageMode': isCoverPageMode,
+      'setCropMode': isCropMode,
+      'setReadBackgroundColor': readBackgroundColor.toHex(),
       'annotAttribute': {
         'note': {
           'color': "#A5D6A7"

+ 10 - 0
lib/theme/themes.dart

@@ -20,6 +20,11 @@ final comPDFKitLightTheme = ThemeData(
         onSecondary: Colors.white,
         background: Color(0xFFFAFCFF),
         onBackground: Color(0xFF43474D)),
+    tabBarTheme: const TabBarTheme(
+      dividerColor: Color(0xFF1460F3),
+      labelColor: Color(0xFF1460F3),
+      unselectedLabelColor: Color(0xFF43474D),
+    ),
     textTheme: const TextTheme(
         titleMedium: TextStyle(color: Color(0xFF43474D), fontSize: 16),
         titleLarge: TextStyle(color: Color(0xFF43474D)),
@@ -36,6 +41,11 @@ final comPDFKitDarkTheme = ThemeData(
       onSecondary: Color(0xFF606773),
       background: Color(0xFF414347),
     ),
+    tabBarTheme: const TabBarTheme(
+      dividerColor: Color(0xFF6499FF),
+      labelColor: Color(0xFF6499FF),
+      unselectedLabelColor: Colors.white,
+    ),
     textTheme: const TextTheme(
         titleMedium: TextStyle(color: Colors.white, fontSize: 16),
         titleLarge: TextStyle(color: Colors.white),

+ 52 - 9
lib/widgets/common/views/cpdf_main_tool_bar.dart

@@ -13,8 +13,41 @@ import '../../viewer/pdfbota/pdfthumbnail/cpdf_thumbnail_page.dart';
 ///  UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
 ///  This notice may not be removed from this file.
 
-class CPDFMainToolbar extends StatelessWidget {
+class CPDFSlidingMainToolbar extends CPDFMainToolbar {
+  final bool visible;
+
+  final AnimationController controller;
+
+  CPDFSlidingMainToolbar(
+      {super.key,
+      required this.visible,
+      required this.controller,
+      required super.ctrl,
+      super.isDark,
+      super.actions});
+
+  CPDFSlidingMainToolbar.normal(
+      {required this.visible,
+      required this.controller,
+      required super.ctrl,
+      super.isDark})
+      : super.normal();
 
+  @override
+  Widget build(BuildContext context) {
+    visible ? controller.reverse() : controller.forward();
+    return SlideTransition(
+        position: Tween(begin: Offset.zero, end: const Offset(0, -1)).animate(
+            CurvedAnimation(parent: controller, curve: Curves.fastOutSlowIn)),
+        child: visible ? super.build(context) : null);
+  }
+
+  // @override
+  // Size get preferredSize =>
+  //     visible ? super.preferredSize : Size(super.preferredSize.width, 0.0);
+}
+
+class CPDFMainToolbar extends StatelessWidget implements PreferredSizeWidget {
   final CPDFViewCtrl ctrl;
 
   List<CPDFActionWidget>? actions;
@@ -28,10 +61,17 @@ class CPDFMainToolbar extends StatelessWidget {
   CPDFMainToolbar.normal({Key? key, this.isDark = false, required this.ctrl})
       : super(key: key) {
     actions = [
-      CPDFActions.thumbnail(onPressed: (context) {
-        Navigator.push(context, MaterialPageRoute(builder: (_) {
-          return CPDFBotaPage(isDark: isDark, types: [],);
+      CPDFActions.thumbnail(onPressed: (context) async {
+        int? pageIndex = await Navigator.push(context, MaterialPageRoute(builder: (_) {
+          return CPDFBotaPage(
+            ctrl: ctrl,
+            isDark: isDark,
+            types: const [CPDFBotaType.thumbnails],
+          );
         }));
+        if (pageIndex != null) {
+          ctrl.setDisplayPageIndex(pageIndex);
+        }
       }),
       CPDFActions.search(),
       CPDFActions.bota(),
@@ -42,11 +82,11 @@ class CPDFMainToolbar extends StatelessWidget {
   @override
   Widget build(BuildContext context) {
     return Theme(
-        data: isDark ? comPDFKitDarkTheme : comPDFKitLightTheme.copyWith(
-          colorScheme: comPDFKitLightTheme.colorScheme.copyWith(
-            primary: const Color(0xFFFAFCFF)
-          )
-        ),
+        data: isDark
+            ? comPDFKitDarkTheme
+            : comPDFKitLightTheme.copyWith(
+                colorScheme: comPDFKitLightTheme.colorScheme
+                    .copyWith(primary: const Color(0xFFFAFCFF))),
         child: Builder(builder: (context) {
           return AppBar(
             leading: null,
@@ -72,6 +112,9 @@ class CPDFMainToolbar extends StatelessWidget {
           );
         }));
   }
+
+  @override
+  Size get preferredSize => const Size(double.infinity, 56);
 }
 
 class CPDFActions {

+ 2 - 3
lib/widgets/common/views/cpdf_tool_bar.dart

@@ -1,4 +1,3 @@
-
 import 'package:flutter/material.dart';
 
 ///  Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
@@ -21,6 +20,7 @@ class CPDFToolbar extends AppBar {
       super.actions,
       super.backgroundColor,
       this.leadingIcon,
+      super.bottom,
       this.onPressed})
       : super(
           leading: leadingIcon != null
@@ -33,8 +33,7 @@ class CPDFToolbar extends AppBar {
           elevation: 2,
           title: Text(titleText,
               style: const TextStyle(
-                  fontFamily: 'sans-serif-medium',
-                  fontSize: 22)),
+                  fontFamily: 'sans-serif-medium', fontSize: 22)),
           titleSpacing: titleText.isEmpty ? 15 : 0,
         );
 }

+ 98 - 0
lib/widgets/cpdf_readerview_page.dart

@@ -0,0 +1,98 @@
+import 'package:flutter/material.dart';
+
+import '../core/cpdf_view_ctrl.dart';
+import '../cpdf_configuration.dart';
+import '../theme/themes.dart';
+import 'common/pdfview/cpdf_page_indicator.dart';
+import 'common/pdfview/cpdf_page_slider_bar.dart';
+import 'common/pdfview/cpdf_reader_widget.dart';
+import 'common/slider/cpdf_slider_theme.dart';
+import 'common/views/cpdf_main_tool_bar.dart';
+
+///  Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
+///
+///  THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
+///  AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
+///  UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
+///  This notice may not be removed from this file.
+
+class CPDFReaderViewPage extends StatefulWidget {
+  final bool isDark;
+
+  const CPDFReaderViewPage({super.key, this.isDark = false});
+
+  @override
+  State<CPDFReaderViewPage> createState() => _CPDFReaderViewPageState();
+}
+
+class _CPDFReaderViewPageState extends State<CPDFReaderViewPage>
+    with SingleTickerProviderStateMixin {
+
+  CPDFViewCtrl? ctrl;
+
+  bool _isFullScreen = true;
+
+  late final AnimationController _controller;
+
+  @override
+  void initState() {
+    super.initState();
+    _controller = AnimationController(
+        vsync: this, duration: const Duration(milliseconds: 300));
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return MaterialApp(
+      theme: comPDFKitLightTheme,
+      darkTheme: comPDFKitDarkTheme,
+      themeMode: widget.isDark ? ThemeMode.dark : ThemeMode.light,
+      home: Scaffold(
+          body: Column(children: [
+            if(ctrl != null) ...{
+              CPDFSlidingMainToolbar.normal(
+                visible: _isFullScreen, controller: _controller,
+                  ctrl: ctrl!, isDark: widget.isDark)
+            },
+            Expanded(child: Stack(
+              alignment: Alignment.center,
+              children: [
+                CPDFReaderWidget(
+                  documentPath: "",
+                  configuration: CPDFConfiguration(),
+                  onComPDFKitWidgetCreate: (ctrl) {
+                    setState(() {
+                      this.ctrl = ctrl;
+                      setReaderViewCallback();
+                    });
+                  },
+                ),
+                if (ctrl != null) ...{
+                  Positioned(
+                      bottom: 20,
+                      child: CPDFPageIndicator(
+                        ctrl: ctrl!,
+                        isDark: widget.isDark,
+                      )),
+                  Positioned(
+                      right: 0,
+                      top: 0,
+                      bottom: 0,
+                      child: CPDFPageNavigationSliderBar(
+                          ctrl: ctrl!,
+                          position: CPDFSliderIndicatorPosition.right)),
+                },
+              ],
+            ))
+          ],)),
+    );
+  }
+
+  void setReaderViewCallback() {
+    ctrl!.onTapMainDocArea.stream.listen((event) {
+      setState(() {
+        _isFullScreen = !_isFullScreen;
+      });
+    });
+  }
+}

+ 63 - 34
lib/widgets/viewer/pdfbota/cpdf_bota_page.dart

@@ -1,7 +1,11 @@
+import 'package:compdfkit_flutter/common/util/Strings.dart';
+import 'package:compdfkit_flutter/core/cpdf_view_ctrl.dart';
 import 'package:compdfkit_flutter/theme/colors.dart';
 import 'package:compdfkit_flutter/theme/themes.dart';
+import 'package:compdfkit_flutter/widgets/viewer/pdfbota/pdfthumbnail/cpdf_thumbnail_page.dart';
 import 'package:flutter/material.dart';
 
+import '../../../core/document/cpdf_document.dart';
 import '../../common/views/cpdf_tool_bar.dart';
 
 ///  Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
@@ -11,60 +15,85 @@ import '../../common/views/cpdf_tool_bar.dart';
 ///  UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
 ///  This notice may not be removed from this file.
 
-enum CPDFBotaType{
-  thumbnails,
-  outline,
-  annotations,
-  bookmarks
-}
+enum CPDFBotaType { thumbnails, outline, annotations, bookmarks }
 
 class CPDFBotaPage extends StatefulWidget {
-
   final bool isDark;
 
   final List<CPDFBotaType> types;
 
-  const CPDFBotaPage({super.key, this.isDark = false, required this.types});
+  final CPDFViewCtrl ctrl;
+
+  const CPDFBotaPage(
+      {super.key,
+      required this.ctrl,
+      this.isDark = false,
+      required this.types});
 
   @override
   State<CPDFBotaPage> createState() => _CPDFBotaPageState();
 }
 
 class _CPDFBotaPageState extends State<CPDFBotaPage> {
-
   @override
   Widget build(BuildContext context) {
-    List<Widget> list = _pages();
-    return MaterialApp(
-      themeMode: widget.isDark ? ThemeMode.dark : ThemeMode.light,
-      theme: comPDFKitLightTheme.copyWith(
-        colorScheme: comPDFKitLightTheme.colorScheme.copyWith(
-          primary: CPDFColors.backgroundLight
-        )
-      ),
-      darkTheme: comPDFKitDarkTheme,
-      home: Builder(builder: (context){
-        return DefaultTabController(length: list.length, child: Scaffold(
-          appBar: CPDFToolbar(
-            leadingIcon: Icon(Icons.arrow_back,
-                color: Theme.of(context).colorScheme.onBackground),
-            titleText: 'Thumbnails',
-          ),
-        ));
-      }),
-    );
+    return Theme(
+        data: widget.isDark
+            ? comPDFKitDarkTheme
+            : comPDFKitLightTheme.copyWith(
+                colorScheme: comPDFKitLightTheme.colorScheme
+                    .copyWith(primary: CPDFColors.backgroundLight)),
+        child: DefaultTabController(
+            length: widget.types.length,
+            child: Scaffold(
+              appBar: CPDFToolbar(
+                bottom:
+                    widget.types.length > 1 ? TabBar(tabs: _tabItems()) : null,
+                leadingIcon: IconButton(
+                    onPressed: () {
+                      Navigator.pop(context);
+                    },
+                    icon: Icon(Icons.arrow_back,
+                        color: Theme.of(context).colorScheme.onBackground)),
+                titleText: Strings.Thumbnails,
+              ),
+              body: TabBarView(children: _pages()),
+            )));
   }
 
-  List<Widget> _pages(){
-    return widget.types.map((e) {
-      switch(e){
+  List<Widget> _tabItems() {
+    List<String> titles = widget.types.map((e) {
+      switch (e) {
         case CPDFBotaType.annotations:
-          return Text('Annotations');
+          return Strings.Annotations;
         case CPDFBotaType.bookmarks:
-          return Text('Bookmarks');
-        default: return Text('default');
+          return Strings.Bookmarks;
+        case CPDFBotaType.outline:
+          return Strings.Outlines;
+        default:
+          return Strings.Thumbnails;
       }
     }).toList();
+    return titles.map((e) => Tab(text: e)).toList();
   }
 
+  List<Widget> _pages() {
+    return widget.types.map((e) {
+      switch (e) {
+        case CPDFBotaType.thumbnails:
+          return CPDFThumbnailPage(
+            document: widget.ctrl.document,
+            currentPageIndex: widget.ctrl.currentPageIndex,
+          );
+        // case CPDFBotaType.annotations:
+        //   return Strings.Annotations;
+        // case CPDFBotaType.bookmarks:
+        //   return Strings.Bookmarks;
+        // case CPDFBotaType.outline:
+        //   return Strings.Outlines;
+        default:
+          return Text(e.name);
+      }
+    }).toList();
+  }
 }

+ 157 - 4
lib/widgets/viewer/pdfbota/pdfthumbnail/cpdf_thumbnail_page.dart

@@ -1,4 +1,6 @@
-import 'package:flutter/cupertino.dart';
+import 'dart:typed_data';
+
+import 'package:compdfkit_flutter/core/document/cpdf_document.dart';
 import 'package:flutter/material.dart';
 
 ///  Copyright © 2014-2023 PDF Technologies, Inc. All Rights Reserved.
@@ -8,12 +10,163 @@ import 'package:flutter/material.dart';
 ///  UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
 ///  This notice may not be removed from this file.
 
-class CPDFThumbnailPage extends StatelessWidget {
+class CPDFThumbnailPage extends StatefulWidget {
+  final CPDFDocument document;
+  final int currentPageIndex;
+
+  const CPDFThumbnailPage(
+      {Key? key, required this.document, required this.currentPageIndex})
+      : super(key: key);
+
+  @override
+  State<CPDFThumbnailPage> createState() => _CPDFThumbnailPageState();
+}
+
+class _CPDFThumbnailPageState extends State<CPDFThumbnailPage> {
+  final ScrollController _scrollController = ScrollController();
+
+  final GlobalKey globalKey = GlobalKey();
+
+  @override
+  void initState() {
+    super.initState();
+    // WidgetsBinding.instance.addPostFrameCallback((_) {
+    //   scrollToItem(widget.currentPageIndex);
+    // });
+  }
 
-  const CPDFThumbnailPage({Key? key}) : super(key: key);
+  @override
+  void dispose() {
+    super.dispose();
+    _scrollController.dispose();
+  }
 
   @override
   Widget build(BuildContext context) {
-    return Placeholder();
+    return FutureBuilder(
+        initialData: 0,
+        future: widget.document.getPageCount(),
+        builder: (context, snapshot) {
+          final size = MediaQuery.of(context).size;
+          final widgetWidth = size.width - 16;
+          return OrientationBuilder(builder: (context, orientation) {
+            int crossAxisCount =
+            orientation == Orientation.portrait ? 3 : 6;
+            return GridView.builder(
+                padding:  const EdgeInsets.symmetric(horizontal: 8),
+                key: globalKey,
+                controller: _scrollController,
+                gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
+                    crossAxisCount: crossAxisCount,
+                    mainAxisSpacing: 8,
+                    crossAxisSpacing: 8,
+                    childAspectRatio: 0.62),
+                itemCount: snapshot.data ?? 0,
+                itemBuilder: (context, index) => Padding(
+                  padding: const EdgeInsets.only(top: 8),
+                  child: _thumbnailItem(
+                      index, ((widgetWidth - 22) / crossAxisCount)),
+                ));
+          });
+        });
+  }
+
+  Widget _thumbnailItem(int index, double itemWidth) {
+    double aspectRatio = 0.30;
+    double itemHeight = itemWidth + (itemWidth * aspectRatio);
+    bool selected = widget.currentPageIndex == index;
+    return FutureBuilder(
+        future: widget.document.getPageSize(index),
+        builder: (context, snap) {
+          if (snap.connectionState == ConnectionState.done && snap.hasData) {
+            var size = snap.data!;
+            var imageWidth = itemWidth;
+            var imageHeight = (imageWidth / size[0]) * size[1];
+            if (imageHeight > itemHeight) {
+              imageHeight = itemHeight;
+              imageWidth = (imageHeight / size[1]) * size[0];
+            }
+            return Column(
+              mainAxisAlignment: MainAxisAlignment.center,
+              children: [
+                InkWell(
+                  child: FutureBuilder(
+                      future: widget.document.renderPageAtIndex(
+                          index, imageWidth.toInt(), imageHeight.toInt()),
+                      builder: (context, snapshot) {
+                        if (snapshot.connectionState == ConnectionState.done &&
+                            !snapshot.hasError) {
+                          Uint8List? imageData = snapshot.data;
+                          if (imageData != null) {
+                            return _imageItem(
+                                Image.memory(
+                                  imageData,
+                                ),
+                                selected,
+                                imageWidth,
+                                imageHeight);
+                          } else {
+                            return const Padding(padding: EdgeInsets.zero);
+                          }
+                        } else {
+                          return const Padding(padding: EdgeInsets.zero);
+                        }
+                      }),
+                  onTap: () {
+                    Navigator.pop(context, index);
+                  },
+                ),
+                _pageIndicator(index, selected)
+              ],
+            );
+          } else {
+            return const Padding(padding: EdgeInsets.zero);
+          }
+        });
+  }
+
+  Widget _imageItem(
+      Widget child, bool selected, double imageWidth, double imageHeight) {
+    return Container(
+      width: imageWidth,
+      height: imageHeight,
+      decoration: BoxDecoration(
+          border: Border.all(
+              color: selected
+                  ? Theme.of(context).colorScheme.primaryContainer
+                  : const Color(0xFFDDE9FF),
+              width: 2),
+          borderRadius: const BorderRadius.all(Radius.circular(2))),
+      child: child,
+    );
+  }
+
+  Widget _pageIndicator(int index, bool selected){
+    return Container(
+        margin: const EdgeInsets.only(top: 8),
+        decoration: BoxDecoration(
+            color: selected
+                ? Theme.of(context).colorScheme.primaryContainer
+                : Colors.transparent,
+            borderRadius:
+            const BorderRadius.all(Radius.circular(2))),
+        child: Padding(
+          padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 2),
+          child: Text(
+            (index + 1).toString(),
+            style: TextStyle(
+              fontSize: 12,
+                color: selected ? Colors.white : Colors.black),
+          ),
+        ));
+  }
+
+  // Function to scroll to a specific item in the GridView
+  void scrollToItem(int index) {
+    // _scrollController.animateTo(
+    //   offset,
+    //   duration: const Duration(milliseconds: 500),
+    //   curve: Curves.fastOutSlowIn,
+    // );
   }
 }

+ 253 - 5
pubspec.lock

@@ -1,6 +1,30 @@
 # Generated by pub
 # See https://dart.dev/tools/pub/glossary#lockfile
 packages:
+  _fe_analyzer_shared:
+    dependency: transitive
+    description:
+      name: _fe_analyzer_shared
+      sha256: ae92f5d747aee634b87f89d9946000c2de774be1d6ac3e58268224348cd0101a
+      url: "https://pub.dev"
+    source: hosted
+    version: "61.0.0"
+  analyzer:
+    dependency: transitive
+    description:
+      name: analyzer
+      sha256: ea3d8652bda62982addfd92fdc2d0214e5f82e43325104990d4f4c4a2a313562
+      url: "https://pub.dev"
+    source: hosted
+    version: "5.13.0"
+  args:
+    dependency: transitive
+    description:
+      name: args
+      sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.4.2"
   async:
     dependency: transitive
     description:
@@ -41,6 +65,30 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "1.17.1"
+  convert:
+    dependency: transitive
+    description:
+      name: convert
+      sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592"
+      url: "https://pub.dev"
+    source: hosted
+    version: "3.1.1"
+  coverage:
+    dependency: transitive
+    description:
+      name: coverage
+      sha256: "2fb815080e44a09b85e0f2ca8a820b15053982b2e714b59267719e8a9ff17097"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.6.3"
+  crypto:
+    dependency: transitive
+    description:
+      name: crypto
+      sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab
+      url: "https://pub.dev"
+    source: hosted
+    version: "3.0.3"
   fake_async:
     dependency: transitive
     description:
@@ -49,6 +97,14 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "1.3.1"
+  file:
+    dependency: transitive
+    description:
+      name: file
+      sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c"
+      url: "https://pub.dev"
+    source: hosted
+    version: "7.0.0"
   flutter:
     dependency: "direct main"
     description: flutter
@@ -67,14 +123,46 @@ packages:
     description: flutter
     source: sdk
     version: "0.0.0"
-  intl:
-    dependency: "direct main"
+  frontend_server_client:
+    dependency: transitive
+    description:
+      name: frontend_server_client
+      sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612"
+      url: "https://pub.dev"
+    source: hosted
+    version: "3.2.0"
+  glob:
+    dependency: transitive
+    description:
+      name: glob
+      sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.1.2"
+  http_multi_server:
+    dependency: transitive
+    description:
+      name: http_multi_server
+      sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b"
+      url: "https://pub.dev"
+    source: hosted
+    version: "3.2.1"
+  http_parser:
+    dependency: transitive
     description:
-      name: intl
-      sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d"
+      name: http_parser
+      sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b"
       url: "https://pub.dev"
     source: hosted
-    version: "0.18.1"
+    version: "4.0.2"
+  io:
+    dependency: transitive
+    description:
+      name: io
+      sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.0.4"
   js:
     dependency: transitive
     description:
@@ -91,6 +179,14 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "2.1.1"
+  logging:
+    dependency: transitive
+    description:
+      name: logging
+      sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.2.0"
   matcher:
     dependency: transitive
     description:
@@ -115,6 +211,30 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "1.9.1"
+  mime:
+    dependency: transitive
+    description:
+      name: mime
+      sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.0.4"
+  node_preamble:
+    dependency: transitive
+    description:
+      name: node_preamble
+      sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.0.2"
+  package_config:
+    dependency: transitive
+    description:
+      name: package_config
+      sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.1.0"
   path:
     dependency: transitive
     description:
@@ -131,11 +251,75 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "2.1.5"
+  pool:
+    dependency: transitive
+    description:
+      name: pool
+      sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.5.1"
+  pub_semver:
+    dependency: transitive
+    description:
+      name: pub_semver
+      sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.1.4"
+  shelf:
+    dependency: transitive
+    description:
+      name: shelf
+      sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.4.1"
+  shelf_packages_handler:
+    dependency: transitive
+    description:
+      name: shelf_packages_handler
+      sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e"
+      url: "https://pub.dev"
+    source: hosted
+    version: "3.0.2"
+  shelf_static:
+    dependency: transitive
+    description:
+      name: shelf_static
+      sha256: a41d3f53c4adf0f57480578c1d61d90342cd617de7fc8077b1304643c2d85c1e
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.1.2"
+  shelf_web_socket:
+    dependency: transitive
+    description:
+      name: shelf_web_socket
+      sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.0.4"
   sky_engine:
     dependency: transitive
     description: flutter
     source: sdk
     version: "0.0.99"
+  source_map_stack_trace:
+    dependency: transitive
+    description:
+      name: source_map_stack_trace
+      sha256: "84cf769ad83aa6bb61e0aa5a18e53aea683395f196a6f39c4c881fb90ed4f7ae"
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.1.1"
+  source_maps:
+    dependency: transitive
+    description:
+      name: source_maps
+      sha256: "708b3f6b97248e5781f493b765c3337db11c5d2c81c3094f10904bfa8004c703"
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.10.12"
   source_span:
     dependency: transitive
     description:
@@ -176,6 +360,14 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "1.2.1"
+  test:
+    dependency: "direct dev"
+    description:
+      name: test
+      sha256: "3dac9aecf2c3991d09b9cdde4f98ded7b30804a88a0d7e4e7e1678e78d6b97f4"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.24.1"
   test_api:
     dependency: transitive
     description:
@@ -184,6 +376,22 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "0.5.1"
+  test_core:
+    dependency: transitive
+    description:
+      name: test_core
+      sha256: "5138dbffb77b2289ecb12b81c11ba46036590b72a64a7a90d6ffb880f1a29e93"
+      url: "https://pub.dev"
+    source: hosted
+    version: "0.5.1"
+  typed_data:
+    dependency: transitive
+    description:
+      name: typed_data
+      sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.3.2"
   vector_math:
     dependency: transitive
     description:
@@ -192,6 +400,46 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "2.1.4"
+  vm_service:
+    dependency: transitive
+    description:
+      name: vm_service
+      sha256: "0fae432c85c4ea880b33b497d32824b97795b04cdaa74d270219572a1f50268d"
+      url: "https://pub.dev"
+    source: hosted
+    version: "11.9.0"
+  watcher:
+    dependency: transitive
+    description:
+      name: watcher
+      sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.1.0"
+  web_socket_channel:
+    dependency: transitive
+    description:
+      name: web_socket_channel
+      sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b
+      url: "https://pub.dev"
+    source: hosted
+    version: "2.4.0"
+  webkit_inspection_protocol:
+    dependency: transitive
+    description:
+      name: webkit_inspection_protocol
+      sha256: "67d3a8b6c79e1987d19d848b0892e582dbb0c66c57cc1fef58a177dd2aa2823d"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.2.0"
+  yaml:
+    dependency: transitive
+    description:
+      name: yaml
+      sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5"
+      url: "https://pub.dev"
+    source: hosted
+    version: "3.1.2"
 sdks:
   dart: ">=3.0.5 <4.0.0"
   flutter: ">=3.3.0"

+ 3 - 2
pubspec.yaml

@@ -11,12 +11,12 @@ dependencies:
   flutter:
     sdk: flutter
   plugin_platform_interface: ^2.0.2
-  intl: ^0.18.0
 
 dev_dependencies:
   flutter_test:
     sdk: flutter
   flutter_lints: ^2.0.0
+  test: ^1.24.1
 
 
 flutter:
@@ -30,4 +30,5 @@ flutter:
         pluginClass: CompdfkitFlutterPlugin
 
   assets:
-    - assets/images/
+    - assets/images/
+    - testFiles/

+ 13 - 0
test/cpdf_document_test.dart

@@ -0,0 +1,13 @@
+
+import 'dart:io';
+
+import 'package:compdfkit_flutter/compdfkit.dart';
+import 'package:compdfkit_flutter/core/document/cpdf_document.dart';
+import 'package:compdfkit_flutter/core/document/cpdf_document_error.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+import 'package:test/test.dart';
+
+void main(){
+
+}