cpdf_reader_widget_controller_example.dart 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. // Copyright © 2014-2024 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/util/extension/cpdf_color_extension.dart';
  13. import 'package:compdfkit_flutter/widgets/cpdf_reader_widget.dart';
  14. import 'package:compdfkit_flutter/widgets/cpdf_reader_widget_controller.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 canScale = true;
  30. bool pageSameWidth = true;
  31. bool isFixedScroll = false;
  32. @override
  33. Widget build(BuildContext context) {
  34. return Scaffold(
  35. resizeToAvoidBottomInset: false,
  36. appBar: AppBar(
  37. title: const Text('CPDFReaderWidget Example'),
  38. leading: IconButton(
  39. onPressed: () {
  40. _save();
  41. Navigator.pop(context);
  42. },
  43. icon: const Icon(Icons.arrow_back)),
  44. actions: null == _controller ? null : _buildAppBarActions(context),
  45. ),
  46. body: CPDFReaderWidget(
  47. document: widget.documentPath,
  48. configuration: CPDFConfiguration(
  49. toolbarConfig: const CPDFToolbarConfig(
  50. iosLeftBarAvailableActions: [
  51. CPDFToolbarAction.thumbnail
  52. ])),
  53. onCreated: (controller) {
  54. setState(() {
  55. _controller = controller;
  56. });
  57. },
  58. onPageChanged: (pageIndex) {
  59. debugPrint('pageIndex:$pageIndex');
  60. },
  61. onSaveCallback: () {
  62. debugPrint('CPDFDocument: save success');
  63. },
  64. ));
  65. }
  66. void _save() async {
  67. bool saveResult = await _controller!.document.save();
  68. debugPrint('ComPDFKit-Flutter: saveResult:$saveResult');
  69. }
  70. List<Widget> _buildAppBarActions(BuildContext context) {
  71. return [
  72. PopupMenuButton<String>(
  73. icon: const Icon(Icons.settings),
  74. onSelected: (value) {
  75. handleClick(value, _controller!);
  76. },
  77. itemBuilder: (context) {
  78. return actions1.map((action) {
  79. return PopupMenuItem(
  80. value: action,
  81. child: Text(action),
  82. );
  83. }).toList();
  84. },
  85. ),
  86. PopupMenuButton<String>(
  87. onSelected: (value) {
  88. handleClick(value, _controller!);
  89. },
  90. itemBuilder: (context) {
  91. return actions.map((action) {
  92. return PopupMenuItem(
  93. value: action,
  94. child: Text(action),
  95. );
  96. }).toList();
  97. },
  98. ),
  99. ];
  100. }
  101. void handleClick(String value, CPDFReaderWidgetController controller) async {
  102. switch (value) {
  103. case 'save':
  104. bool saveResult = await controller.document.save();
  105. debugPrint('ComPDFKit: save():$saveResult');
  106. break;
  107. case 'saveAs':
  108. // String? directory = await FilePicker.platform.getDirectoryPath();
  109. // if (directory != null) {
  110. // debugPrint('ComPDFKit: filePick:$directory');
  111. // String savePath = '${directory}/temp/${await controller.document.getFileName()}';
  112. // debugPrint('ComPDFKit:saveAs:$savePath');
  113. // bool saveResult = await controller.document.saveAs(savePath);
  114. // debugPrint('ComPDFKit:saveAs:Result:$saveResult');
  115. // }
  116. final tempDir = await ComPDFKit.getTemporaryDirectory();
  117. String savePath = '${tempDir.path}/temp/${await controller.document.getFileName()}';
  118. // only android platform
  119. // String? savePath = await ComPDFKit.createUri('aaa.pdf', childDirectoryName: 'compdfkit');
  120. debugPrint('ComPDFKit:saveAs:$savePath');
  121. bool saveResult = await controller.document.saveAs(savePath);
  122. debugPrint('ComPDFKit:saveAs:Result:$saveResult');
  123. break;
  124. case 'setScale':
  125. controller.setScale(1.5);
  126. double scaleValue = await controller.getScale();
  127. debugPrint('ComPDFKit:CPDFReaderWidget-getScale():$scaleValue');
  128. break;
  129. case 'setCanScale':
  130. canScale = !canScale;
  131. await controller.setCanScale(canScale);
  132. break;
  133. case 'setFormHighlight':
  134. bool isFormFieldHighlight = await controller.isFormFieldHighlight();
  135. debugPrint('ComPDFKit:isFormFieldHighlight:$isFormFieldHighlight');
  136. controller.setFormFieldHighlight(!isFormFieldHighlight);
  137. break;
  138. case 'setLinkHighlight':
  139. bool isLinkHighlight = await controller.isLinkHighlight();
  140. debugPrint('ComPDFKit:isLinkHighlight:$isLinkHighlight');
  141. controller.setLinkHighlight(!isLinkHighlight);
  142. break;
  143. case 'setVerticalMode':
  144. bool isVerticalMode = await controller.isVerticalMode();
  145. debugPrint('ComPDFKit:isVerticalMode:$isVerticalMode');
  146. controller.setVerticalMode(!isVerticalMode);
  147. break;
  148. case 'setMargin':
  149. final Random random = Random();
  150. int value = random.nextInt(50);
  151. debugPrint('ComPDFKit:setMargin:$value');
  152. controller.setMargins(const CPDFEdgeInsets.only(
  153. left: 20, top: 20, right: 20, bottom: 20));
  154. break;
  155. case "setPageSpacing":
  156. await controller.setPageSpacing(20);
  157. break;
  158. case 'setContinueMode':
  159. bool isContinueMode = await controller.isContinueMode();
  160. debugPrint('ComPDFKit:isContinueMode:$isContinueMode');
  161. controller.setContinueMode(!isContinueMode);
  162. break;
  163. case 'setDoublePageMode':
  164. bool isDoublePageMode = await controller.isDoublePageMode();
  165. debugPrint('ComPDFKit:isDoublePageMode:$isDoublePageMode');
  166. controller.setDoublePageMode(!isDoublePageMode);
  167. break;
  168. case 'setCropMode':
  169. bool isCropMode = await controller.isCropMode();
  170. debugPrint('ComPDFKit:isCropMode:$isCropMode');
  171. controller.setCropMode(!isCropMode);
  172. break;
  173. case 'setDisplayPageIndex':
  174. int currentPageIndex = await controller.getCurrentPageIndex();
  175. debugPrint('ComPDFKit:getCurrentPageIndex:$currentPageIndex');
  176. int nextPageIndex = currentPageIndex + 1;
  177. controller.setDisplayPageIndex(nextPageIndex, animated: true);
  178. break;
  179. case 'setCoverPageMode':
  180. bool isCoverPageMode = await controller.isCoverPageMode();
  181. debugPrint('ComPDFKit:isCoverPageMode:$isCoverPageMode');
  182. controller.setCoverPageMode(!isCoverPageMode);
  183. break;
  184. case 'setReadBackgroundColor':
  185. var currentReadBackgroundColor =
  186. await controller.getReadBackgroundColor();
  187. debugPrint('readBackgroundColor:${currentReadBackgroundColor.toHex()}');
  188. await controller.setReadBackgroundColor(CPDFThemes.dark);
  189. break;
  190. case 'isChanged':
  191. bool hasChange = await controller.document.hasChange();
  192. debugPrint('ComPDFKit:hasChange:$hasChange');
  193. break;
  194. case "documentInfo":
  195. var document = controller.document;
  196. debugPrint(
  197. 'ComPDFKit:Document: fileName:${await document.getFileName()}');
  198. debugPrint(
  199. 'ComPDFKit:Document: checkOwnerUnlocked:${await document.checkOwnerUnlocked()}');
  200. debugPrint(
  201. 'ComPDFKit:Document: hasChange:${await document.hasChange()}');
  202. debugPrint(
  203. 'ComPDFKit:Document: isEncrypted:${await document.isEncrypted()}');
  204. debugPrint(
  205. 'ComPDFKit:Document: isImageDoc:${await document.isImageDoc()}');
  206. debugPrint(
  207. 'ComPDFKit:Document: getPermissions:${await document.getPermissions()}');
  208. debugPrint(
  209. 'ComPDFKit:Document: getPageCount:${await document.getPageCount()}');
  210. break;
  211. case "openDocument":
  212. String? path = await ComPDFKit.pickFile();
  213. if (path != null) {
  214. var document = controller.document;
  215. document.open(path, "");
  216. }
  217. break;
  218. case "importAnnotations":
  219. // android assets:
  220. // String? xfdfFile = "file:///android_asset/test.xfdf";
  221. // android file path sample:
  222. File xfdfFile = await extractAsset(context, 'pdfs/test.xfdf');
  223. // android Uri:
  224. //String xfdfFile = "content://xxx";
  225. bool result =
  226. await controller.document.importAnnotations(xfdfFile.path);
  227. debugPrint('ComPDFKit:Document: importAnnotations:$result');
  228. break;
  229. case "exportAnnotations":
  230. String xfdfPath = await controller.document.exportAnnotations();
  231. debugPrint('ComPDFKit:Document: exportAnnotations:$xfdfPath');
  232. break;
  233. case "removeAllAnnotations":
  234. await controller.document.removeAllAnnotations();
  235. break;
  236. case "removeSignFileList":
  237. bool result = await ComPDFKit.removeSignFileList();
  238. debugPrint('ComPDFKit:removeSignFileList:$result');
  239. break;
  240. case "PreviewMode":
  241. CPDFViewMode mode = await controller.getPreviewMode();
  242. if(mounted){
  243. CPDFViewMode? switchMode = await showModalBottomSheet(
  244. context: context,
  245. builder: (context) {
  246. return CpdfReaderWidgetSwitchPreviewModePage(viewMode: mode);
  247. });
  248. if (switchMode != null) {
  249. await controller.setPreviewMode(switchMode);
  250. }
  251. }
  252. break;
  253. case 'DisplaySetting':
  254. await controller.showDisplaySettingView();
  255. break;
  256. case 'Watermark':
  257. await controller.showAddWatermarkView();
  258. break;
  259. case 'Security':
  260. await controller.showSecurityView();
  261. break;
  262. case 'Thumbnail':
  263. await controller.showThumbnailView(true);
  264. break;
  265. case 'BOTA':
  266. await controller.showBotaView();
  267. break;
  268. case 'SnipMode':
  269. await controller.enterSnipMode();
  270. break;
  271. case 'ExitSnipMode':
  272. await controller.exitSnipMode();
  273. break;
  274. case 'print':
  275. await controller.document.printDocument();
  276. break;
  277. }
  278. }
  279. }
  280. var actions = [
  281. 'save',
  282. 'saveAs',
  283. 'openDocument',
  284. 'setScale',
  285. 'setPageSpacing',
  286. 'setReadBackgroundColor',
  287. 'setFormHighlight',
  288. 'setLinkHighlight',
  289. 'setVerticalMode',
  290. 'setMargin',
  291. 'setContinueMode',
  292. 'setDoublePageMode',
  293. 'setCropMode',
  294. 'setDisplayPageIndex',
  295. 'setCoverPageMode',
  296. 'isChanged',
  297. 'documentInfo',
  298. 'importAnnotations',
  299. 'exportAnnotations',
  300. 'removeAllAnnotations',
  301. 'removeSignFileList',
  302. 'print'
  303. ];
  304. var actions1 = [
  305. 'PreviewMode',
  306. 'DisplaySetting',
  307. 'Watermark',
  308. 'Security',
  309. 'Thumbnail',
  310. 'BOTA',
  311. 'SnipMode',
  312. 'ExitSnipMode'
  313. ];
  314. Color randomColor() {
  315. final Random random = Random();
  316. return Color.fromARGB(
  317. 255, // Alpha value (fully opaque)
  318. random.nextInt(256), // Red value
  319. random.nextInt(256), // Green value
  320. random.nextInt(256), // Blue value
  321. );
  322. }