UNPKG

react-native-pdf-jsi

Version:

🚀 Ultra-fast React Native PDF viewer with JSI (JavaScript Interface) integration for maximum performance. Features lazy loading, smart caching, progressive loading, and zero-bridge overhead operations. Perfect for large PDF files with 30-day persistent c

420 lines (331 loc) 11.3 kB
# Enhanced PDF JSI Integration Guide ## Overview This guide shows you how to integrate and use the Enhanced PDF JSI functionality in your React Native application. The JSI integration provides **22.5x faster** PDF operations compared to traditional bridge-based methods. ## 🚀 Quick Start ### 1. Import JSI Components ```javascript // Basic imports import { PDFJSI, EnhancedPdfView, usePDFJSI } from 'react-native-pdf'; // Or import individual methods import { renderPageDirect, getPageMetrics, preloadPagesDirect } from 'react-native-pdf'; ``` ### 2. Check JSI Availability ```javascript import { PDFJSI } from 'react-native-pdf'; const checkJSI = async () => { const isAvailable = await PDFJSI.checkJSIAvailability(); console.log('JSI Available:', isAvailable); if (isAvailable) { console.log('🚀 High-performance mode enabled!'); } else { console.log('📱 Using standard bridge mode'); } }; ``` ## 📱 Usage Examples ### Method 1: Direct JSI Usage ```javascript import { PDFJSI } from 'react-native-pdf'; const MyPDFComponent = () => { const handleRenderPage = async () => { try { const result = await PDFJSI.renderPageDirect( 'pdf_123', // PDF ID 1, // Page number 2.0, // Scale factor base64Data // Base64 PDF data ); if (result.success) { console.log('Page rendered successfully!'); // Use result.data for the rendered page } } catch (error) { console.error('Render failed:', error); } }; return ( <TouchableOpacity onPress={handleRenderPage}> <Text>Render Page</Text> </TouchableOpacity> ); }; ``` ### Method 2: Hook-based Usage ```javascript import { usePDFJSI } from 'react-native-pdf'; const MyPDFComponent = () => { const { isJSIAvailable, isInitialized, renderPage, getPageMetrics, preloadPages, searchText } = usePDFJSI({ autoInitialize: true, enablePerformanceTracking: true }); const handleOperations = async () => { if (!isJSIAvailable) return; try { // Render page const renderResult = await renderPage('pdf_123', 1, 2.0, base64Data); // Get page metrics const metrics = await getPageMetrics('pdf_123', 1); // Preload pages await preloadPages('pdf_123', 1, 5); // Search text const searchResults = await searchText('pdf_123', 'search term', 1, 10); } catch (error) { console.error('JSI operations failed:', error); } }; return ( <View> <Text>JSI Status: {isJSIAvailable ? 'Available' : 'Not Available'}</Text> <TouchableOpacity onPress={handleOperations}> <Text>Run JSI Operations</Text> </TouchableOpacity> </View> ); }; ``` ### Method 3: Enhanced PDF View ```javascript import { EnhancedPdfView } from 'react-native-pdf'; const MyPDFViewer = () => { return ( <EnhancedPdfView source={{ uri: 'https://example.com/document.pdf' }} style={{ flex: 1 }} onLoadComplete={(numberOfPages) => { console.log(`PDF loaded: ${numberOfPages} pages`); }} onPageChanged={(page) => { console.log(`Current page: ${page}`); }} // JSI-specific props jsiEnabled={true} enablePerformanceTracking={true} enableSmartCaching={true} /> ); }; ``` ## 🔧 Advanced Features ### Performance Monitoring ```javascript import { PDFJSI } from 'react-native-pdf'; const PerformanceMonitor = () => { const [metrics, setMetrics] = useState(null); const updateMetrics = async () => { try { // Get JSI statistics const stats = await PDFJSI.getJSIStats(); console.log('JSI Stats:', stats); // Get performance metrics const perfMetrics = await PDFJSI.getPerformanceMetrics('pdf_123'); setMetrics(perfMetrics); // Get performance history const history = PDFJSI.getPerformanceHistory(); console.log('Performance History:', history); } catch (error) { console.error('Error getting metrics:', error); } }; return ( <View> <TouchableOpacity onPress={updateMetrics}> <Text>Update Metrics</Text> </TouchableOpacity> {metrics && ( <Text>Performance: {JSON.stringify(metrics, null, 2)}</Text> )} </View> ); }; ``` ### Cache Management ```javascript import { PDFJSI } from 'react-native-pdf'; const CacheManager = () => { const handleCacheOperations = async () => { try { // Get cache metrics const cacheMetrics = await PDFJSI.getCacheMetrics('pdf_123'); console.log('Cache Metrics:', cacheMetrics); // Clear specific cache type await PDFJSI.clearCacheDirect('pdf_123', 'base64'); // Clear all caches await PDFJSI.clearCacheDirect('pdf_123', 'all'); // Optimize memory await PDFJSI.optimizeMemory('pdf_123'); } catch (error) { console.error('Cache operations failed:', error); } }; return ( <TouchableOpacity onPress={handleCacheOperations}> <Text>Manage Cache</Text> </TouchableOpacity> ); }; ``` ### Text Search ```javascript import { PDFJSI } from 'react-native-pdf'; const TextSearch = () => { const [searchTerm, setSearchTerm] = useState(''); const [results, setResults] = useState([]); const handleSearch = async () => { try { const searchResults = await PDFJSI.searchTextDirect( 'pdf_123', searchTerm, 1, // Start page 10 // End page ); setResults(searchResults); console.log(`Found ${searchResults.length} matches`); } catch (error) { console.error('Search failed:', error); } }; return ( <View> <TextInput value={searchTerm} onChangeText={setSearchTerm} placeholder="Enter search term" /> <TouchableOpacity onPress={handleSearch}> <Text>Search</Text> </TouchableOpacity> {results.map((result, index) => ( <Text key={index}> Page {result.page}: {result.text} </Text> ))} </View> ); }; ``` ## 🎯 Performance Optimization ### Preloading Strategy ```javascript import { PDFJSI } from 'react-native-pdf'; const SmartPreloader = () => { const preloadPages = async (pdfId, currentPage) => { try { // Preload current page ± 2 pages const startPage = Math.max(1, currentPage - 2); const endPage = currentPage + 2; await PDFJSI.preloadPagesDirect(pdfId, startPage, endPage); console.log(`Preloaded pages ${startPage}-${endPage}`); } catch (error) { console.error('Preload failed:', error); } }; return preloadPages; }; ``` ### Quality Control ```javascript import { PDFJSI } from 'react-native-pdf'; const QualityController = () => { const setQuality = async (quality) => { try { // Quality levels: 1 (low), 2 (medium), 3 (high) await PDFJSI.setRenderQuality('pdf_123', quality); console.log(`Render quality set to: ${quality}`); } catch (error) { console.error('Quality setting failed:', error); } }; return ( <View> <TouchableOpacity onPress={() => setQuality(1)}> <Text>Low Quality (Fast)</Text> </TouchableOpacity> <TouchableOpacity onPress={() => setQuality(2)}> <Text>Medium Quality</Text> </TouchableOpacity> <TouchableOpacity onPress={() => setQuality(3)}> <Text>High Quality (Slow)</Text> </TouchableOpacity> </View> ); }; ``` ## 🔄 Migration from Bridge Mode ### Before (Bridge Mode) ```javascript import Pdf from 'react-native-pdf'; // Traditional bridge-based usage <Pdf source={{ uri: 'https://example.com/document.pdf' }} style={{ flex: 1 }} /> ``` ### After (JSI Mode) ```javascript import { EnhancedPdfView } from 'react-native-pdf'; // Enhanced JSI-based usage <EnhancedPdfView source={{ uri: 'https://example.com/document.pdf' }} style={{ flex: 1 }} jsiEnabled={true} enablePerformanceTracking={true} /> ``` ## 🛠️ Troubleshooting ### Common Issues 1. **JSI Not Available** ```javascript // Always check availability first const isAvailable = await PDFJSI.checkJSIAvailability(); if (!isAvailable) { // Fallback to bridge mode console.log('Using bridge mode'); } ``` 2. **Performance Issues** ```javascript // Check performance metrics const metrics = await PDFJSI.getPerformanceMetrics('pdf_123'); console.log('Performance:', metrics); // Clear caches if needed await PDFJSI.clearCacheDirect('pdf_123', 'all'); ``` 3. **Memory Issues** ```javascript // Optimize memory usage await PDFJSI.optimizeMemory('pdf_123'); // Set lower render quality await PDFJSI.setRenderQuality('pdf_123', 1); ``` ## 📊 Performance Comparison | Operation | Bridge Mode | JSI Mode | Improvement | |-----------|-------------|----------|-------------| | Page Render | 45ms | 2ms | **22.5x faster** | | Page Metrics | 12ms | 0.5ms | **24x faster** | | Cache Access | 8ms | 0.1ms | **80x faster** | | Text Search | 120ms | 15ms | **8x faster** | ## 🎉 Best Practices 1. **Always check JSI availability** before using JSI methods 2. **Use preloading** for better user experience 3. **Monitor performance** with built-in metrics 4. **Clear caches** periodically to free memory 5. **Set appropriate render quality** based on needs 6. **Handle errors gracefully** with fallback to bridge mode ## 📚 Additional Resources - [README_JSI.md](./README_JSI.md) - Detailed JSI documentation - [PDFJSIExample.js](./src/examples/PDFJSIExample.js) - Complete examples - [Performance Benchmarks](./README_JSI.md#performance-characteristics) - Detailed performance data --- **Ready to supercharge your PDF performance?** 🚀 Start with the basic examples above and gradually incorporate advanced features as needed. The JSI integration is designed to be backward-compatible, so you can migrate at your own pace.