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.
// Basic imports
import { PDFJSI, EnhancedPdfView, usePDFJSI } from 'react-native-pdf';
// Or import individual methods
import {
renderPageDirect,
getPageMetrics,
preloadPagesDirect
} from 'react-native-pdf';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');
}
};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>
);
};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>
);
};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}
/>
);
};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>
);
};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>
);
};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>
);
};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;
};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>
);
};import Pdf from 'react-native-pdf';
// Traditional bridge-based usage
<Pdf
source={{ uri: 'https://example.com/document.pdf' }}
style={{ flex: 1 }}
/>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}
/>-
JSI Not Available
// Always check availability first const isAvailable = await PDFJSI.checkJSIAvailability(); if (!isAvailable) { // Fallback to bridge mode console.log('Using bridge mode'); }
-
Performance Issues
// Check performance metrics const metrics = await PDFJSI.getPerformanceMetrics('pdf_123'); console.log('Performance:', metrics); // Clear caches if needed await PDFJSI.clearCacheDirect('pdf_123', 'all');
-
Memory Issues
// Optimize memory usage await PDFJSI.optimizeMemory('pdf_123'); // Set lower render quality await PDFJSI.setRenderQuality('pdf_123', 1);
| 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 |
- Always check JSI availability before using JSI methods
- Use preloading for better user experience
- Monitor performance with built-in metrics
- Clear caches periodically to free memory
- Set appropriate render quality based on needs
- Handle errors gracefully with fallback to bridge mode
- README_JSI.md - Detailed JSI documentation
- PDFJSIExample.js - Complete examples
- Performance Benchmarks - 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.