diff --git a/assets/fonts/NotoSansSC-Regular.ttf b/assets/fonts/NotoSansSC-Regular.ttf new file mode 100644 index 000000000..176f1134e Binary files /dev/null and b/assets/fonts/NotoSansSC-Regular.ttf differ diff --git a/lib/modules/meeting/views/bottomSheet/share_bottom_sheet.dart b/lib/modules/meeting/views/bottomSheet/share_bottom_sheet.dart index 19a6144eb..706a5a2a5 100644 --- a/lib/modules/meeting/views/bottomSheet/share_bottom_sheet.dart +++ b/lib/modules/meeting/views/bottomSheet/share_bottom_sheet.dart @@ -7,6 +7,7 @@ import 'package:flutter_easyloading/flutter_easyloading.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; +import 'package:htmltopdfwidgets/htmltopdfwidgets.dart' as pdf; import 'package:path_provider/path_provider.dart'; import 'package:share_plus/share_plus.dart'; import 'package:webview_flutter/webview_flutter.dart'; @@ -158,6 +159,7 @@ class _ShareBottomSheetState extends State { '导出为', (int index) async { if (index == 0) { + // 导出TXT final tempDir = await getTemporaryDirectory(); final file = File( @@ -165,7 +167,10 @@ class _ShareBottomSheetState extends State { await file.writeAsString(_controller .meetingDetails.value.summary); _share(file.path, '分享会议总结'); - } else {} + } else { + // 导出PDF + _exportMarkdownPdf(); + } }, const [ { @@ -286,7 +291,7 @@ class _ShareBottomSheetState extends State { ); } - void _share(String filepath, String title) async { + Future _share(String filepath, String title) async { final result = await SharePlus.instance.share(ShareParams( text: title, files: [XFile(filepath)], @@ -332,4 +337,26 @@ class _ShareBottomSheetState extends State { await file.writeAsBytes(byteData.buffer.asUint8List()); return XFile(file.path); } + + Future _exportMarkdownPdf() async { + EasyLoading.show(status: '正在导出PDF...'); + final tempDir = await getTemporaryDirectory(); + final file = File( + '${tempDir.path}/${_controller.meetingData.value.title}_summary.pdf'); + final List markdownWidgets = + await pdf.HTMLToPdf().convertMarkdown( + _controller.meetingDetails.value.summary, + fontFallback: [ + pdf.Font.ttf( + await rootBundle.load('assets/fonts/NotoSansSC-Regular.ttf')), + ], + ); + final markdownPdf = pdf.Document(); + markdownPdf.addPage(pdf.MultiPage( + build: (context) => markdownWidgets, + )); + await file.writeAsBytes(await markdownPdf.save()); + await _share(file.path, '分享会议总结'); + EasyLoading.dismiss(); + } } diff --git a/pubspec.yaml b/pubspec.yaml index 5cb80d6b3..f8599be53 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -25,6 +25,7 @@ dependencies: markdown: ^7.1.1 fleather: ^1.24.0+1 parchment: ^1.24.0 + htmltopdfwidgets: ^1.1.0 wifi_iot: ^0.3.19+2 permission_handler: ^10.4.5 web_socket_channel: ^2.4.0 @@ -134,6 +135,7 @@ flutter: - assets/images/explore1.png - assets/images/explore2.jpg - assets/images/mine-background.png + - assets/fonts/NotoSansSC-Regular.ttf - assets/lottie/ - assets/js/ - .env