cpdf_reader_widget_controller_example.dart 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  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: [
  50. CPDFToolbarAction.thumbnail
  51. ])),
  52. onCreated: (controller) {
  53. setState(() {
  54. _controller = controller;
  55. });
  56. },
  57. onPageChanged: (pageIndex) {
  58. debugPrint('pageIndex:$pageIndex');
  59. },
  60. onSaveCallback: () {
  61. debugPrint('CPDFDocument: save success');
  62. },
  63. ));
  64. }
  65. void _save() async {
  66. bool saveResult = await _controller!.document.save();
  67. debugPrint('ComPDFKit-Flutter: saveResult:$saveResult');
  68. }
  69. List<Widget> _buildAppBarActions(BuildContext context) {
  70. return [
  71. PopupMenuButton<String>(
  72. icon: const Icon(Icons.settings),
  73. onSelected: (value) {
  74. handleClick(value, _controller!);
  75. },
  76. itemBuilder: (context) {
  77. return actions1.map((action) {
  78. return PopupMenuItem(
  79. value: action,
  80. child: Text(action),
  81. );
  82. }).toList();
  83. },
  84. ),
  85. PopupMenuButton<String>(
  86. onSelected: (value) {
  87. handleClick(value, _controller!);
  88. },
  89. itemBuilder: (context) {
  90. return actions.map((action) {
  91. return PopupMenuItem(
  92. value: action,
  93. child: Text(action),
  94. );
  95. }).toList();
  96. },
  97. ),
  98. ];
  99. }
  100. void handleClick(String value, CPDFReaderWidgetController controller) async {
  101. switch (value) {
  102. case 'save':
  103. bool saveResult = await controller.document.save();
  104. debugPrint('ComPDFKit: save():$saveResult');
  105. break;
  106. case 'saveAs':
  107. // String? directory = await FilePicker.platform.getDirectoryPath();
  108. // if (directory != null) {
  109. // debugPrint('ComPDFKit: filePick:$directory');
  110. // String savePath = '${directory}/temp/${await controller.document.getFileName()}';
  111. // debugPrint('ComPDFKit:saveAs:$savePath');
  112. // bool saveResult = await controller.document.saveAs(savePath);
  113. // debugPrint('ComPDFKit:saveAs:Result:$saveResult');
  114. // }
  115. final tempDir = await ComPDFKit.getTemporaryDirectory();
  116. String savePath = '${tempDir.path}/temp/${await controller.document.getFileName()}';
  117. // only android platform
  118. // String? savePath = await ComPDFKit.createUri('aaa.pdf', childDirectoryName: 'compdfkit');
  119. debugPrint('ComPDFKit:saveAs:$savePath');
  120. bool saveResult = await controller.document.saveAs(savePath);
  121. debugPrint('ComPDFKit:saveAs:Result:$saveResult');
  122. break;
  123. case 'setScale':
  124. controller.setScale(1.5);
  125. double scaleValue = await controller.getScale();
  126. debugPrint('ComPDFKit:CPDFReaderWidget-getScale():$scaleValue');
  127. break;
  128. case 'setMargin':
  129. final Random random = Random();
  130. int value = random.nextInt(50);
  131. debugPrint('ComPDFKit:setMargin:$value');
  132. controller.setMargins(const CPDFEdgeInsets.only(
  133. left: 20, top: 20, right: 20, bottom: 20));
  134. break;
  135. case "setPageSpacing":
  136. await controller.setPageSpacing(20);
  137. break;
  138. case 'setDisplayPageIndex':
  139. int currentPageIndex = await controller.getCurrentPageIndex();
  140. debugPrint('ComPDFKit:getCurrentPageIndex:$currentPageIndex');
  141. int nextPageIndex = currentPageIndex + 1;
  142. controller.setDisplayPageIndex(nextPageIndex, animated: true);
  143. break;
  144. case 'setCoverPageMode':
  145. bool isCoverPageMode = await controller.isCoverPageMode();
  146. debugPrint('ComPDFKit:isCoverPageMode:$isCoverPageMode');
  147. controller.setCoverPageMode(!isCoverPageMode);
  148. break;
  149. case 'isChanged':
  150. bool hasChange = await controller.document.hasChange();
  151. debugPrint('ComPDFKit:hasChange:$hasChange');
  152. break;
  153. case "documentInfo":
  154. var document = controller.document;
  155. debugPrint(
  156. 'ComPDFKit:Document: fileName:${await document.getFileName()}');
  157. debugPrint(
  158. 'ComPDFKit:Document: checkOwnerUnlocked:${await document.checkOwnerUnlocked()}');
  159. debugPrint(
  160. 'ComPDFKit:Document: hasChange:${await document.hasChange()}');
  161. debugPrint(
  162. 'ComPDFKit:Document: isEncrypted:${await document.isEncrypted()}');
  163. debugPrint(
  164. 'ComPDFKit:Document: isImageDoc:${await document.isImageDoc()}');
  165. debugPrint(
  166. 'ComPDFKit:Document: getPermissions:${await document.getPermissions()}');
  167. debugPrint(
  168. 'ComPDFKit:Document: getPageCount:${await document.getPageCount()}');
  169. break;
  170. case "openDocument":
  171. String? path = await ComPDFKit.pickFile();
  172. if (path != null) {
  173. var document = controller.document;
  174. document.open(path, "");
  175. }
  176. break;
  177. case "importAnnotations":
  178. // android assets:
  179. // String? xfdfFile = "file:///android_asset/test.xfdf";
  180. // android file path sample:
  181. File xfdfFile = await extractAsset(context, 'pdfs/test.xfdf');
  182. // android Uri:
  183. //String xfdfFile = "content://xxx";
  184. bool result =
  185. await controller.document.importAnnotations(xfdfFile.path);
  186. debugPrint('ComPDFKit:Document: importAnnotations:$result');
  187. break;
  188. case "exportAnnotations":
  189. String xfdfPath = await controller.document.exportAnnotations();
  190. debugPrint('ComPDFKit:Document: exportAnnotations:$xfdfPath');
  191. break;
  192. case "removeAllAnnotations":
  193. await controller.document.removeAllAnnotations();
  194. break;
  195. case "removeSignFileList":
  196. bool result = await ComPDFKit.removeSignFileList();
  197. debugPrint('ComPDFKit:removeSignFileList:$result');
  198. break;
  199. case "PreviewMode":
  200. CPDFViewMode mode = await controller.getPreviewMode();
  201. if(mounted){
  202. CPDFViewMode? switchMode = await showModalBottomSheet(
  203. context: context,
  204. builder: (context) {
  205. return CpdfReaderWidgetSwitchPreviewModePage(viewMode: mode);
  206. });
  207. if (switchMode != null) {
  208. await controller.setPreviewMode(switchMode);
  209. }
  210. }
  211. break;
  212. case 'DisplaySetting':
  213. await controller.showDisplaySettingView();
  214. break;
  215. case 'Watermark':
  216. await controller.showAddWatermarkView();
  217. break;
  218. case 'Security':
  219. await controller.showSecurityView();
  220. break;
  221. case 'Thumbnail':
  222. await controller.showThumbnailView(true);
  223. break;
  224. case 'BOTA':
  225. await controller.showBotaView();
  226. break;
  227. case 'SnipMode':
  228. await controller.enterSnipMode();
  229. break;
  230. case 'ExitSnipMode':
  231. await controller.exitSnipMode();
  232. break;
  233. case 'print':
  234. await controller.document.printDocument();
  235. break;
  236. case 'DisplaySettingPage':
  237. await showModalBottomSheet(
  238. isScrollControlled: true,
  239. context: context,
  240. builder: (context) {
  241. return CpdfReaderWidgetDisplaySettingPage(controller: controller);
  242. });
  243. break;
  244. }
  245. }
  246. }
  247. var actions = [
  248. 'save',
  249. 'saveAs',
  250. 'openDocument',
  251. 'setScale',
  252. 'setPageSpacing',
  253. 'setMargin',
  254. 'setDisplayPageIndex',
  255. 'isChanged',
  256. 'documentInfo',
  257. 'importAnnotations',
  258. 'exportAnnotations',
  259. 'removeAllAnnotations',
  260. 'removeSignFileList',
  261. 'print'
  262. ];
  263. var actions1 = [
  264. 'PreviewMode',
  265. 'DisplaySettingPage',
  266. 'DisplaySetting',
  267. 'Watermark',
  268. 'Security',
  269. 'Thumbnail',
  270. 'BOTA',
  271. 'SnipMode',
  272. 'ExitSnipMode'
  273. ];
  274. Color randomColor() {
  275. final Random random = Random();
  276. return Color.fromARGB(
  277. 255, // Alpha value (fully opaque)
  278. random.nextInt(256), // Red value
  279. random.nextInt(256), // Green value
  280. random.nextInt(256), // Blue value
  281. );
  282. }