cpdf_reader_widget_controller_example.dart 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. // Copyright © 2014-2025 PDF Technologies, Inc. All Rights Reserved.
  2. //
  3. // THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
  4. // AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
  5. // UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
  6. // This notice may not be removed from this file.
  7. import 'dart:io';
  8. import 'dart:math';
  9. import 'package:compdfkit_flutter/compdfkit.dart';
  10. import 'package:compdfkit_flutter/configuration/cpdf_configuration.dart';
  11. import 'package:compdfkit_flutter/configuration/cpdf_options.dart';
  12. import 'package:compdfkit_flutter/widgets/cpdf_reader_widget.dart';
  13. import 'package:compdfkit_flutter/widgets/cpdf_reader_widget_controller.dart';
  14. import 'package:compdfkit_flutter_example/page/cpdf_reader_widget_display_setting_page.dart';
  15. import 'package:compdfkit_flutter_example/page/cpdf_reader_widget_switch_preview_mode_page.dart';
  16. import 'package:compdfkit_flutter_example/utils/file_util.dart';
  17. import 'package:flutter/material.dart';
  18. class CPDFReaderWidgetControllerExample extends StatefulWidget {
  19. final String documentPath;
  20. const CPDFReaderWidgetControllerExample(
  21. {super.key, required this.documentPath});
  22. @override
  23. State<CPDFReaderWidgetControllerExample> createState() =>
  24. _CPDFReaderWidgetControllerExampleState();
  25. }
  26. class _CPDFReaderWidgetControllerExampleState
  27. extends State<CPDFReaderWidgetControllerExample> {
  28. CPDFReaderWidgetController? _controller;
  29. bool pageSameWidth = true;
  30. bool isFixedScroll = false;
  31. @override
  32. Widget build(BuildContext context) {
  33. return Scaffold(
  34. resizeToAvoidBottomInset: false,
  35. appBar: AppBar(
  36. title: const Text('CPDFReaderWidget Example'),
  37. leading: IconButton(
  38. onPressed: () {
  39. _save();
  40. Navigator.pop(context);
  41. },
  42. icon: const Icon(Icons.arrow_back)),
  43. actions: null == _controller ? null : _buildAppBarActions(context),
  44. ),
  45. body: CPDFReaderWidget(
  46. document: widget.documentPath,
  47. configuration: CPDFConfiguration(
  48. toolbarConfig: const CPDFToolbarConfig(
  49. iosLeftBarAvailableActions: [CPDFToolbarAction.thumbnail])),
  50. onCreated: (controller) {
  51. setState(() {
  52. _controller = controller;
  53. });
  54. },
  55. onPageChanged: (pageIndex) {
  56. debugPrint('pageIndex:$pageIndex');
  57. },
  58. onSaveCallback: () {
  59. debugPrint('CPDFDocument: save success');
  60. },
  61. ));
  62. }
  63. void _save() async {
  64. bool saveResult = await _controller!.document.save();
  65. debugPrint('ComPDFKit-Flutter: saveResult:$saveResult');
  66. }
  67. List<Widget> _buildAppBarActions(BuildContext context) {
  68. return [
  69. PopupMenuButton<String>(
  70. icon: const Icon(Icons.settings),
  71. onSelected: (value) {
  72. handleClick(value, _controller!);
  73. },
  74. itemBuilder: (context) {
  75. return actions1.map((action) {
  76. return PopupMenuItem(
  77. value: action,
  78. child: Text(action),
  79. );
  80. }).toList();
  81. },
  82. ),
  83. PopupMenuButton<String>(
  84. onSelected: (value) {
  85. handleClick(value, _controller!);
  86. },
  87. itemBuilder: (context) {
  88. return actions.map((action) {
  89. return PopupMenuItem(
  90. value: action,
  91. child: Text(action),
  92. );
  93. }).toList();
  94. },
  95. ),
  96. ];
  97. }
  98. void handleClick(String value, CPDFReaderWidgetController controller) async {
  99. switch (value) {
  100. case 'save':
  101. bool saveResult = await controller.document.save();
  102. debugPrint('ComPDFKit: save():$saveResult');
  103. break;
  104. case 'saveAs':
  105. final tempDir = await ComPDFKit.getTemporaryDirectory();
  106. String savePath =
  107. '${tempDir.path}/${await controller.document.getFileName()}';
  108. // only android platform
  109. // String? savePath = await ComPDFKit.createUri('aaa.pdf', childDirectoryName: 'compdfkit');
  110. bool saveResult = await controller.document.saveAs(savePath);
  111. debugPrint('ComPDFKit:saveAs:Result:$saveResult');
  112. debugPrint('ComPDFKit:saveAs:Path:$savePath');
  113. break;
  114. case 'setScale':
  115. controller.setScale(1.5);
  116. double scaleValue = await controller.getScale();
  117. debugPrint('ComPDFKit:CPDFReaderWidget-getScale():$scaleValue');
  118. break;
  119. case 'setMargin':
  120. final Random random = Random();
  121. int value = random.nextInt(50);
  122. debugPrint('ComPDFKit:setMargin:$value');
  123. controller.setMargins(const CPDFEdgeInsets.only(
  124. left: 20, top: 20, right: 20, bottom: 20));
  125. break;
  126. case "setPageSpacing":
  127. await controller.setPageSpacing(20);
  128. break;
  129. case 'setDisplayPageIndex':
  130. int currentPageIndex = await controller.getCurrentPageIndex();
  131. debugPrint('ComPDFKit:getCurrentPageIndex:$currentPageIndex');
  132. int nextPageIndex = currentPageIndex + 1;
  133. controller.setDisplayPageIndex(nextPageIndex, animated: true);
  134. break;
  135. case 'setCoverPageMode':
  136. bool isCoverPageMode = await controller.isCoverPageMode();
  137. debugPrint('ComPDFKit:isCoverPageMode:$isCoverPageMode');
  138. controller.setCoverPageMode(!isCoverPageMode);
  139. break;
  140. case 'isChanged':
  141. bool hasChange = await controller.document.hasChange();
  142. debugPrint('ComPDFKit:hasChange:$hasChange');
  143. break;
  144. case "documentInfo":
  145. var document = controller.document;
  146. debugPrint(
  147. 'ComPDFKit:Document: fileName:${await document.getFileName()}');
  148. debugPrint(
  149. 'ComPDFKit:Document: checkOwnerUnlocked:${await document.checkOwnerUnlocked()}');
  150. debugPrint(
  151. 'ComPDFKit:Document: hasChange:${await document.hasChange()}');
  152. debugPrint(
  153. 'ComPDFKit:Document: isEncrypted:${await document.isEncrypted()}');
  154. debugPrint(
  155. 'ComPDFKit:Document: isImageDoc:${await document.isImageDoc()}');
  156. debugPrint(
  157. 'ComPDFKit:Document: getPermissions:${await document.getPermissions()}');
  158. debugPrint(
  159. 'ComPDFKit:Document: getPageCount:${await document.getPageCount()}');
  160. break;
  161. case "openDocument":
  162. String? path = await ComPDFKit.pickFile();
  163. if (path != null) {
  164. var document = controller.document;
  165. document.open(path, "");
  166. }
  167. break;
  168. case "removeSignFileList":
  169. bool result = await ComPDFKit.removeSignFileList();
  170. debugPrint('ComPDFKit:removeSignFileList:$result');
  171. break;
  172. case "PreviewMode":
  173. CPDFViewMode mode = await controller.getPreviewMode();
  174. if (mounted) {
  175. CPDFViewMode? switchMode = await showModalBottomSheet(
  176. context: context,
  177. builder: (context) {
  178. return CpdfReaderWidgetSwitchPreviewModePage(viewMode: mode);
  179. });
  180. if (switchMode != null) {
  181. await controller.setPreviewMode(switchMode);
  182. }
  183. }
  184. break;
  185. case 'DisplaySetting':
  186. await controller.showDisplaySettingView();
  187. break;
  188. case 'Watermark':
  189. await controller.showAddWatermarkView();
  190. break;
  191. case 'Security':
  192. await controller.showSecurityView();
  193. break;
  194. case 'Thumbnail':
  195. await controller.showThumbnailView(true);
  196. break;
  197. case 'BOTA':
  198. await controller.showBotaView();
  199. break;
  200. case 'SnipMode':
  201. await controller.enterSnipMode();
  202. break;
  203. case 'ExitSnipMode':
  204. await controller.exitSnipMode();
  205. break;
  206. case 'print':
  207. await controller.document.printDocument();
  208. break;
  209. case 'DisplaySettingPage':
  210. await showModalBottomSheet(
  211. isScrollControlled: true,
  212. context: context,
  213. builder: (context) {
  214. return CpdfReaderWidgetDisplaySettingPage(controller: controller);
  215. });
  216. break;
  217. }
  218. }
  219. }
  220. var actions = [
  221. 'save',
  222. 'saveAs',
  223. 'openDocument',
  224. 'setScale',
  225. 'setPageSpacing',
  226. 'setMargin',
  227. 'setDisplayPageIndex',
  228. 'isChanged',
  229. 'documentInfo',
  230. 'removeSignFileList',
  231. 'print'
  232. ];
  233. var actions1 = [
  234. 'PreviewMode',
  235. 'DisplaySettingPage',
  236. 'DisplaySetting',
  237. 'Watermark',
  238. 'Security',
  239. 'Thumbnail',
  240. 'BOTA',
  241. 'SnipMode',
  242. 'ExitSnipMode'
  243. ];
  244. Color randomColor() {
  245. final Random random = Random();
  246. return Color.fromARGB(
  247. 255, // Alpha value (fully opaque)
  248. random.nextInt(256), // Red value
  249. random.nextInt(256), // Green value
  250. random.nextInt(256), // Blue value
  251. );
  252. }