Browse Source

ReactNative - 修正Demo保存扁平化等文档命名问题,避免覆盖

liuxiaolong 1 day ago
parent
commit
a856e9fa31

+ 0 - 6
android/src/main/java/com/compdfkitpdf/reactnative/view/CPDFView.java

@@ -73,12 +73,6 @@ public class CPDFView extends FrameLayout {
     });
   }
 
-  @Override
-  public boolean dispatchTouchEvent(MotionEvent ev) {
-    super.dispatchTouchEvent(ev);
-    return true;
-  }
-
   public void setDocument(String document) {
     if (document.startsWith(CPDFDocumentUtil.ASSETS_SCHEME)) {
       this.document = CPDFDocumentUtil.getAssetsDocument(getContext(), document);

+ 8 - 0
android/src/main/java/com/compdfkitpdf/reactnative/viewmanager/CPDFViewManager.java

@@ -95,6 +95,14 @@ public class CPDFViewManager extends ViewGroupManager<CPDFView> {
 
     @Override
     public void onViewDetachedFromWindow(View v) {
+      CPDFView documentView = (CPDFView) v;
+      try {
+        CPDFReaderView readerView = documentView.getCPDFReaderView();
+        readerView.getContextMenuShowListener()
+          .dismissContextMenu();
+      } catch (Exception e) {
+        e.printStackTrace();
+      }
       mDocumentViews.remove(v.getId());
     }
   };

+ 12 - 7
example/src/CPDFPagesExample.tsx

@@ -16,6 +16,7 @@ import { MenuProvider, Menu, MenuTrigger, MenuOptions, MenuOption } from 'react-
 import { SafeAreaView } from 'react-native-safe-area-context';
 import RNFS from 'react-native-fs';
 import { CPDFImportDocumentScreen } from './screens/CPDFImportDocumentScreen';
+import { CPDFFileUtil } from './util/CPDFFileUtil';
 
 type RootStackParamList = {
     CPDFReaderViewExample: { document?: string };
@@ -69,17 +70,19 @@ const CPDFPagesExampleScreen = () => {
             case 'Split Document':
                 // const uri = await ComPDFKit.createUri('split_document_test.pdf', '', 'application/pdf')
 
-                const appCacheDirectory = RNFS.CachesDirectoryPath;
-                const savePath = appCacheDirectory + '/split_document_test.pdf';
+                const fileUtil = new CPDFFileUtil();
+                const baseName = 'split_document_test';
+                const extension = 'pdf';
+                const uniqueFilePath = await fileUtil.getUniqueFilePath(baseName, extension);
 
                 const pages = [0];
                 const splitResult = await pdfReaderRef.current?._pdfDocument.splitDocumentPages(
-                    savePath, pages
+                    uniqueFilePath, pages
                 )
                 console.log('ComPDFKitRN splitDocumentPages:', splitResult);
                 if (splitResult) {
-                    console.log('ComPDFKitRN splitDocumentPages: Split document saved at:', savePath);
-                    await pdfReaderRef?.current?._pdfDocument.open(savePath);
+                    console.log('ComPDFKitRN splitDocumentPages: Split document saved at:', uniqueFilePath);
+                    await pdfReaderRef?.current?._pdfDocument.open(uniqueFilePath);
                 }
                 break;
             default:
@@ -137,8 +140,10 @@ const CPDFPagesExampleScreen = () => {
                             onImport={async (document, pageRange, insertPosition) => {
                                 setImportModalVisible(false);
                                 const importResult = await pdfReaderRef.current?._pdfDocument.importDocument(
-                                    document, pageRange, insertPosition
-                                )
+                                    document, pageRange, insertPosition,
+                                ).catch((error) => {
+                                    console.log('ComPDFKitRN importDocument:', error.message);
+                                });
                                 console.log('ComPDFKitRN importDocument:', importResult);
                             }} />
                     </View>

+ 9 - 5
example/src/CPDFReaderViewControllerExample.tsx

@@ -17,6 +17,7 @@ import { SafeAreaView } from 'react-native-safe-area-context';
 import { CPDFDisplaySettingsScreen } from './screens/CPDFDisplaySettingsScreen';
 import { CPDFPreviewModeListScreen } from './screens/CPDFPreviewModeListScreen';
 import RNFS from 'react-native-fs';
+import { CPDFFileUtil } from './util/CPDFFileUtil';
 
 type RootStackParamList = {
     CPDFReaderViewExample: { document?: string };
@@ -111,13 +112,16 @@ const CPDFReaderViewControllerExampleScreen = () => {
                 handleSave();
                 break;
             case 'saveAs':
-                const appCacheDirectory = RNFS.CachesDirectoryPath;
-                const savePath = appCacheDirectory + '/save_as_test.pdf';
-
+                
+                const fileUtil = new CPDFFileUtil();
+                const baseName = 'save_as_test';
+                const extension = 'pdf';
+                const uniqueFilePath = await fileUtil.getUniqueFilePath(baseName, extension);
+                console.log('ComPDFKitRN saveAs:', uniqueFilePath);
                 // const androidUri = await ComPDFKit.createUri('save_as_test.pdf', '', 'application/pdf');
-                const success = await pdfReaderRef.current?._pdfDocument.saveAs(savePath, false, true);
+                const success = await pdfReaderRef.current?._pdfDocument.saveAs(uniqueFilePath, false, true);
                 if (success) {
-                    await pdfReaderRef.current?._pdfDocument.open(savePath, '');
+                    await pdfReaderRef.current?._pdfDocument.open(uniqueFilePath, '');
                 }
                 console.log('ComPDFKitRN saveAs:', success);
                 break;

+ 9 - 4
example/src/CPDFSecurityExample.tsx

@@ -15,6 +15,7 @@ import { HeaderBackButton } from '@react-navigation/elements';
 import { MenuProvider, Menu, MenuTrigger, MenuOptions, MenuOption } from 'react-native-popup-menu';
 import { SafeAreaView } from 'react-native-safe-area-context';
 import RNFS from 'react-native-fs';
+import { CPDFFileUtil } from './util/CPDFFileUtil';
 
 type RootStackParamList = {
     CPDFReaderViewExample: { document?: string };
@@ -62,19 +63,23 @@ const CPDFSecurityExampleScreen = () => {
                 break;
             case 'Flatten All Pages':
 
-                const appCacheDirectory = RNFS.CachesDirectoryPath;
-                const savePath = appCacheDirectory + '/flattened.pdf';
+                const fileUtil = new CPDFFileUtil();
+                const baseName = 'flattened';
+                const extension = 'pdf';
+
+                const uniqueFilePath = await fileUtil.getUniqueFilePath(baseName, extension);
 
                 // only android platform
                 // const savePath = await ComPDFKit.createUri('rn_flatten_test.pdf', 'compdfkit', 'application/pdf');
 
-                const flattenResult = await document?.flattenAllPages(savePath, true)
+                const flattenResult = await document?.flattenAllPages(uniqueFilePath, true)
                 .catch(error => {
                     console.log('ComPDFKit-RN flattenAllPages error:', error);
                 });
                 console.log('ComPDFKit-RN flattenAllPages:', flattenResult);
+                console.log('ComPDFKit-RN uniqueFilePath:', uniqueFilePath);
                 if(flattenResult){
-                    pdfReaderRef?.current?._pdfDocument?.open(savePath)
+                    pdfReaderRef?.current?._pdfDocument?.open(uniqueFilePath)
                 }
                 break;
             case 'Document Info':

+ 1 - 9
example/src/screens/CPDFImportDocumentScreen.tsx

@@ -103,7 +103,7 @@ export const CPDFImportDocumentScreen: React.FC<CPDFImportDocumentScreenProps> =
                                                     console.log('insertTo page is empty----->')
                                                     return;
                                                 }
-                                                insertPosition = (Number(insertTo) + 1);
+                                                insertPosition = (Number(insertTo));
                                                 break;
                                         }
                                         console.log('InsertDocumentInfo:', {
@@ -140,14 +140,6 @@ export const CPDFImportDocumentScreen: React.FC<CPDFImportDocumentScreenProps> =
                                                 return;
                                             }
                                             setDocument(file);
-
-
-                                            // const pages = [0];
-                                            // const insertPosition = 0;
-                                            // const importResult = await pdfReaderRef.current?._pdfDocument.importDocument(
-                                            //     path,pages, insertPosition
-                                            // )
-                                            // console.log('ComPDFKitRN importDocument:', importResult);
                                         })
                                     }}>
                                         <View style={{ flexDirection: 'row', alignItems: 'center' }}>

+ 1 - 3
example/src/screens/HomeScreen.tsx

@@ -34,12 +34,10 @@ class HomeScreen extends Component<Props> {
   componentDidMount() {
     this.focusListener = this.props.navigation.addListener('focus', () => {
       this.setState({ isFocused: true });
-      console.log('HomeScreen 进入前台');
     });
 
     this.blurListener = this.props.navigation.addListener('blur', () => {
       this.setState({ isFocused: false });
-      console.log('HomeScreen 离开前台');
     });
   }
 
@@ -69,7 +67,7 @@ class HomeScreen extends Component<Props> {
           style={styles.funItem} onPress={() => {
             if (this.state.isFocused) {
               item.action(this);
-            } 
+            }
           }}>
           <Image source={require('../../assets/view.png')} style={styles.itemIcon} />
           <View style={{ flexDirection: 'column', flex: 1 }}>

+ 23 - 0
example/src/util/CPDFFileUtil.tsx

@@ -0,0 +1,23 @@
+import * as RNFS from 'react-native-fs';
+
+export class CPDFFileUtil {
+
+    private cacheDirectory: string;
+
+    constructor(cacheDirectory: string = RNFS.CachesDirectoryPath) {
+        this.cacheDirectory = cacheDirectory;
+    }
+
+    async getUniqueFilePath(baseName: string, extension: string): Promise<string> {
+        let counter = 1;
+        let filePath = `${this.cacheDirectory}/${baseName}.${extension}`;
+
+        while (await RNFS.exists(filePath)) {
+            filePath = `${this.cacheDirectory}/${baseName}(${counter}).${extension}`;
+            counter++;
+        }
+
+        return filePath;
+    }
+
+}