Преглед на файлове

fix(pdf): 修正 PDF 预览模糊问题 #0015051

gavin.chen преди 1 година
родител
ревизия
130ed0b4ae
променени са 6 файла, в които са добавени 134 реда и са изтрити 54 реда
  1. 36 0
      lib/pdf_helper.dart
  2. 44 42
      lib/pdf_relevant_helper.dart
  3. 11 5
      lib/pdf_render_container.dart
  4. 34 6
      lib/report_render.dart
  5. 7 1
      lib/ultils/pdf_render_factory.dart
  6. 2 0
      pubspec.yaml

+ 36 - 0
lib/pdf_helper.dart

@@ -8,6 +8,7 @@ import 'package:pdf/pdf.dart';
 import 'package:fis_lib_print/printing.dart';
 import 'package:fis_common/env/env.dart';
 import 'package:fis_common/js_plateform/js_platform.dart';
+import 'package:http/http.dart' as http;
 
 /// PDF 各项功能【打印】【导出】
 class PDFHelper {
@@ -50,6 +51,17 @@ class PDFHelper {
     }
   }
 
+  /// 打印文件格式的 PDF
+  static void printPDFFile(String fileName, String fileUrl) async {
+    try {
+      ResourcesCache.clearCachedPDF();
+      var bytes = await downloadFile(fileUrl);
+      _handelPrint(bytes);
+    } catch (e) {
+      debugPrint(e.toString());
+    }
+  }
+
   /// 下载(导出)图片格式 PDF【在壳子环境下会调用壳子提供的文件导出能力】
   static void downloadPDFJpges(
     String fileName,
@@ -65,6 +77,30 @@ class PDFHelper {
     }
   }
 
+  /// 下载(导出)文件格式 PDF【在壳子环境下会调用壳子提供的文件导出能力】
+  static void downloadPDFFile(
+    String fileName,
+    String fileUrl,
+    Future<bool> Function(List<int> data, String fileName)? pdfExporter,
+  ) async {
+    try {
+      ResourcesCache.clearCachedPDF();
+      var bytes = await downloadFile(fileUrl);
+      _handelDownload(bytes, fileName, pdfExporter);
+    } catch (e) {
+      debugPrint(e.toString());
+    }
+  }
+
+  static Future<Uint8List> downloadFile(String fileUrl) async {
+    var response = await http.get(Uri.parse(fileUrl));
+    if (response.statusCode == 200) {
+      return response.bodyBytes;
+    } else {
+      throw Exception('Failed to download file');
+    }
+  }
+
   /// 处理打印的细节
   static void _handelPrint(Uint8List bytes) {
     var base64 = base64Encode(bytes);

+ 44 - 42
lib/pdf_relevant_helper.dart

@@ -1,45 +1,47 @@
-import 'dart:async';
-import 'dart:typed_data';
-import 'package:fis_lib_pdf/ultils/pdf_type_enum.dart';
-import 'package:fis_lib_pdf/ultils/recources_catch.dart';
-import 'package:pdf/pdf.dart';
-import 'package:fis_lib_print/printing.dart';
-import 'ultils/pdf_render_factory.dart';
+// import 'dart:async';
+// import 'dart:typed_data';
+// import 'package:fis_lib_pdf/ultils/pdf_type_enum.dart';
+// import 'package:fis_lib_pdf/ultils/recources_catch.dart';
+// import 'package:pdf/pdf.dart';
+// import 'package:fis_lib_print/printing.dart';
+// import 'ultils/pdf_render_factory.dart';
 
-///PDF相关的操作方法
-///打印、下载、导出等
-class PDFRelevantHelper {
-  ///根据指定二进制文件打印PDF
-  static Future<void> printByGivenPDFBytes(
-      String fileName, Uint8List pdfBytes, PdfPageFormat pdfPageFormat) async {
-    ResourcesCache.currentGivenPDFBinaryFile = pdfBytes;
-    await Printing.layoutPdf(
-      onLayout: (format) => PDFRenderFactory.GetPDFRenderByPDFTypeEnum(
-          PDFTypeEnum.pdfBytes)(format),
-      name: fileName,
-      format: pdfPageFormat,
-      dynamicLayout: true,
-      usePrinterSettings: false,
-    );
-  }
+/// FIXME 2023-12-20 发现该类无引用,暂时屏蔽
+/// PDF相关的操作方法
+/// 打印、下载、导出等
 
-  ///根据指定二进制文件下载PDF (仅web有效)
-  static Future<void> downloadByGivenPDFBytes(
-      String fileName, Uint8List pdfBytes) async {
-    ResourcesCache.currentGivenPDFBinaryFile = pdfBytes;
-    await Printing.sharePdf(
-      bytes: pdfBytes,
-      filename: fileName,
-    );
-  }
+// class PDFRelevantHelper {
+//   ///根据指定二进制文件打印PDF
+//   static Future<void> printByGivenPDFBytes(
+//       String fileName, Uint8List pdfBytes, PdfPageFormat pdfPageFormat) async {
+//     ResourcesCache.currentGivenPDFBinaryFile = pdfBytes;
+//     await Printing.layoutPdf(
+//       onLayout: (format) => PDFRenderFactory.GetPDFRenderByPDFTypeEnum(
+//           PDFTypeEnum.pdfBytes)(format),
+//       name: fileName,
+//       format: pdfPageFormat,
+//       dynamicLayout: true,
+//       usePrinterSettings: false,
+//     );
+//   }
 
-  ///调用导出回调函数实现壳子内的导出业务
-  static Future<void> exportByGivenPDFBytes(
-      String fileName, Uint8List pdfBytes) async {
-    ResourcesCache.currentGivenPDFBinaryFile = pdfBytes;
-    await Printing.sharePdf(
-      bytes: pdfBytes,
-      filename: fileName,
-    );
-  }
-}
+//   ///根据指定二进制文件下载PDF (仅web有效)
+//   static Future<void> downloadByGivenPDFBytes(
+//       String fileName, Uint8List pdfBytes) async {
+//     ResourcesCache.currentGivenPDFBinaryFile = pdfBytes;
+//     await Printing.sharePdf(
+//       bytes: pdfBytes,
+//       filename: fileName,
+//     );
+//   }
+
+//   ///调用导出回调函数实现壳子内的导出业务
+//   static Future<void> exportByGivenPDFBytes(
+//       String fileName, Uint8List pdfBytes) async {
+//     ResourcesCache.currentGivenPDFBinaryFile = pdfBytes;
+//     await Printing.sharePdf(
+//       bytes: pdfBytes,
+//       filename: fileName,
+//     );
+//   }
+// }

+ 11 - 5
lib/pdf_render_container.dart

@@ -35,7 +35,7 @@ class FPDFRenderContainer extends StatefulWidget implements FWidget {
   final Future<Uint8List?> Function(String fileName)? cacheGet;
   final bool useActionBar;
   final bool fromEditor;
-  final List<String>? jpgReports;
+  final List<String>? imageOrFileUrls;
   const FPDFRenderContainer({
     Key? key,
     required this.pdfTypeEnum,
@@ -48,7 +48,7 @@ class FPDFRenderContainer extends StatefulWidget implements FWidget {
     this.webSideShare,
     this.fileName = "document.pdf",
     this.useActionBar = true,
-    this.jpgReports,
+    this.imageOrFileUrls,
     this.onClose,
   }) : super(key: key);
 
@@ -203,9 +203,9 @@ class FPDFRenderContainerState extends State<FPDFRenderContainer>
                 isReleaseMobile ? MediaQuery.of(context).size.width : _scale,
             onZoom: _onZoomInOrOut,
             build: (format) =>
-                PDFRenderFactory.GetPDFRenderByPDFTypeEnum(widget.pdfTypeEnum)!(
+                PDFRenderFactory.GetPDFRenderByPDFTypeEnum(widget.pdfTypeEnum)(
               format,
-              widget.jpgReports,
+              widget.imageOrFileUrls,
             ),
             usesrDefinedActions: isReleaseMobile ? null : actions,
             scrollViewDecoration: _getPdfDecoration(),
@@ -213,6 +213,7 @@ class FPDFRenderContainerState extends State<FPDFRenderContainer>
             allowSharing: !widget.fromEditor,
             onWebSideShare: widget.webSideShare,
             isReleaseMobile: isReleaseMobile,
+            dpi: 300, // 用于解决 PC 客户端下字体模糊的问题
           ),
         )
       ],
@@ -249,8 +250,13 @@ class FPDFRenderContainerState extends State<FPDFRenderContainer>
 
   Future<Uint8List> _getPDFRenderMethod() async {
     if (widget.pdfTypeEnum == PDFTypeEnum.pdfJpeg) {
-      return await generateByGivenPDFJpges(PdfPageFormat.a4, widget.jpgReports);
+      return await generateByGivenPDFJpges(
+          PdfPageFormat.a4, widget.imageOrFileUrls);
+    } else if (widget.pdfTypeEnum == PDFTypeEnum.pdfBytes) {
+      return await generateByGivenPDFBytes(
+          PdfPageFormat.a4, widget.imageOrFileUrls);
     } else {
+      /// 从内存内的 报告内容生成 并缓存 可以用于下次下载
       return await generateReport(PdfPageFormat.a4, null);
     }
   }

+ 34 - 6
lib/report_render.dart

@@ -1,6 +1,7 @@
 import 'dart:typed_data';
 
 import 'package:fis_lib_pdf/ultils/pdf_type_enum.dart';
+import 'package:flutter/material.dart';
 import 'package:pdf/pdf.dart';
 import 'package:pdf/widgets.dart' as pw;
 
@@ -9,9 +10,11 @@ import 'package:fis_lib_report/report_info/report_info.dart';
 
 import 'pdf_objects/pdf_page.dart';
 
+import 'package:http/http.dart' as http;
+
 /// 根据报告页面格式生成报告pdf
 Future<Uint8List> generateReport(
-    PdfPageFormat pageFormat, List<String>? jpegReportsUrls) async {
+    PdfPageFormat pageFormat, List<String>? imageOrFileUrls) async {
   final theme = pw.ThemeData.base();
   await ResourcesCache.cacheDefaultFont("defaultCN");
   await ResourcesCache.cacheAllCloudImages(FReportInfo.instance);
@@ -28,15 +31,31 @@ Future<Uint8List> generateReport(
 
 /// 根据报告页面格式生成报告pdf
 Future<Uint8List> generateByGivenPDFBytes(
-    PdfPageFormat pageFormat, List<String>? jpegReportsUrls) async {
-  return ResourcesCache.currentGivenPDFBinaryFile!;
+    PdfPageFormat pageFormat, List<String>? imageOrFileUrls) async {
+  Uint8List bytes = Uint8List(0);
+  if (imageOrFileUrls != null && imageOrFileUrls.isNotEmpty) {
+    String fileUrl = imageOrFileUrls[0];
+    var cachedDoc = ResourcesCache.getCachedPDFBinarys();
+    if (cachedDoc != null) {
+      return cachedDoc;
+    }
+    try {
+      // getCachedPDFBinarys
+      bytes = await _downloadFile(fileUrl);
+      ResourcesCache.cachePDFBinarys(bytes);
+    } catch (e) {
+      debugPrint(e.toString());
+    }
+  }
+
+  return bytes;
 }
 
 Future<Uint8List> generateByGivenPDFJpges(
-    PdfPageFormat pageFormat, List<String>? jpegReportsUrls) async {
-  await ResourcesCache.cacheNetworkResources(jpegReportsUrls!);
+    PdfPageFormat pageFormat, List<String>? imageOrFileUrls) async {
+  await ResourcesCache.cacheNetworkResources(imageOrFileUrls!);
   var pdfPage =
-      await PdfPageCreator.getPageFromJPGE(jpegReportsUrls, pageFormat);
+      await PdfPageCreator.getPageFromJPGE(imageOrFileUrls, pageFormat);
   return await _getPDFBinary(pdfPage);
 }
 
@@ -51,3 +70,12 @@ Future<Uint8List> _getPDFBinary(pw.Document document) async {
     return data;
   }
 }
+
+Future<Uint8List> _downloadFile(String fileUrl) async {
+  var response = await http.get(Uri.parse(fileUrl));
+  if (response.statusCode == 200) {
+    return response.bodyBytes;
+  } else {
+    throw Exception('Failed to download file');
+  }
+}

+ 7 - 1
lib/ultils/pdf_render_factory.dart

@@ -1,11 +1,16 @@
 // ignore_for_file: non_constant_identifier_names
+import 'dart:typed_data';
+
 import 'package:fis_lib_pdf/report_render.dart';
 import 'package:fis_lib_pdf/ultils/pdf_type_enum.dart';
+import 'package:pdf/pdf.dart';
 
 /// PDF渲染函数工厂
 class PDFRenderFactory {
   //根据具体的Pdf枚举类型返回不同的pdf文档函数
-  static GetPDFRenderByPDFTypeEnum(PDFTypeEnum pdfTypeEnum) {
+  static Future<Uint8List> Function(
+          PdfPageFormat pageFormat, List<String>? jpegReportsUrls)
+      GetPDFRenderByPDFTypeEnum(PDFTypeEnum pdfTypeEnum) {
     if (pdfTypeEnum == PDFTypeEnum.report) {
       return generateReport;
     }
@@ -15,5 +20,6 @@ class PDFRenderFactory {
     if (pdfTypeEnum == PDFTypeEnum.pdfJpeg) {
       return generateByGivenPDFJpges;
     }
+    return generateReport;
   }
 }

+ 2 - 0
pubspec.yaml

@@ -38,6 +38,7 @@ dependencies:
   # open_file: ^3.2.1
   path_provider: ^2.0.2
   intl: 0.17.0
+  http: 0.13.4
 dependency_overrides:
   flutter_typeahead: 4.1.1
   fis_common:
@@ -83,6 +84,7 @@ dependency_overrides:
     git:
       url: http://git.ius.plus:88/Project-Wing/fis_lib_business_components.git
       ref: "5897e06"
+  
 dev_dependencies:
   flutter_test:
     sdk: flutter