ソースを参照

ComPDFKit(flutter) - controller新增交互方法

liuxiaolong 8 ヶ月 前
コミット
c20e32eb51

+ 4 - 1
CHANGELOG.md

@@ -2,9 +2,12 @@
 * Added the features support for ComPDFKit PDF SDK for iOS V2.1.0.
 * Added the features support for ComPDFKit PDF SDK for Android V2.1.0.
 * Added annotation reply functionality.
-*  Optimized text aggregation logic for content editing.
+* Optimized text aggregation logic for content editing.
 * Added font subsetting.
+* Added screenshot feature.
 * Android platform adaptation for **Laban Key Keyboard**.
+* Fixed an issue with the Ink annotation color display on Android.
+* `CPDFReaderWidgetController.dart` adds widget control methods.
 
 
 ## 2.0.2

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

@@ -62,7 +62,7 @@ public class CPDFConstants {
 
     public static final String IS_VERTICAL_MODE = "is_vertical_mode";
 
-    public static final String SET_PAGE_SPACING = "set_page_spacing";
+    public static final String SET_MARGIN = "set_margin";
 
     public static final String SET_CONTINUE_MODE = "set_continue_mode";
 
@@ -92,6 +92,8 @@ public class CPDFConstants {
 
     public static final String GET_PAGE_SIZE = "get_page_size";
 
+    public static final String HAS_CHANGE = "has_change";
+
   }
 
 }

+ 34 - 20
android/src/main/java/com/compdfkit/flutter/compdfkit_flutter/plugin/CPDFViewCtrlPlugin.java

@@ -11,9 +11,9 @@
 package com.compdfkit.flutter.compdfkit_flutter.plugin;
 
 import static com.compdfkit.flutter.compdfkit_flutter.constants.CPDFConstants.ChannelMethod.GET_CURRENT_PAGE_INDEX;
-import static com.compdfkit.flutter.compdfkit_flutter.constants.CPDFConstants.ChannelMethod.GET_PAGE_SIZE;
 import static com.compdfkit.flutter.compdfkit_flutter.constants.CPDFConstants.ChannelMethod.GET_READ_BACKGROUND_COLOR;
 import static com.compdfkit.flutter.compdfkit_flutter.constants.CPDFConstants.ChannelMethod.GET_SCALE;
+import static com.compdfkit.flutter.compdfkit_flutter.constants.CPDFConstants.ChannelMethod.HAS_CHANGE;
 import static com.compdfkit.flutter.compdfkit_flutter.constants.CPDFConstants.ChannelMethod.IS_CONTINUE_MODE;
 import static com.compdfkit.flutter.compdfkit_flutter.constants.CPDFConstants.ChannelMethod.IS_COVER_PAGE_MODE;
 import static com.compdfkit.flutter.compdfkit_flutter.constants.CPDFConstants.ChannelMethod.IS_CROP_MODE;
@@ -32,8 +32,8 @@ import static com.compdfkit.flutter.compdfkit_flutter.constants.CPDFConstants.Ch
 import static com.compdfkit.flutter.compdfkit_flutter.constants.CPDFConstants.ChannelMethod.SET_FIXED_SCROLL;
 import static com.compdfkit.flutter.compdfkit_flutter.constants.CPDFConstants.ChannelMethod.SET_FORM_FIELD_HIGHLIGHT;
 import static com.compdfkit.flutter.compdfkit_flutter.constants.CPDFConstants.ChannelMethod.SET_LINK_HIGHLIGHT;
+import static com.compdfkit.flutter.compdfkit_flutter.constants.CPDFConstants.ChannelMethod.SET_MARGIN;
 import static com.compdfkit.flutter.compdfkit_flutter.constants.CPDFConstants.ChannelMethod.SET_PAGE_SAME_WIDTH;
-import static com.compdfkit.flutter.compdfkit_flutter.constants.CPDFConstants.ChannelMethod.SET_PAGE_SPACING;
 import static com.compdfkit.flutter.compdfkit_flutter.constants.CPDFConstants.ChannelMethod.SET_READ_BACKGROUND_COLOR;
 import static com.compdfkit.flutter.compdfkit_flutter.constants.CPDFConstants.ChannelMethod.SET_SCALE;
 import static com.compdfkit.flutter.compdfkit_flutter.constants.CPDFConstants.ChannelMethod.SET_VERTICAL_MODE;
@@ -45,6 +45,7 @@ import android.util.Log;
 
 import androidx.annotation.NonNull;
 
+import com.compdfkit.core.document.CPDFDocument;
 import com.compdfkit.tools.common.pdf.CPDFDocumentFragment;
 
 import com.compdfkit.tools.common.utils.viewutils.CViewUtils;
@@ -103,10 +104,10 @@ public class CPDFViewCtrlPlugin extends BaseMethodChannelPlugin {
       case GET_SCALE:
         result.success((double) readerView.getScale());
         break;
-//      case SET_CAN_SCALE:
-//        boolean canScale = (boolean) call.arguments;
-//        readerView.setCanScale(canScale);
-//        break;
+      case SET_CAN_SCALE:
+        boolean canScale = (boolean) call.arguments;
+        readerView.setCanScale(canScale);
+        break;
       case SET_READ_BACKGROUND_COLOR:
         String colorHex = (String) call.arguments;
         readerView.setReadBackgroundColor(Color.parseColor(colorHex));
@@ -130,8 +131,16 @@ public class CPDFViewCtrlPlugin extends BaseMethodChannelPlugin {
       case IS_LINK_HIGHLIGHT:
         result.success(readerView.isLinkHighlight());
         break;
-      case SET_PAGE_SPACING:
-        readerView.setPageSpacing((Integer) call.arguments);
+      case SET_MARGIN:
+        int left = call.argument("left");
+        int top = call.argument("top");
+        int right = call.argument("right");
+        int bottom = call.argument("bottom");
+        readerView.setFixReaderViewHorizontalMargin(true);
+        readerView.setReaderViewHorizontalMargin(left);
+        readerView.setReaderViewTopMargin(top);
+        readerView.setReaderViewBottomMargin(bottom);
+        readerView.setPageSpacing(top);
         readerView.reloadPages();
         break;
       case SET_VERTICAL_MODE:
@@ -166,24 +175,29 @@ public class CPDFViewCtrlPlugin extends BaseMethodChannelPlugin {
       case GET_CURRENT_PAGE_INDEX:
         result.success(readerView.getPageNum());
         break;
-//      case SET_PAGE_SAME_WIDTH:
-//        readerView.setPageSameWidth((Boolean) call.arguments);
-//        readerView.reloadPages();
-//        break;
+      case SET_PAGE_SAME_WIDTH:
+        Log.e("ComPDFKit", "setPageSameWidth:" + call.arguments);
+        readerView.setPageSameWidth((Boolean) call.arguments);
+        readerView.reloadPages();
+        break;
       case SET_COVER_PAGE_MODE:
-        readerView.setDoublePageMode(true);
+        readerView.setDoublePageMode((Boolean) call.arguments);
         readerView.setCoverPageMode((Boolean) call.arguments);
         break;
       case IS_COVER_PAGE_MODE:
         result.success(readerView.isCoverPageMode());
         break;
-//      case IS_PAGE_IN_SCREEN:
-//        int pageIndex1 = (int) call.arguments;
-//        result.success(readerView.isPageInScreen(pageIndex1));
-//        break;
-//      case SET_FIXED_SCROLL:
-//        readerView.setFixedScroll((Boolean) call.arguments);
-//        break;
+      case IS_PAGE_IN_SCREEN:
+        int pageIndex1 = (int) call.arguments;
+        result.success(readerView.isPageInScreen(pageIndex1));
+        break;
+      case SET_FIXED_SCROLL:
+        readerView.setFixedScroll((Boolean) call.arguments);
+        break;
+      case HAS_CHANGE:
+        CPDFDocument document = readerView.getPDFDocument();
+        result.success(document.hasChanges());
+        break;
 //      case GET_PAGE_SIZE:
 //        boolean noZoomPage = call.argument("noZoom");
 //        int page = call.argument("pageIndex");

+ 0 - 109
android/src/main/res/layout/pdf_sample_activity.xml

@@ -1,109 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    tools:context=".pdf.CPDFDocumentActivity">
-
-    <com.compdfkit.tools.common.views.pdfview.CPDFViewCtrl
-        android:id="@+id/pdf_view"
-        android:layout_width="match_parent"
-        android:layout_height="0dp"
-        app:layout_constrainedHeight="true"
-        app:layout_constraintBottom_toTopOf="@id/fl_bottom_tool_bar"
-        app:layout_constraintTop_toBottomOf="@id/fl_tool"
-        app:tools_enable_page_indicator="true"
-        app:tools_enable_slider_bar="true"
-        app:tools_page_indicator_margin_bottom="20dp"
-        app:tools_slider_bar_icon="@drawable/tools_ic_pdf_slider_bar"
-        app:tools_slider_bar_position="right" />
-
-    <FrameLayout
-        android:id="@+id/fl_tool"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:background="@color/tools_color_primary"
-        android:elevation="4dp"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent">
-
-        <com.compdfkit.tools.common.views.CPDFToolBar
-            android:id="@+id/pdf_tool_bar"
-            android:layout_width="match_parent"
-            android:layout_height="?android:attr/actionBarSize"
-            android:elevation="4dp"
-            android:title="@string/tools_pdf_viewer_mode"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toTopOf="parent" />
-
-        <com.compdfkit.tools.viewer.pdfsearch.CSearchToolbar
-            android:id="@+id/pdf_search_tool_bar"
-            android:layout_width="match_parent"
-            android:layout_height="?android:attr/actionBarSize"
-            android:visibility="gone"
-            app:layout_constraintEnd_toEndOf="parent"
-            app:layout_constraintStart_toStartOf="parent"
-            app:layout_constraintTop_toTopOf="parent" />
-
-    </FrameLayout>
-
-    <com.compdfkit.tools.annotation.pdfproperties.pdflnk.CInkCtrlView
-        android:id="@+id/ink_ctrl_view"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_marginHorizontal="16dp"
-        android:visibility="gone"
-        app:layout_constraintTop_toBottomOf="@id/fl_tool" />
-
-    <com.compdfkit.tools.signature.verify.CVerifySignStatusView
-        android:id="@+id/sign_status_view"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toBottomOf="@id/fl_tool"
-        android:visibility="gone"
-        tools:visibility="visible"
-        app:status="valid" />
-
-    <FrameLayout
-        android:id="@+id/fl_bottom_tool_bar"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        app:layout_constraintBottom_toBottomOf="parent"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent">
-
-        <com.compdfkit.tools.annotation.pdfannotationbar.CAnnotationToolbar
-            android:id="@+id/annotation_tool_bar"
-            android:layout_width="match_parent"
-            android:layout_height="?android:attr/actionBarSize"
-            />
-
-        <com.compdfkit.tools.contenteditor.CEditToolbar
-            android:id="@+id/edit_tool_bar"
-            android:layout_width="match_parent"
-            android:layout_height="?android:attr/actionBarSize"
-            />
-
-        <com.compdfkit.tools.forms.pdfformbar.CFormToolbar
-            android:id="@+id/form_tool_bar"
-            android:layout_width="match_parent"
-            android:layout_height="?android:attr/actionBarSize"
-            android:visibility="gone"
-            />
-
-        <com.compdfkit.tools.signature.CSignatureToolBar
-            android:id="@+id/signature_tool_bar"
-            android:layout_width="match_parent"
-            android:visibility="gone"
-            android:layout_height="?android:attr/actionBarSize"
-            app:layout_constraintBottom_toBottomOf="parent" />
-
-    </FrameLayout>
-
-
-</androidx.constraintlayout.widget.ConstraintLayout>

+ 0 - 6
android/src/main/res/values/strings.xml

@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-
-    <string name="app_permission_storage">申请SD卡读写权限</string>
-
-</resources>

+ 64 - 48
example/lib/cpdf_reader_widget_example_fun_test.dart

@@ -5,25 +5,28 @@
 // UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
 // This notice may not be removed from this file.
 
+import 'dart:io';
 import 'dart:math';
 
 import 'package:compdfkit_flutter/configuration/cpdf_configuration.dart';
+import 'package:compdfkit_flutter/configuration/cpdf_options.dart';
 import 'package:compdfkit_flutter/widgets/cpdf_reader_widget.dart';
 import 'package:compdfkit_flutter/widgets/cpdf_reader_widget_controller.dart';
 import 'package:flutter/material.dart';
 
-class CPDFReaderWidgetFunTestExample extends StatefulWidget {
+class CPDFReaderWidgetControllerExample extends StatefulWidget {
   final String documentPath;
 
-  const CPDFReaderWidgetFunTestExample({super.key, required this.documentPath});
+  const CPDFReaderWidgetControllerExample({super.key, required this.documentPath});
 
   @override
-  State<CPDFReaderWidgetFunTestExample> createState() =>
-      _CPDFReaderWidgetFunTestExampleState();
+  State<CPDFReaderWidgetControllerExample> createState() =>
+      _CPDFReaderWidgetControllerExampleState();
 }
 
-class _CPDFReaderWidgetFunTestExampleState
-    extends State<CPDFReaderWidgetFunTestExample> {
+class _CPDFReaderWidgetControllerExampleState
+    extends State<CPDFReaderWidgetControllerExample> {
+
   CPDFReaderWidgetController? _controller;
 
   bool canScale = true;
@@ -51,14 +54,16 @@ class _CPDFReaderWidgetFunTestExampleState
                     handleClick(value, _controller!);
                   }, itemBuilder: (context) {
                     return actions
-                        .map((e) => PopupMenuItem(child: Text(e), value: e))
+                        .map((e) => PopupMenuItem(value: e, child: Text(e)))
                         .toList();
                   })
                 ],
         ),
         body: CPDFReaderWidget(
           document: widget.documentPath,
-          configuration: CPDFConfiguration(),
+          configuration: CPDFConfiguration(toolbarConfig: const CPDFToolbarConfig(
+            iosLeftBarAvailableActions: [CPDFToolbarAction.thumbnail]
+          )),
           onCreated: (controller) {
             setState(() {
               _controller = controller;
@@ -72,77 +77,83 @@ class _CPDFReaderWidgetFunTestExampleState
     debugPrint('ComPDFKit-Flutter: saveResult:$saveResult');
   }
 
-  void handleClick(String value, CPDFReaderWidgetController _controller) async {
+  void handleClick(String value, CPDFReaderWidgetController controller) async {
     switch (value) {
       case 'setScale':
-        _controller.setScale(1.5);
+        controller.setScale(1.5);
         break;
       case 'getScale':
-        double scaleValue = await _controller.getScale();
+        double scaleValue = await controller.getScale();
         debugPrint('ComPDFKit:CPDFReaderWidget-getScale():$scaleValue');
         break;
-      case 'setReadBgColor':
-        await _controller.setReadBackgroundColor(randomColor());
-        break;
-      case 'getReadBgColor':
-        Color color = await _controller.getReadBackgroundColor();
-        debugPrint('ComPDFKit:getReadBgColor:${color.toString()}');
+      case 'setCanScale':
+        canScale = !canScale;
+        await controller.setCanScale(canScale);
         break;
       case 'setFormHighlight':
-        bool isFormFieldHighlight = await _controller.isFormFieldHighlight();
+        bool isFormFieldHighlight = await controller.isFormFieldHighlight();
         debugPrint('ComPDFKit:isFormFieldHighlight:$isFormFieldHighlight');
-        _controller.setFormFieldHighlight(!isFormFieldHighlight);
+        controller.setFormFieldHighlight(!isFormFieldHighlight);
         break;
       case 'setLinkHighlight':
-        bool isLinkHighlight = await _controller.isLinkHighlight();
+        bool isLinkHighlight = await controller.isLinkHighlight();
         debugPrint('ComPDFKit:isLinkHighlight:$isLinkHighlight');
-        _controller.setLinkHighlight(!isLinkHighlight);
+        controller.setLinkHighlight(!isLinkHighlight);
         break;
       case 'setVerticalMode':
-        bool isVerticalMode = await _controller.isVerticalMode();
+        bool isVerticalMode = await controller.isVerticalMode();
         debugPrint('ComPDFKit:isVerticalMode:$isVerticalMode');
-        _controller.setVerticalMode(!isVerticalMode);
+        controller.setVerticalMode(!isVerticalMode);
         break;
-      case 'setPageSpacing':
+      case 'setMargin':
         final Random random = Random();
         int value = random.nextInt(50);
-        debugPrint('ComPDFKit:setPageSpacing:$value');
-        _controller.setPageSpacing(
-          left: 10,
-          top: 10,
-          right: 10,
-          bottom : 10
-        );
+        debugPrint('ComPDFKit:setMargin:$value');
+        controller.setMargins(const CPDFEdgeInsets.symmetric(horizontal: 100, vertical: 10));
         break;
       case 'setContinueMode':
-        bool isContinueMode = await _controller.isContinueMode();
+        bool isContinueMode = await controller.isContinueMode();
         debugPrint('ComPDFKit:isContinueMode:$isContinueMode');
-        _controller.setContinueMode(!isContinueMode);
+        controller.setContinueMode(!isContinueMode);
         break;
       case 'setDoublePageMode':
-        bool isDoublePageMode = await _controller.isDoublePageMode();
+        bool isDoublePageMode = await controller.isDoublePageMode();
         debugPrint('ComPDFKit:isDoublePageMode:$isDoublePageMode');
-        _controller.setDoublePageMode(!isDoublePageMode);
+        controller.setDoublePageMode(!isDoublePageMode);
         break;
       case 'setCropMode':
-        bool isCropMode = await _controller.isCropMode();
+        bool isCropMode = await controller.isCropMode();
         debugPrint('ComPDFKit:isCropMode:$isCropMode');
-        _controller.setCropMode(!isCropMode);
+        controller.setCropMode(!isCropMode);
         break;
       case 'setDisplayPageIndex':
-        int nextPageIndex = await _controller.getCurrentPageIndex() + 1;
-        _controller.setDisplayPageIndex(nextPageIndex, animated: false);
+        int nextPageIndex = await controller.getCurrentPageIndex() + 1;
+        controller.setDisplayPageIndex(nextPageIndex, animated: false);
         break;
       case 'getCurrentPageIndex':
-        debugPrint(
-            'ComPDFKit:getCurrentPageIndex:${await _controller.getCurrentPageIndex()}');
+        debugPrint('ComPDFKit:getCurrentPageIndex:${await controller.getCurrentPageIndex()}');
         break;
       case 'setCoverPageMode':
-        bool isCoverPageMode = await _controller.isCoverPageMode();
+        bool isCoverPageMode = await controller.isCoverPageMode();
         debugPrint('ComPDFKit:isCoverPageMode:$isCoverPageMode');
-        _controller.setCoverPageMode(!isCoverPageMode);
+        controller.setCoverPageMode(!isCoverPageMode);
+        break;
+      case 'pageSameWidth':
+        pageSameWidth = !pageSameWidth;
+        await controller.setPageSameWidth(pageSameWidth);
+        break;
+      case 'isPageInScreen':
+        bool isPageInScreen = await controller.isPageInScreen(0);
+        debugPrint('ComPDFKit:first page is in screen:$isPageInScreen');
+        break;
+      case 'setFixedScroll':
+        isFixedScroll = !isFixedScroll;
+        await controller.setFixedScroll(isFixedScroll);
+        break;
+      case 'isChanged':
+        bool hasChange = await controller.hasChange();
+        debugPrint('ComPDFKit:hasChange:$hasChange');
         break;
-      default:break;
     }
   }
 }
@@ -150,18 +161,23 @@ class _CPDFReaderWidgetFunTestExampleState
 var actions = [
   'setScale',
   'getScale',
-  'setReadBgColor',
-  'getReadBgColor',
+  if(Platform.isAndroid) ...[
+    'setCanScale',
+    'pageSameWidth',
+    'isPageInScreen',
+    'setFixedScroll'
+  ],
   'setFormHighlight',
   'setLinkHighlight',
   'setVerticalMode',
-  'setPageSpacing',
+  'setMargin',
   'setContinueMode',
   'setDoublePageMode',
   'setCropMode',
   'setDisplayPageIndex',
   'getCurrentPageIndex',
-  'setCoverPageMode'
+  'setCoverPageMode',
+  'isChanged'
 ];
 
 Color randomColor() {

+ 3 - 25
example/lib/cpdf_reader_widget_example.dart

@@ -6,6 +6,7 @@
 // This notice may not be removed from this file.
 
 import 'package:compdfkit_flutter/configuration/cpdf_configuration.dart';
+import 'package:compdfkit_flutter/configuration/cpdf_options.dart';
 import 'package:compdfkit_flutter/widgets/cpdf_reader_widget.dart';
 import 'package:compdfkit_flutter/widgets/cpdf_reader_widget_controller.dart';
 import 'package:flutter/material.dart';
@@ -39,8 +40,8 @@ class _CPDFReaderWidgetExampleState extends State<CPDFReaderWidgetExample> {
         body: CPDFReaderWidget(
           document: widget.documentPath,
           configuration: CPDFConfiguration(
-            toolbarConfig: const ToolbarConfig(
-                iosLeftBarAvailableActions: [ToolbarAction.thumbnail],
+            toolbarConfig: const CPDFToolbarConfig(
+                iosLeftBarAvailableActions: [CPDFToolbarAction.thumbnail],
             )
           ),
           onCreated: (controller) {
@@ -55,27 +56,4 @@ class _CPDFReaderWidgetExampleState extends State<CPDFReaderWidgetExample> {
     bool saveResult = await _controller.save();
     debugPrint('ComPDFKit-Flutter: saveResult:$saveResult');
   }
-
-  Widget _wid() {
-    return Scaffold(
-        resizeToAvoidBottomInset: false,
-        appBar: AppBar(
-          title: const Text('CPDFReaderWidget Example'),
-          leading: IconButton(
-              onPressed: () {
-                _save();
-                Navigator.pop(context);
-              },
-              icon: const Icon(Icons.arrow_back)),
-        ),
-        body: CPDFReaderWidget(
-          document: widget.documentPath,
-          configuration: CPDFConfiguration(),
-          onCreated: (controller) {
-            setState(() {
-              _controller = controller;
-            });
-          },
-        ));
-  }
 }

+ 24 - 18
example/lib/examples.dart

@@ -13,8 +13,8 @@ import 'dart:io';
 
 import 'package:compdfkit_flutter/compdfkit.dart';
 import 'package:compdfkit_flutter/configuration/cpdf_configuration.dart';
+import 'package:compdfkit_flutter_example/cpdf_reader_widget_controller_example.dart';
 import 'package:compdfkit_flutter_example/cpdf_reader_widget_dark_theme_example.dart';
-import 'package:compdfkit_flutter_example/cpdf_reader_widget_example_fun_test.dart';
 import 'package:compdfkit_flutter_example/utils/file_util.dart';
 import 'package:file_picker/file_picker.dart';
 import 'package:flutter/material.dart';
@@ -24,30 +24,36 @@ import 'widgets/cpdf_fun_item.dart';
 const String _documentPath = 'pdfs/PDF_Document.pdf';
 
 List<Widget> examples(BuildContext context) => [
-  Text(
-    'Modal View Examples',
-    style: Theme.of(context).textTheme.bodyMedium,
-  ),
-  FeatureItem(
-      title: 'Basic Example',
-      description: 'Open sample pdf document',
-      onTap: () => showDocument(context)),
-  FeatureItem(
-      title: 'Select External Files',
-      description: 'Select pdf document from system file manager',
-      onTap: () => pickDocument()),
+  Padding(padding: const EdgeInsets.only(top: 8, bottom: 8), child: Text(
+    'Widget Examples',
+    style: Theme.of(context).textTheme.bodyLarge?.copyWith(fontWeight: FontWeight.w500),
+  )),
   FeatureItem(
       title: 'Show CPDFReaderWidget',
       description: 'Display PDF view in flutter widget',
       onTap: () => showCPDFReaderWidget(context)),
   if (Platform.isAndroid) ...[
-    FeatureItem(title: 'Dark Theme',
+    FeatureItem(title: 'CPDFReaderWidget Dark Theme',
         description: 'Opens a document in night mode with a custom dark theme',
         onTap: () => showDarkThemeCPDFReaderWidget(context))
   ],
-  FeatureItem(title: 'Widget Controller Test',
-      description: 'CPDFReaderWidget Controller fun test',
-      onTap: () => showCPDFReaderWidgetTest(context))
+  FeatureItem(title: 'Widget Controller Examples',
+      description: 'CPDFReaderWidget Controller fun example',
+      onTap: () => showCPDFReaderWidgetTest(context)),
+
+  Padding(padding: const EdgeInsets.only(top: 8, bottom: 8), child: Text(
+    'Modal View Examples',
+    style: Theme.of(context).textTheme.bodyLarge?.copyWith(fontWeight: FontWeight.w500),
+  )),
+
+  FeatureItem(
+      title: 'Basic Example',
+      description: 'Open sample pdf document',
+      onTap: () => showDocument(context)),
+  FeatureItem(
+      title: 'Select External Files',
+      description: 'Select pdf document from system file manager',
+      onTap: () => pickDocument())
 ];
 
 
@@ -80,7 +86,7 @@ void showDarkThemeCPDFReaderWidget(context) async {
 
 void showCPDFReaderWidgetTest(context) async {
   File document = await extractAsset(context, _documentPath, shouldOverwrite: false);
-  goTo(CPDFReaderWidgetFunTestExample(documentPath: document.path), context);
+  goTo(CPDFReaderWidgetControllerExample(documentPath: document.path), context);
 }
 
 void goTo(Widget widget, BuildContext context) =>

+ 2 - 0
example/lib/page/settings_page.dart

@@ -4,6 +4,8 @@
 // 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.
+import 'dart:io';
+
 import 'package:compdfkit_flutter/compdfkit.dart';
 import 'package:flutter/gestures.dart';
 import 'package:flutter/material.dart';

+ 1 - 1
ios/Classes/CompdfkitFlutterPlugin.swift

@@ -30,7 +30,7 @@ public class CompdfkitFlutterPlugin: NSObject, FlutterPlugin, CPDFViewBaseContro
             }
         case "sdk_build_tag":
             result("iOS build tag:\(CPDFKit.sharedInstance().buildNumber)")
-        case "openDocument":
+        case "open_document":
             let initInfo = call.arguments as? [String: Any]
             let jsonString = initInfo?["configuration"] ?? ""
             _ = initInfo?["password"] ?? ""

+ 7 - 21
ios/Classes/reader/CPDFViewCtrlPlugin.swift

@@ -66,26 +66,6 @@ class CPDFViewCtrlPlugin {
                     return
                 }
                 result(pdfListView.scaleFactor)
-            case "set_read_background_color":
-                guard let pdfListView = self.pdfViewController.pdfListView else {
-                    return
-                }
-                // 暂未完成----
-                // hex color, for example: '#FFFFFF'
-                // 需要设置给PDFListView
-                let bgColor = call.arguments as! String
-                let color = ColorHelper.colorWithHexString(hex: bgColor)
-                print("bgColor:\(bgColor), color:\(color.description)")
-//                pdfListView.displayModeCustomColor = CPDFDisplayModeCustom()
-//                pdfListView.layoutDocumentView()
-            case "get_read_background_color":
-                guard let pdfListView = self.pdfViewController.pdfListView else {
-                    result("#FFFFFF")
-                    return
-                }
-                // 暂未完成----
-                // 需要返回Hex 颜色给Flutter, 例如:'#FFFFFF'
-//                result(pdfListView.displayModeCustomColor.toHexString())
             case "set_form_field_highlight":
                 guard let pdfListView = self.pdfViewController.pdfListView else {
                     return
@@ -117,7 +97,7 @@ class CPDFViewCtrlPlugin {
                     return
                 }
                 result(pdfListView.displayDirection == .vertical)
-            case "set_page_spacing":
+            case "set_margin":
                 guard let pdfListView = self.pdfViewController.pdfListView else {
                     return
                 }
@@ -198,6 +178,12 @@ class CPDFViewCtrlPlugin {
                     return
                 }
                 result(pdfListView.currentPageIndex)
+            case "has_change":
+                guard let pdfListView = self.pdfViewController.pdfListView else {
+                    result(false)
+                    return
+                }
+                result(pdfListView.document.isModified())
             default:
                 result(FlutterMethodNotImplemented)
             }

+ 1 - 1
lib/compdfkit.dart

@@ -71,7 +71,7 @@ class ComPDFKit {
   /// ```
   static void openDocument(String document,
       {String? password, CPDFConfiguration? configuration}) async {
-    await _methodChannel.invokeMethod('openDocument', <String, dynamic>{
+    await _methodChannel.invokeMethod('open_document', <String, dynamic>{
       'document': document,
       'password': password,
       'configuration': configuration?.toJson()

+ 1 - 1
lib/configuration/attributes/cpdf_annot_attr.dart

@@ -356,7 +356,7 @@ class CPDFRadioButtonAttr extends CPDFCheckBoxAttr {
       super.borderWidth = 2,
       super.checkedColor = const Color(0xFF43474D),
       super.isChecked = false,
-      super.checkedStyle = CPDFCheckStyle.check});
+      super.checkedStyle = CPDFCheckStyle.circle});
 }
 
 class CPDFListBoxAttr extends CPDFAnnotAttrBase {

+ 1 - 0
lib/configuration/cpdf_configuration.dart

@@ -140,6 +140,7 @@ class CPDFToolbarConfig {
         CPDFToolbarMenuAction.save,
         CPDFToolbarMenuAction.share,
         CPDFToolbarMenuAction.openDocument,
+        CPDFToolbarMenuAction.snip
       ]});
 
   Map<String, dynamic> toJson() => {

+ 45 - 3
lib/configuration/cpdf_options.dart

@@ -119,7 +119,49 @@ enum CPDFFormType {
 
 enum CPDFCheckStyle { check, circle, cross, diamond, square, star }
 
-
-enum CPDFThemeMode {
-  light, dark, system
+enum CPDFThemeMode { light, dark, system }
+
+/// The [CPDFEdgeInsets] is used to set the padding of the PDF document.
+///
+/// [Android] can only set horizontal margins, [top] and [bottom] margins.
+/// Horizontal spacing cannot be set independently.
+/// The horizontal spacing value is set using the [left] attribute,
+/// the spacing between two pages is the same as the top spacing.
+///
+/// The [iOS] platform can set the [top], [bottom], [left] and [right] margins,
+/// and the spacing between two pages is the same as the top spacing.
+class CPDFEdgeInsets {
+  final int left;
+
+  final int top;
+
+  final int right;
+
+  final int bottom;
+
+  const CPDFEdgeInsets.all(int value)
+      : left = value,
+        top = value,
+        right = value,
+        bottom = value;
+
+  const CPDFEdgeInsets.symmetric(
+      {required int horizontal, required int vertical})
+      : left = horizontal,
+        top = vertical,
+        right = horizontal,
+        bottom = vertical;
+
+  const CPDFEdgeInsets.only(
+      {required this.left,
+      required this.top,
+      required this.right,
+      required this.bottom});
+
+  Map<String, dynamic> toJson() => {
+        'left': left,
+        'top': top,
+        'right': right,
+        'bottom': bottom,
+      };
 }

+ 20 - 12
lib/document/cpdf_document.dart

@@ -6,19 +6,27 @@
 // This notice may not be removed from this file.
 
 
-import 'package:flutter/services.dart';
-
-import 'cpdf_info.dart';
 
+/// A class to handle PDF documents without using [CPDFReaderWidget]
+///
+/// example:
+/// ```dart
+/// var document = CPDFDocument();
+/// document.open('pdf file path', 'password');
+///
+/// /// get pdf document info.
+/// var info = await document.getInfo();
+///
+/// /// get pdf document file name.
+/// var fileName = await document.getFileName();
+/// ```
 class CPDFDocument {
-
-  final MethodChannel _channel;
-
-  CPDFDocument(this._channel);
-
-
-  Future<void> getInfo() async {
-
-  }
+  // late MethodChannel _channel;
+  //
+  // bool _isValid = false;
+  //
+  // CPDFDocument.withController(int viewId)
+  //     : _channel = MethodChannel('com.compdfkit.flutter.document_$viewId'),
+  //       _isValid = true;
 
 }

+ 0 - 14
lib/document/cpdf_info.dart

@@ -1,14 +0,0 @@
-// Copyright © 2014-2024 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 CPDFInfo {
-
-  
-}

+ 69 - 28
lib/widgets/cpdf_reader_widget_controller.dart

@@ -6,13 +6,9 @@
 // This notice may not be removed from this file.
 
 import 'dart:io';
-import 'dart:ui';
-
-import 'package:compdfkit_flutter/util/extension/cpdf_color_extension.dart';
-import 'package:flutter/material.dart';
 import 'package:flutter/services.dart';
 
-import '../document/cpdf_document.dart';
+import '../configuration/cpdf_options.dart';
 
 /// PDF Reader Widget Controller
 ///
@@ -34,12 +30,12 @@ import '../document/cpdf_document.dart';
 class CPDFReaderWidgetController {
   late MethodChannel _channel;
 
-  late CPDFDocument _document;
+  // late CPDFDocument _document;
 
   CPDFReaderWidgetController(int id) {
     _channel = MethodChannel('com.compdfkit.flutter.ui.pdfviewer.$id');
     _channel.setMethodCallHandler((call) async {});
-    _document = CPDFDocument(_channel);
+    // _document = CPDFDocument.withController(id);
   }
 
   // CPDFDocument get document => _document;
@@ -72,6 +68,17 @@ class CPDFReaderWidgetController {
     return await _channel.invokeMethod('get_scale');
   }
 
+  /// Whether allow to scale.
+  /// Default : true
+  ///
+  /// example:
+  /// ```dart
+  /// _controller.setCanScale(canScale);
+  /// ```
+  Future<void> setCanScale(bool canScale) async {
+    assert(Platform.isAndroid, 'This method is only supported on Android');
+    await _channel.invokeMethod('set_can_scale', canScale);
+  }
 
   /// Sets background color of reader.
   /// The color of each document space will be set to 75% of [color] transparency
@@ -80,9 +87,9 @@ class CPDFReaderWidgetController {
   /// ```dart
   /// await _controller.setReadBackgroundColor(Colors.white);
   /// ```
-  Future<void> setReadBackgroundColor(Color color) async {
-    await _channel.invokeMethod('set_read_background_color', color.toHex());
-  }
+  // Future<void> setReadBackgroundColor(Color color) async {
+  //   await _channel.invokeMethod('set_read_background_color', color.toHex());
+  // }
 
   /// Get background color of reader.
   ///
@@ -90,10 +97,10 @@ class CPDFReaderWidgetController {
   /// ```dart
   /// Color color = await _controller.getReadBackgroundColor();
   /// ```
-  Future<Color> getReadBackgroundColor() async {
-    String hexColor = await _channel.invokeMethod('get_read_background_color');
-    return HexColor.fromHex(hexColor);
-  }
+  // Future<Color> getReadBackgroundColor() async {
+  //   String hexColor = await _channel.invokeMethod('get_read_background_color');
+  //   return HexColor.fromHex(hexColor);
+  // }
 
   /// Sets whether to display highlight Form Field.
   /// [isFormFieldHighlight] : true to display highlight Form Field.
@@ -161,22 +168,16 @@ class CPDFReaderWidgetController {
     return await _channel.invokeMethod('is_vertical_mode');
   }
 
-  /// Sets the spacing between pages
+  /// Set document page spacing
   ///
   /// [spacing] the spacing between pages
   ///
   /// example:
   /// ```dart
-  /// _controller.setPageSpacing(left: 10, top: 10, right: 10, bottom: 10);
+  /// _controller.setMargins(const CPDFEdgeInsets.symmetric(horizontal: 10, vertical: 10));
   /// ```
-  Future<void> setPageSpacing(
-      {int left = 10, int top = 10, int right = 10, int bottom = 10}) async {
-    await _channel.invokeMethod('set_page_spacing', {
-      'left': left,
-      'top' : top,
-      'right': right,
-      'bottom': bottom
-    });
+  Future<void> setMargins(CPDFEdgeInsets edgeInsets) async {
+    await _channel.invokeMethod('set_margin' , edgeInsets.toJson());
   }
 
   /// Sets whether it is continuous scroll mode.
@@ -276,10 +277,8 @@ class CPDFReaderWidgetController {
   /// ```
   Future<void> setDisplayPageIndex(int pageIndex,
       {bool animated = true}) async {
-    await _channel.invokeMethod('set_display_page_index', {
-      'pageIndex': pageIndex,
-      'animated': animated
-    });
+    await _channel.invokeMethod('set_display_page_index',
+        {'pageIndex': pageIndex, 'animated': animated});
   }
 
   /// get current page index
@@ -292,4 +291,46 @@ class CPDFReaderWidgetController {
     return await _channel.invokeMethod('get_current_page_index');
   }
 
+  /// In the single page mode, set whether all pages keep the same width and the original page keeps the same width as readerView
+  ///
+  /// [isSame] true: All pages keep the same width, the original state keeps the same width as readerView; false: Show in the actual width of page
+  ///
+  /// example:
+  /// ```dart
+  /// _controller.setPageSameWidth(true);
+  /// ```
+  Future<void> setPageSameWidth(bool isSame) async {
+    assert(Platform.isAndroid, 'This method is only supported on Android');
+    await _channel.invokeMethod('set_page_same_width', isSame);
+  }
+
+  /// Gets whether the specified [pageIndex] is displayed on the screen
+  ///
+  /// example:
+  /// ```dart
+  /// bool isPageInScreen = await _controller.isPageInScreen(1);
+  /// ```
+  Future<bool> isPageInScreen(int pageIndex) async {
+    assert(Platform.isAndroid, 'This method is only supported on Android');
+    return await _channel.invokeMethod('is_page_in_screen', pageIndex);
+  }
+
+  /// Sets whether to fix the position of the non-swipe direction when zooming in for reading.
+  ///
+  /// [isFixedScroll] true: fixed position; false: not fixed position; Set false by default
+  ///
+  Future<void> setFixedScroll(bool isFixedScroll) async {
+    assert(Platform.isAndroid, 'This method is only supported on Android');
+    await _channel.invokeMethod('set_fixed_scroll', isFixedScroll);
+  }
+
+  /// Check the document for modifications
+  ///
+  /// example:
+  /// ```dart
+  /// bool hasChange = await document.hasChange();
+  /// ```
+  Future<bool> hasChange() async {
+    return await _channel.invokeMethod('has_change');
+  }
 }