App.tsx 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. /**
  2. * Copyright © 2014-2025 PDF Technologies, Inc. All Rights Reserved.
  3. *
  4. * THIS SOURCE CODE AND ANY ACCOMPANYING DOCUMENTATION ARE PROTECTED BY INTERNATIONAL COPYRIGHT LAW
  5. * AND MAY NOT BE RESOLD OR REDISTRIBUTED. USAGE IS BOUND TO THE ComPDFKit LICENSE AGREEMENT.
  6. * UNAUTHORIZED REPRODUCTION OR DISTRIBUTION IS SUBJECT TO CIVIL AND CRIMINAL PENALTIES.
  7. * This notice may not be removed from this file.
  8. */
  9. import React, { Component } from 'react';
  10. import { Image, Platform, TouchableOpacity } from 'react-native';
  11. import { ComPDFKit } from '@compdfkit_pdf_sdk/react_native';
  12. import { NavigationContainer } from '@react-navigation/native';
  13. import { createNativeStackNavigator } from '@react-navigation/native-stack';
  14. import RNFS from 'react-native-fs';
  15. import HomeScreen from './src/screens/HomeScreen';
  16. import CPDFReaderViewExampleScreen from './src/CPDFReaderViewExample';
  17. import SettingScreen from './src/screens/SettingScreen';
  18. import CPDFReaderViewControllerExampleScreen from './src/CPDFReaderViewControllerExample';
  19. import CPDFAnnotationsExampleScreen from './src/CPDFAnnotationsExample';
  20. import CPDFSecurityExampleScreen from './src/CPDFSecurityExample';
  21. import CPDFPagesExampleScreen from './src/CPDFPagesExample';
  22. import CPDFWidgetsExampleScreen from './src/CPDFWidgetsExample';
  23. var androidLicense = "c4r34cNxld6pdUSsM2EgGQ9purMEZN7JuumHbNx9w+OJ6lYqF7WRYAFV0jvA5CEEX7J1+wGrF68mo8YP3qL5b6lmS60TMw2/wJ+TPtmeKkJMRMaiQ2nF2pwSevBj2HIHbnTLfr2btYHL/TRKFbfG0SUp/tZVjUwOC91rcrlaLkThWpc13/3SOi/34uHyjQszJ6PmDeg8X+qxfNheOBX/JZofPOjKpWpAAXXKT9kgtbZKKc6VAmMPAdRth7FnJjPieXkHkvW3fX2kNcgX6cb8IBnu/7Q3C4776P6IVIQKlDItMGNJIV7IPMADRnsLMqdC9FZcF3mV0laocg8qlFuKdmu0lH1oY17eVN2TRW5amzrVRSqpTOyx2LGvW1Ilra90nzlp2dEBHH+rU3Jo93jy94eWecFWMwgKBD5sABvhJFteiZTpP6NufkmmJm5UhS1bbWwQ3416ecpKs8D9TAlLLO+rbIocuxdoPE2dxWFYLq6zF8kJV3z7dKYtAwQKdoQiS08ryGXVZybCx2GjZp97I7zNemiorRWKQUrxpNk0vCLwL1yz7NzjlB6YQ8UxvmTkX/GU7T7Ubg9LoyZuVo4tLHLplMSlHIcA4guqZL7JbQ6/jomhcJGFpGo+X7tbrCvMTnbvjZoxJRlcNN1+9x100WEfF4A2XbJZEjcpxV9tk1rTt+jS8dkX803ij16yHI1THSycP2aKkWjgDAsAUt98KL+h4U+jgXH+NDKksS1nHNjVoJYvPaW7TLcBzT0GegIgNKELjvoahi+wfYUt79velJ1uEBhEcnvnIjlShtHdqKbE/lMbb2sG0lJnFUhViYIpkjXvy5b9ucuZfz1pm7f173QY75AXVUGgMkMI0XuV2tjDFnThFHtTgDnaOzHyyOwRiOuiM74ieBmwFqkOo4SQtUrUWPDK459l8FoqAa8XlJoWZXcbU1OotvnT9I1MMGTsC2l+b6sDxoJ4wc1wj9IhAmx7tmXnQyD/0q8NOKUk9E1AtfrYSdkTjCzdEI1HZ08LcyYnRNJNARTHNh8okrNDwA4seKyLl/XIfxmIx7IaLGx0VavXDAus9AAd+knf5we5iXWY7SJO2ZrxRJgotLWE/jY7Pg8FofBwr9sBt/VEJDcb1pbHKvag2rGKlyAigV4KkFoi+kJdO9xKXMBDKAZnsA==";
  24. var iosLicense = "pK3jYP2WpjMMxnh3h6rfCYYfGmC+UBVo0gUMVTUPFJAOnn7n2KlSDYYFoROfARAO5cco1M72URpb87XQVVvV+sI/mzReM6Sbl78n89xVI/wacDVcn9lVGZH6rKg5q/f+17rHUH1JQCEilQFUxvoer4kuymdeME6Ux+CsXiD9U3GqMAwDAuvCazhwWWYdZSeQEo/KzTL1/ZbF6AdfEFP9K7Gk2q7RcuwX0WaH22At997+WnwH2EpwfXQGtUSVYO7LGMn7kCs+m+CU6hMmG0S9YRz9oTm7jAk99+y3RaJXkIETmZj5OWTIPVGjNuDKhNASTddpPc68mSFrBmizUniO1Wu0lH1oY17eVN2TRW5amzrVRSqpTOyx2LGvW1Ilra90nzlp2dEBHH+rU3Jo93jy94eWecFWMwgKBD5sABvhJFteiZTpP6NufkmmJm5UhS1bbWwQ3416ecpKs8D9TAlLLO+rbIocuxdoPE2dxWFYLq6zF8kJV3z7dKYtAwQKdoQiS08ryGXVZybCx2GjZp97I7zNemiorRWKQUrxpNk0vCLwL1yz7NzjlB6YQ8UxvmTkX/GU7T7Ubg9LoyZuVo4tLHLplMSlHIcA4guqZL7JbQ6/jomhcJGFpGo+X7tbrCvMTnbvjZoxJRlcNN1+9x100WEfF4A2XbJZEjcpxV9tk1rTt+jS8dkX803ij16yHI1THSycP2aKkWjgDAsAUt98KJfMhDVdBtIWgg2xXbvUdZdPA+MDYbxOt/kTCqmTNMCBL4i4/N1Dqxvl8Me6vei5LeecqlBZbInEmA+87xsmNJ+d5MxP+EIac9+yqaQ0YIYE4wnAzUkp/0SfANyT5mw/EcTvSxlFmdNPXMpAygK4Q1n/S3QjnpAZJCMhg6hUDQi1TPHJO1WCWdGg50xVd4e9cvnNaN633IvvL9TFBGBu4xx7FHUdlWeiIkfzaiP8Y+58lPpC7x05cs28uc/hwXiZGx2KvdF+199pSLVUIrj85m/7+SqS01Dz6t4RwV7CZ/nQ4KOAyptnYBkUNyyOx7Q7j3CUXnxUN5HL5Yhqq2FFaD/HTTVwcjun3kBQWAiUV1AWYY/lHA5ERHysKmgUkhba8MlQCnsGD2o4KGBScfS0N2kQ3Eg6AtwSRVmQZHRUOuFrRzDh6w9DqXG/2btsFdOOfQ==";
  25. const Stack = createNativeStackNavigator();
  26. type Props = {
  27. navigation: any;
  28. };
  29. export default class App extends Component<Props> {
  30. constructor(props: Props) {
  31. super(props)
  32. this.initialize()
  33. }
  34. async initialize() {
  35. const fontDir = await copyAssetsFolderToStorage('extraFonts');
  36. console.log('ComPDFKitRN', "fontDir:", fontDir)
  37. await ComPDFKit.setImportFontDir(fontDir, true);
  38. // Online certification, Fill in your online license
  39. // Returns true if initialization is successful, otherwise returns false.
  40. // var result = await ComPDFKit.initialize('Njc4NzI1OGQ3ZGQyZQ==', 'Njc4NzI1OGQ3ZGQyZQ==')
  41. // console.log("ComPDFKitRN", "initialize:", result)
  42. // Offline authentication, Fill in your offline license
  43. var result = await ComPDFKit.init_(Platform.OS == "android" ? androidLicense : iosLicense)
  44. console.log("ComPDFKitRN", "init_:", result)
  45. }
  46. render() {
  47. return (
  48. <NavigationContainer>
  49. <Stack.Navigator>
  50. <Stack.Screen name="Home" component={HomeScreen} options={({ navigation }) => ({
  51. title: 'ComPDFKit PDF SDK for ReactNative',
  52. headerStyle: {
  53. backgroundColor: '#FAFCFF',
  54. },
  55. headerTitleStyle: { fontSize: 16 },
  56. headerRight: () => (
  57. <TouchableOpacity onPress={() => navigation.navigate('Settings')}>
  58. <Image source={require('./assets/ic_setting.png')} style={{ width: 24, height: 24 }} />
  59. </TouchableOpacity>
  60. ),
  61. })} />
  62. <Stack.Screen name='Settings' component={SettingScreen} options={{
  63. headerStyle: {
  64. backgroundColor: '#FAFCFF',
  65. },
  66. }}/>
  67. <Stack.Screen name='CPDFReaderViewExample' component={CPDFReaderViewExampleScreen} options={{
  68. headerShadowVisible: false,
  69. headerTitleStyle: { fontSize: 16 },
  70. headerStyle: {
  71. backgroundColor: '#FAFCFF',
  72. },
  73. }} />
  74. <Stack.Screen
  75. name='CPDFReaderViewControllerExample'
  76. component={CPDFReaderViewControllerExampleScreen}
  77. options={() => ({
  78. headerShown: false,
  79. })}
  80. />
  81. <Stack.Screen
  82. name='CPDFAnnotationsExample'
  83. component={CPDFAnnotationsExampleScreen}
  84. options={() => ({
  85. headerShown: false,
  86. })}
  87. />
  88. <Stack.Screen
  89. name='CPDFSecurityExample'
  90. component={CPDFSecurityExampleScreen}
  91. options={() => ({
  92. headerShown: false,
  93. })}
  94. />
  95. <Stack.Screen
  96. name='CPDFPagesExample'
  97. component={CPDFPagesExampleScreen}
  98. options={() => ({
  99. headerShown: false,
  100. })}
  101. />
  102. <Stack.Screen
  103. name='CPDFWidgetsExample'
  104. component={CPDFWidgetsExampleScreen}
  105. options={() => ({
  106. headerShown: false,
  107. })}
  108. />
  109. </Stack.Navigator>
  110. </NavigationContainer>
  111. );
  112. }
  113. }
  114. const copyAssetsFolderToStorage = async (folderName : string) => {
  115. try {
  116. // Define the target storage directory
  117. const targetDir = `${RNFS.DocumentDirectoryPath}/${folderName}`;
  118. // Ensure the target directory exists
  119. const dirExists = await RNFS.exists(targetDir);
  120. if (!dirExists) {
  121. await RNFS.mkdir(targetDir);
  122. }
  123. if (Platform.OS === 'android') {
  124. // Android: Read all files in the folder
  125. const files = await RNFS.readDirAssets(folderName); // Returns an array of file objects
  126. for (const file of files) {
  127. if (file.isFile()) {
  128. const fileContents = await RNFS.readFileAssets(`${folderName}/${file.name}`, 'base64'); // Read file from assets
  129. const targetFilePath = `${targetDir}/${file.name}`;
  130. await RNFS.writeFile(targetFilePath, fileContents, 'base64'); // Write to target
  131. }
  132. }
  133. } else if (Platform.OS === 'ios') {
  134. // iOS: Copy files directly
  135. const files = await RNFS.readDir(`${RNFS.MainBundlePath}/${folderName}`);
  136. for (const file of files) {
  137. if (file.isFile()) {
  138. const sourcePath = file.path;
  139. const targetFilePath = `${targetDir}/${file.name}`;
  140. if(await RNFS.exists(targetFilePath)){
  141. continue;
  142. }
  143. await RNFS.copyFile(sourcePath, targetFilePath);
  144. }
  145. }
  146. } else {
  147. throw new Error('Unsupported platform');
  148. }
  149. return targetDir; // Return the target directory path
  150. } catch (error) {
  151. console.error('Error copying folder:', error);
  152. throw new Error('Failed to copy folder to storage.');
  153. }
  154. };