Bläddra i källkod

ComPDFKit(flutter) - 新增注释示例、安全示例,调整示例分类

liuxiaolong 2 månader sedan
förälder
incheckning
6c6381f57b

+ 8 - 2
android/src/main/java/com/compdfkit/flutter/compdfkit_flutter/plugin/CPDFViewCtrlPlugin.java

@@ -55,6 +55,8 @@ import android.util.Log;
 
 import androidx.annotation.NonNull;
 
+import androidx.core.content.ContextCompat;
+import com.compdfkit.flutter.compdfkit_flutter.R;
 import com.compdfkit.tools.common.pdf.CPDFDocumentFragment;
 import com.compdfkit.tools.common.utils.viewutils.CViewUtils;
 import com.compdfkit.tools.common.views.pdfview.CPDFIReaderViewCallback;
@@ -142,8 +144,12 @@ public class CPDFViewCtrlPlugin extends BaseMethodChannelPlugin {
       case SET_READ_BACKGROUND_COLOR:
         String colorHex = call.argument("color");
         readerView.setReadBackgroundColor(Color.parseColor(colorHex));
-        pdfView.setBackgroundColor(
-            CViewUtils.getColor(Color.parseColor(colorHex), 190));
+        if (colorHex.equals("#FFFFFFFF")){
+          pdfView.setBackgroundColor(ContextCompat.getColor(context, R.color.tools_pdf_view_ctrl_background_color));
+        } else {
+          pdfView.setBackgroundColor(
+              CViewUtils.getColor(Color.parseColor(colorHex), 190));
+        }
         break;
       case GET_READ_BACKGROUND_COLOR:
         String readBgColor =

+ 3 - 3
example/ios/Runner.xcodeproj/project.pbxproj

@@ -490,7 +490,7 @@
 				CODE_SIGN_IDENTITY = "Apple Development";
 				CODE_SIGN_STYLE = Automatic;
 				CURRENT_PROJECT_VERSION = 2.2.0;
-				DEVELOPMENT_TEAM = 4GGQPGRTSV;
+				DEVELOPMENT_TEAM = 59AC9PMNH2;
 				ENABLE_BITCODE = NO;
 				FLUTTER_BUILD_NAME = 2.2.0;
 				FLUTTER_BUILD_NUMBER = 2.2.0;
@@ -680,7 +680,7 @@
 				CODE_SIGN_IDENTITY = "Apple Development";
 				CODE_SIGN_STYLE = Automatic;
 				CURRENT_PROJECT_VERSION = 2.2.0;
-				DEVELOPMENT_TEAM = 4GGQPGRTSV;
+				DEVELOPMENT_TEAM = 59AC9PMNH2;
 				ENABLE_BITCODE = NO;
 				FLUTTER_BUILD_NAME = 2.2.0;
 				FLUTTER_BUILD_NUMBER = 2.2.0;
@@ -709,7 +709,7 @@
 				CODE_SIGN_IDENTITY = "Apple Development";
 				CODE_SIGN_STYLE = Automatic;
 				CURRENT_PROJECT_VERSION = 2.2.0;
-				DEVELOPMENT_TEAM = 4GGQPGRTSV;
+				DEVELOPMENT_TEAM = 59AC9PMNH2;
 				ENABLE_BITCODE = NO;
 				FLUTTER_BUILD_NAME = 2.2.0;
 				FLUTTER_BUILD_NUMBER = 2.2.0;

+ 147 - 0
example/lib/cpdf_reader_widget_annotations_example.dart

@@ -0,0 +1,147 @@
+// 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.
+
+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:compdfkit_flutter_example/utils/file_util.dart';
+import 'package:file_picker/file_picker.dart';
+import 'package:flutter/material.dart';
+
+class CPDFReaderWidgetAnnotationsExample extends StatefulWidget {
+  final String documentPath;
+
+  const CPDFReaderWidgetAnnotationsExample(
+      {super.key, required this.documentPath});
+
+  @override
+  State<CPDFReaderWidgetAnnotationsExample> createState() =>
+      _CPDFReaderWidgetAnnotationsExampleState();
+}
+
+class _CPDFReaderWidgetAnnotationsExampleState
+    extends State<CPDFReaderWidgetAnnotationsExample> {
+  CPDFReaderWidgetController? _controller;
+
+  bool pageSameWidth = true;
+
+  bool isFixedScroll = false;
+
+  @override
+  Widget build(BuildContext context) {
+    return Scaffold(
+        resizeToAvoidBottomInset: false,
+        appBar: AppBar(
+          title: const Text('CPDFReaderWidget Example'),
+          leading: IconButton(
+              onPressed: () {
+                _save();
+                Navigator.pop(context);
+              },
+              icon: const Icon(Icons.arrow_back)),
+          actions: null == _controller ? null : _buildAppBarActions(context),
+        ),
+        body: CPDFReaderWidget(
+          document: widget.documentPath,
+          configuration: CPDFConfiguration(
+              toolbarConfig: const CPDFToolbarConfig(
+                  iosLeftBarAvailableActions: [CPDFToolbarAction.thumbnail])),
+          onCreated: (controller) {
+            setState(() {
+              _controller = controller;
+            });
+          },
+        ));
+  }
+
+  void _save() async {
+    bool saveResult = await _controller!.document.save();
+    debugPrint('ComPDFKit-Flutter: saveResult:$saveResult');
+  }
+
+  List<Widget> _buildAppBarActions(BuildContext context) {
+    return [
+      PopupMenuButton<String>(
+        onSelected: (value) {
+          handleClick(value, _controller!);
+        },
+        itemBuilder: (context) {
+          return actions.map((action) {
+            return PopupMenuItem(
+              value: action,
+              child: Text(action),
+            );
+          }).toList();
+        },
+      ),
+    ];
+  }
+
+  void handleClick(String value, CPDFReaderWidgetController controller) async {
+    switch (value) {
+      case 'Save':
+        bool saveResult = await controller.document.save();
+        debugPrint('ComPDFKit: save():$saveResult');
+        break;
+      case "Import Annotations 1":
+        FilePickerResult? result = await FilePicker.platform.pickFiles(type: FileType.any);
+        if(result != null) {
+          debugPrint('mimeType: ${result.files.first.extension}');
+          if(result.files.first.extension != 'xfdf') {
+            debugPrint('Please select a xfdf file.');
+            return;
+          }
+          bool importResult = await controller.document.importAnnotations(result.files.first.path!);
+          debugPrint('ComPDFKit:Document: importAnnotations:$importResult');
+        }
+        break;
+      case "Import Annotations 2":
+        // android assets:
+        // String? xfdfFile = "file:///android_asset/test.xfdf";
+
+        // android file path sample:
+        File xfdfFile = await extractAsset(context, 'pdfs/test.xfdf');
+
+        // android Uri:
+        //String xfdfFile = "content://xxx";
+
+        bool result =
+            await controller.document.importAnnotations(xfdfFile.path);
+        debugPrint('ComPDFKit:Document: importAnnotations:$result');
+        break;
+      case "Export Annotations":
+        String xfdfPath = await controller.document.exportAnnotations();
+        debugPrint('ComPDFKit:Document: exportAnnotations:$xfdfPath');
+        break;
+      case "Remove All Annotations":
+        await controller.document.removeAllAnnotations();
+        break;
+    }
+  }
+}
+
+var actions = [
+  'Save',
+  'Import Annotations 1',
+  'Import Annotations 2',
+  'Export Annotations',
+  'Remove All Annotations',
+];
+
+Color randomColor() {
+  final Random random = Random();
+  return Color.fromARGB(
+    255, // Alpha value (fully opaque)
+    random.nextInt(256), // Red value
+    random.nextInt(256), // Green value
+    random.nextInt(256), // Blue value
+  );
+}

+ 10 - 51
example/lib/cpdf_reader_widget_controller_example.dart

@@ -11,9 +11,9 @@ import 'dart:math';
 import 'package:compdfkit_flutter/compdfkit.dart';
 import 'package:compdfkit_flutter/configuration/cpdf_configuration.dart';
 import 'package:compdfkit_flutter/configuration/cpdf_options.dart';
-import 'package:compdfkit_flutter/util/extension/cpdf_color_extension.dart';
 import 'package:compdfkit_flutter/widgets/cpdf_reader_widget.dart';
 import 'package:compdfkit_flutter/widgets/cpdf_reader_widget_controller.dart';
+import 'package:compdfkit_flutter_example/page/cpdf_reader_widget_display_setting_page.dart';
 import 'package:compdfkit_flutter_example/page/cpdf_reader_widget_switch_preview_mode_page.dart';
 import 'package:compdfkit_flutter_example/utils/file_util.dart';
 import 'package:flutter/material.dart';
@@ -33,8 +33,6 @@ class _CPDFReaderWidgetControllerExampleState
     extends State<CPDFReaderWidgetControllerExample> {
   CPDFReaderWidgetController? _controller;
 
-  bool canScale = true;
-
   bool pageSameWidth = true;
 
   bool isFixedScroll = false;
@@ -140,25 +138,6 @@ class _CPDFReaderWidgetControllerExampleState
         double scaleValue = await controller.getScale();
         debugPrint('ComPDFKit:CPDFReaderWidget-getScale():$scaleValue');
         break;
-      case 'setCanScale':
-        canScale = !canScale;
-        await controller.setCanScale(canScale);
-        break;
-      case 'setFormHighlight':
-        bool isFormFieldHighlight = await controller.isFormFieldHighlight();
-        debugPrint('ComPDFKit:isFormFieldHighlight:$isFormFieldHighlight');
-        controller.setFormFieldHighlight(!isFormFieldHighlight);
-        break;
-      case 'setLinkHighlight':
-        bool isLinkHighlight = await controller.isLinkHighlight();
-        debugPrint('ComPDFKit:isLinkHighlight:$isLinkHighlight');
-        controller.setLinkHighlight(!isLinkHighlight);
-        break;
-      case 'setVerticalMode':
-        bool isVerticalMode = await controller.isVerticalMode();
-        debugPrint('ComPDFKit:isVerticalMode:$isVerticalMode');
-        controller.setVerticalMode(!isVerticalMode);
-        break;
       case 'setMargin':
         final Random random = Random();
         int value = random.nextInt(50);
@@ -169,21 +148,6 @@ class _CPDFReaderWidgetControllerExampleState
       case "setPageSpacing":
         await controller.setPageSpacing(20);
         break;
-      case 'setContinueMode':
-        bool isContinueMode = await controller.isContinueMode();
-        debugPrint('ComPDFKit:isContinueMode:$isContinueMode');
-        controller.setContinueMode(!isContinueMode);
-        break;
-      case 'setDoublePageMode':
-        bool isDoublePageMode = await controller.isDoublePageMode();
-        debugPrint('ComPDFKit:isDoublePageMode:$isDoublePageMode');
-        controller.setDoublePageMode(!isDoublePageMode);
-        break;
-      case 'setCropMode':
-        bool isCropMode = await controller.isCropMode();
-        debugPrint('ComPDFKit:isCropMode:$isCropMode');
-        controller.setCropMode(!isCropMode);
-        break;
       case 'setDisplayPageIndex':
         int currentPageIndex = await controller.getCurrentPageIndex();
         debugPrint('ComPDFKit:getCurrentPageIndex:$currentPageIndex');
@@ -195,12 +159,6 @@ class _CPDFReaderWidgetControllerExampleState
         debugPrint('ComPDFKit:isCoverPageMode:$isCoverPageMode');
         controller.setCoverPageMode(!isCoverPageMode);
         break;
-      case 'setReadBackgroundColor':
-        var currentReadBackgroundColor =
-            await controller.getReadBackgroundColor();
-        debugPrint('readBackgroundColor:${currentReadBackgroundColor.toHex()}');
-        await controller.setReadBackgroundColor(CPDFThemes.dark);
-        break;
       case 'isChanged':
         bool hasChange = await controller.document.hasChange();
         debugPrint('ComPDFKit:hasChange:$hasChange');
@@ -291,6 +249,14 @@ class _CPDFReaderWidgetControllerExampleState
       case 'print':
         await controller.document.printDocument();
         break;
+      case 'DisplaySettingPage':
+        await showModalBottomSheet(
+            isScrollControlled: true,
+            context: context,
+            builder: (context) {
+              return CpdfReaderWidgetDisplaySettingPage(controller: controller);
+            });
+        break;
     }
   }
 }
@@ -301,16 +267,8 @@ var actions = [
   'openDocument',
   'setScale',
   'setPageSpacing',
-  'setReadBackgroundColor',
-  'setFormHighlight',
-  'setLinkHighlight',
-  'setVerticalMode',
   'setMargin',
-  'setContinueMode',
-  'setDoublePageMode',
-  'setCropMode',
   'setDisplayPageIndex',
-  'setCoverPageMode',
   'isChanged',
   'documentInfo',
   'importAnnotations',
@@ -322,6 +280,7 @@ var actions = [
 
 var actions1 = [
   'PreviewMode',
+  'DisplaySettingPage',
   'DisplaySetting',
   'Watermark',
   'Security',

+ 53 - 43
example/lib/examples.dart

@@ -8,7 +8,6 @@
  *
  */
 
-
 import 'dart:io';
 
 import 'package:compdfkit_flutter/compdfkit.dart';
@@ -18,61 +17,62 @@ import 'package:compdfkit_flutter_example/cpdf_reader_widget_dark_theme_example.
 import 'package:compdfkit_flutter_example/cpdf_reader_widget_security_example.dart';
 import 'package:compdfkit_flutter_example/utils/file_util.dart';
 import 'package:flutter/material.dart';
+import 'cpdf_reader_widget_annotations_example.dart';
 import 'cpdf_reader_widget_example.dart';
 import 'widgets/cpdf_fun_item.dart';
 
 const String _documentPath = 'pdfs/PDF_Document.pdf';
 
-List<Widget> examples(BuildContext context) =>
-    [
-      Padding(padding: const EdgeInsets.only(top: 8, bottom: 8), child: Text(
-        'Widget Examples',
-        style: Theme
-            .of(context)
-            .textTheme
-            .bodyLarge
-            ?.copyWith(fontWeight: FontWeight.w500),
-      )),
+List<Widget> examples(BuildContext context) => [
+      _title(context, 'Widget Examples'),
       FeatureItem(
           title: 'Show CPDFReaderWidget',
           description: 'Display PDF view in flutter widget',
           onTap: () async {
-            File document = await extractAsset(
-                context, _documentPath, shouldOverwrite: false);
+            File document = await extractAsset(context, _documentPath,
+                shouldOverwrite: false);
             showCPDFReaderWidget(context, document.path);
-          }
-      ),
+          }),
+      FeatureItem(
+          title: 'Select External Files',
+          description: 'Select pdf document from system file manager',
+          onTap: () async {
+            String? path = await pickDocument();
+            showCPDFReaderWidget(context, path);
+          }),
       if (Platform.isAndroid) ...[
-        FeatureItem(title: 'CPDFReaderWidget Dark Theme',
-            description: 'Opens a document in night mode with a custom 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 Examples',
+      FeatureItem(
+          title: 'Widget Controller Examples',
           description: 'CPDFReaderWidget Controller fun example',
           onTap: () => showCPDFReaderWidgetTest(context)),
-      FeatureItem(title: 'Security feature Examples',
-          description: 'This example shows how to set passwords, watermarks, etc.',
+      FeatureItem(
+          title: 'Security feature Examples',
+          description:
+              'This example shows how to set passwords, watermarks, etc.',
           onTap: () async {
-            File document = await extractAsset(
-                context, _documentPath, shouldOverwrite: false);
-            goTo(CPDFReaderWidgetSecurityExample(documentPath: document.path), context);
+            File document = await extractAsset(context, _documentPath,
+                shouldOverwrite: false);
+            goTo(CPDFReaderWidgetSecurityExample(documentPath: document.path),
+                context);
           }),
       FeatureItem(
-          title: 'Select External Files',
-          description: 'Select pdf document from system file manager',
+          title: 'Annotations Examples',
+          description:
+              'Demonstrate how to implement annotation functionality using the CPDFReaderWidget , including adding, editing, and deleting annotations.',
           onTap: () async {
-            String? path = await pickDocument();
-            showCPDFReaderWidget(context, path);
+            File document = await extractAsset(context, _documentPath,
+                shouldOverwrite: false);
+            goTo(
+                CPDFReaderWidgetAnnotationsExample(documentPath: document.path),
+                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),
-      )),
-
+      _title(context, 'Modal View Examples'),
       FeatureItem(
           title: 'Basic Example',
           description: 'Open sample pdf document',
@@ -89,7 +89,6 @@ List<Widget> examples(BuildContext context) =>
           })
     ];
 
-
 void showDocument(context) async {
   File document = await extractAsset(context, _documentPath);
   ComPDFKit.openDocument(document.path,
@@ -104,20 +103,31 @@ void showCPDFReaderWidget(context, String? path) async {
   goTo(CPDFReaderWidgetExample(documentPath: path!), context);
 }
 
-
 void showDarkThemeCPDFReaderWidget(context) async {
-  File document = await extractAsset(
-      context, _documentPath, shouldOverwrite: false);
+  File document =
+      await extractAsset(context, _documentPath, shouldOverwrite: false);
   goTo(CPDFDarkThemeExample(documentPath: document.path), context);
 }
 
 void showCPDFReaderWidgetTest(context) async {
-  File document = await extractAsset(
-      context, _documentPath, shouldOverwrite: false);
+  File document =
+      await extractAsset(context, _documentPath, shouldOverwrite: false);
   goTo(CPDFReaderWidgetControllerExample(documentPath: document.path), context);
 }
 
 void goTo(Widget widget, BuildContext context) =>
     Navigator.push(context, MaterialPageRoute(builder: (context) {
       return widget;
-    }));
+    }));
+
+Widget _title(BuildContext context, String title) {
+  return Padding(
+      padding: const EdgeInsets.only(top: 8, bottom: 8),
+      child: Text(
+        title,
+        style: Theme.of(context)
+            .textTheme
+            .bodyLarge
+            ?.copyWith(fontWeight: FontWeight.w500),
+      ));
+}

+ 0 - 3
example/lib/main.dart

@@ -54,9 +54,6 @@ class _HomePageState extends State<HomePage> {
 
   void _init() async {
     // await ComPDFKit.setImportFontDir('fonts directory',addSysFont: true);
-    // online license auth
-    // Please replace it with your ComPDFKit license
-    // ComPDFKit.initialize(androidOnlineLicense: 'IVTAsbJCW0X45qIy5cTEuzxZzKpYIpJe6WPY7uCPIiI=',iosOnlineLicense: 'lkw3Gr0HuD5pV1/+DVRSxp7qBlvK+Izo3mOKyAEHXz4=');
 
     // offline license auth
     ComPDFKit.init(Platform.isAndroid ? androidLicenseKey : iosLicenseKey);

+ 231 - 19
example/lib/page/cpdf_reader_widget_display_setting_page.dart

@@ -8,6 +8,10 @@
  *
  */
 
+import 'dart:io';
+
+import 'package:compdfkit_flutter/configuration/cpdf_options.dart';
+import 'package:compdfkit_flutter/util/extension/cpdf_color_extension.dart';
 import 'package:compdfkit_flutter/widgets/cpdf_reader_widget_controller.dart';
 import 'package:flutter/material.dart';
 
@@ -24,8 +28,19 @@ class CpdfReaderWidgetDisplaySettingPage extends StatefulWidget {
 
 class _CpdfReaderWidgetDisplaySettingPageState
     extends State<CpdfReaderWidgetDisplaySettingPage> {
-
   bool _isVertical = true;
+
+  CPDFDisplayMode _displayMode = CPDFDisplayMode.singlePage;
+
+  bool _isLinkHighlight = true;
+
+  bool _isFormFieldHighlight = true;
+
+  bool _isContinuous = true;
+  bool _isCrop = true;
+  bool _canScale = true;
+  CPDFThemes _themes = CPDFThemes.light;
+
   @override
   void initState() {
     super.initState();
@@ -35,38 +50,235 @@ class _CpdfReaderWidgetDisplaySettingPageState
   void initReaderViewWidgetStates() async {
     CPDFReaderWidgetController controller = widget.controller;
     bool isVer = await controller.isVerticalMode();
-    setState(() async {
+    bool isDoublePageMode = await controller.isDoublePageMode();
+    bool isCoverPageMode = await controller.isCoverPageMode();
+    bool isLinkHighlight = await controller.isLinkHighlight();
+    bool isFormFieldHighlight = await controller.isFormFieldHighlight();
+    bool isContinuous = await controller.isContinueMode();
+    bool isCrop = await controller.isCropMode();
+    Color themeColor = await controller.getReadBackgroundColor();
+    debugPrint('themeColor: ${themeColor.toHex()}');
+    setState(() {
       _isVertical = isVer;
+      if (isDoublePageMode) {
+        if (isCoverPageMode) {
+          _displayMode = CPDFDisplayMode.coverPage;
+        } else {
+          _displayMode = CPDFDisplayMode.doublePage;
+        }
+      } else {
+        _displayMode = CPDFDisplayMode.singlePage;
+      }
+      _isLinkHighlight = isLinkHighlight;
+      _isFormFieldHighlight = isFormFieldHighlight;
+      _isContinuous = isContinuous;
+      _isCrop = isCrop;
+      _themes = CPDFThemes.of(themeColor);
     });
   }
+
   @override
   Widget build(BuildContext context) {
-    return Scaffold(
-        appBar: AppBar(
-          title: const Text('View Settings'),
+    return Container(
+      height: 600,
+      decoration: BoxDecoration(
+          color: Theme.of(context).scaffoldBackgroundColor,
+          borderRadius: const BorderRadius.only(
+              topLeft: Radius.circular(12), topRight: Radius.circular(12))),
+      child: Column(children: [
+        Container(
+          margin: const EdgeInsets.only(left: 16),
+          alignment: Alignment.centerLeft,
+          width: double.infinity,
+          height: 56,
+          child: Text(
+            'Settings',
+            style: Theme.of(context).textTheme.headlineSmall,
+          ),
+        ),
+        Expanded(child: SingleChildScrollView(
+            physics: const BouncingScrollPhysics(),
+            child: Column(
+              children: [
+                _scrollItem(),
+                _displayModeItem(),
+                _otherItem(),
+                _themesItem()
+              ],
+            ))),
+
+      ],),
+    );
+  }
+
+  Widget _scrollItem() {
+    return Column(
+      children: [
+        _dividerLine('Scrolling'),
+        _checkItem(
+          'Vertical Scrolling',
+          _isVertical,
+          () async {
+            await _updateVerticalMode(true);
+          },
+        ),
+        _checkItem('Horizontal Scrolling', !_isVertical, () async {
+          await _updateVerticalMode(false);
+        })
+      ],
+    );
+  }
+
+  Future<void> _updateVerticalMode(bool isVertical) async {
+    if (mounted) {
+      setState(() {
+        _isVertical = isVertical;
+      });
+    }
+    await widget.controller.setVerticalMode(isVertical);
+  }
+
+  Widget _displayModeItem() {
+    return Column(
+      children: [
+        _dividerLine('Display Mode'),
+        _checkItem(
+          'Single Page',
+          _displayMode == CPDFDisplayMode.singlePage,
+          () async {
+            await _updateDisplayMode(CPDFDisplayMode.singlePage);
+          },
         ),
-        body: Column(
-          children: [_dividerLine('scroll'),
-          _scrollItem()],
-        ));
+        _checkItem('Two Page', _displayMode == CPDFDisplayMode.doublePage,
+            () async {
+          await _updateDisplayMode(CPDFDisplayMode.doublePage);
+        }),
+        _checkItem('Cover Mode', _displayMode == CPDFDisplayMode.coverPage,
+            () async {
+          await _updateDisplayMode(CPDFDisplayMode.coverPage);
+        })
+      ],
+    );
+  }
+
+  Future<void> _updateDisplayMode(CPDFDisplayMode displayMode) async {
+    if (mounted) {
+      setState(() {
+        _displayMode = displayMode;
+      });
+    }
+    if (displayMode == CPDFDisplayMode.singlePage) {
+      await widget.controller.setDoublePageMode(false);
+    } else if (displayMode == CPDFDisplayMode.doublePage) {
+      await widget.controller.setDoublePageMode(true);
+    } else {
+      await widget.controller.setCoverPageMode(true);
+    }
+  }
+
+  Widget _otherItem() {
+    return Column(
+      children: [
+        _dividerLine(''),
+        _switchItem('Highlight Links', _isLinkHighlight, (check) async {
+          setState(() {
+            _isLinkHighlight = check;
+          });
+          await widget.controller.setLinkHighlight(check);
+        }),
+        _switchItem('Highlight Form Fields', _isFormFieldHighlight,
+            (check) async {
+          setState(() {
+            _isFormFieldHighlight = check;
+          });
+          await widget.controller.setFormFieldHighlight(check);
+        }),
+        _switchItem('Continuous Scrolling', _isContinuous, (check) async {
+          setState(() {
+            _isContinuous = check;
+          });
+          await widget.controller.setContinueMode(check);
+        }),
+        _switchItem('Crop', _isCrop, (check) async {
+          setState(() {
+            _isCrop = check;
+          });
+          await widget.controller.setCropMode(check);
+        }),
+        if (Platform.isAndroid) ...{
+          _switchItem('Can Scale', _canScale, (check) async {
+            setState(() {
+              _canScale = check;
+            });
+            await widget.controller.setCanScale(check);
+          }),
+        }
+      ],
+    );
+  }
+
+  Widget _themesItem() {
+    return Column(
+      children: [
+        _dividerLine('Themes'),
+        _checkItem('Light', _themes == CPDFThemes.light, () async {
+          await _updateTheme(CPDFThemes.light);
+        }),
+        _checkItem('Dark', _themes == CPDFThemes.dark, () async {
+          await _updateTheme(CPDFThemes.dark);
+        }),
+        _checkItem('Sepia', _themes == CPDFThemes.sepia, () async {
+          await _updateTheme(CPDFThemes.sepia);
+        }),
+        _checkItem('Reseda', _themes == CPDFThemes.reseda, () async {
+          await _updateTheme(CPDFThemes.reseda);
+        })
+      ],
+    );
+  }
+
+  Future<void> _updateTheme(CPDFThemes themes) async {
+    if (mounted) {
+      setState(() {
+        _themes = themes;
+      });
+    }
+    await widget.controller.setReadBackgroundColor(themes);
   }
 
   Widget _dividerLine(String title) {
     return Container(
-      padding: const EdgeInsets.only(left: 8),
+      decoration: BoxDecoration(
+          borderRadius: BorderRadius.circular(4),
+          color: Theme.of(context).appBarTheme.backgroundColor),
+      padding: const EdgeInsets.only(left: 8, top: 4, bottom: 4),
+      margin: const EdgeInsets.symmetric(horizontal: 8),
       width: double.infinity,
-      height: 24,
-      color: Theme.of(context).primaryColor,
-      child: Text(title),
+      child: Text(title,
+          style: Theme.of(context)
+              .textTheme
+              .bodyLarge
+              ?.copyWith(fontWeight: FontWeight.w500)),
     );
   }
 
-  Widget _scrollItem() {
-    var textStyle =  Theme.of(context).textTheme.bodyMedium;
-    return Column(children: [
-      ListTile(title: Text('Vertical Scrolling', style: textStyle), trailing: _isVertical ? const Icon(Icons.check) : null,),
-      ListTile(title: Text('Horizontal Scrolling', style: textStyle,),trailing: !_isVertical ? const Icon(Icons.check) : null,),
-    ],);
+  Widget _checkItem(String title, bool isCheck, GestureTapCallback onTap) {
+    return ListTile(
+      onTap: onTap,
+      title: Text(title, style: Theme.of(context).textTheme.bodyMedium),
+      trailing: isCheck
+          ? Icon(Icons.check, color: Theme.of(context).primaryColor)
+          : null,
+    );
   }
 
+  Widget _switchItem(String title, bool isCheck, ValueChanged<bool> changed) {
+    return ListTile(
+      title: Text(title, style: Theme.of(context).textTheme.bodyMedium),
+      trailing: Transform.scale(
+        scale: 0.8,
+        child: Switch(value: isCheck, onChanged: changed),
+      ),
+    );
+  }
 }

+ 3 - 1
example/lib/page/cpdf_reader_widget_switch_preview_mode_page.dart

@@ -43,7 +43,9 @@ class _CpdfReaderWidgetSwitchPreviewModePageState
                 alignment: Alignment.center,
                 children: [
                   Text('Mode', style: Theme.of(context).textTheme.titleMedium),
-                  const Positioned(right: 16, child: Icon(Icons.close))
+                  Positioned(right: 16, child: IconButton(onPressed: (){
+                    Navigator.pop(context);
+                  }, icon: const Icon(Icons.close)))
                 ],
               ),
             ),

+ 25 - 7
example/lib/theme/themes.dart

@@ -31,11 +31,30 @@ final ThemeData lightTheme = ThemeData(
             color: Color(0xFF43474D)),
         backgroundColor: Color(0xFFFAFCFF),
         foregroundColor: Color(0xFF43474D),
-        systemOverlayStyle: SystemUiOverlayStyle(
-            systemNavigationBarColor: Color(0xFFFFFFFF)
-        )),
+        systemOverlayStyle:
+            SystemUiOverlayStyle(systemNavigationBarColor: Color(0xFFFFFFFF))),
     elevatedButtonTheme: ElevatedButtonThemeData(
-        style: ElevatedButton.styleFrom(foregroundColor: Colors.blue)));
+        style: ElevatedButton.styleFrom(foregroundColor: Colors.blue)),
+    switchTheme: SwitchThemeData(
+        thumbColor: WidgetStateProperty.resolveWith((status){
+          if(status.contains(WidgetState.selected)) {
+            return Colors.blue;
+          }
+          return Colors.grey.shade400;
+        } ),
+        trackColor: WidgetStateProperty.resolveWith((status){
+          if(status.contains(WidgetState.selected)) {
+            return Colors.blue.shade50;
+          }
+          return Colors.grey.shade100;
+        }),
+        trackOutlineColor: WidgetStateProperty.resolveWith((status){
+          if(status.contains(WidgetState.selected)) {
+            return Colors.blue.shade50;
+          }
+          return Colors.grey.shade100;
+        }),
+    ));
 
 final ThemeData darkTheme = ThemeData(
     useMaterial3: true,
@@ -58,8 +77,7 @@ final ThemeData darkTheme = ThemeData(
             fontSize: 18, fontWeight: FontWeight.bold, color: Colors.white),
         backgroundColor: Color(0xFF222429),
         foregroundColor: Colors.white,
-    systemOverlayStyle: SystemUiOverlayStyle(
-      systemNavigationBarColor: Color(0xFF222429)
-    )),
+        systemOverlayStyle:
+            SystemUiOverlayStyle(systemNavigationBarColor: Color(0xFF222429))),
     elevatedButtonTheme: ElevatedButtonThemeData(
         style: ElevatedButton.styleFrom(foregroundColor: Colors.blue)));

+ 15 - 4
lib/configuration/cpdf_options.dart

@@ -6,6 +6,10 @@
 // This notice may not be removed from this file.
 
 
+import 'dart:ui';
+
+import 'package:compdfkit_flutter/util/extension/cpdf_color_extension.dart';
+
 enum CPDFViewMode { viewer, annotations, contentEditor, forms, signatures }
 
 /// The [CPDFToolbarAction.back] button will only be displayed on the leftmost side of the top toolbar on the Android platform
@@ -32,21 +36,28 @@ enum CPDFDisplayMode { singlePage, doublePage, coverPage }
 /// readerView background themes
 enum CPDFThemes {
   /// Bright mode, readerview background is white
-  light('#FFFFFF'),
+  light('#FFFFFFFF'),
 
   /// dark mode, readerview background is black
-  dark('#000000'),
+  dark('#FF000000'),
 
   /// brown paper color
-  sepia('#FFEFBE'),
+  sepia('#FFFFEFBE'),
 
   /// Light green, eye protection mode
-  reseda('#CDE6D0');
+  reseda('#FFCDE6D0');
 
   final String color;
 
   const CPDFThemes(this.color);
 
+  // 根据 Color 对象获取对应的 CPDFThemes
+  static CPDFThemes of(Color color) {
+    return CPDFThemes.values.firstWhere(
+          (theme) => theme.color == color.toHex().toUpperCase(),
+      orElse: () => CPDFThemes.light,
+    );
+  }
   // 获取颜色值
   String getColor() {
     return color;

+ 2 - 5
lib/document/cpdf_document.dart

@@ -34,12 +34,9 @@ class CPDFDocument {
       : _channel = MethodChannel('com.compdfkit.flutter.document_$viewId'),
         _isValid = true;
 
-  Future<CPDFDocumentError> open(String filePath, String password) async {
-    var errorCode = await _channel.invokeMethod(
+  Future<bool> open(String filePath, String password) async {
+    return  await _channel.invokeMethod(
         'open_document', {'filePath': filePath, 'password': password});
-    var error = CPDFDocumentError.values[errorCode];
-    _isValid = error == CPDFDocumentError.success;
-    return error;
   }
 
   /// Gets the file name of the PDF document.