Va bene, per le generazioni future, ecco come ho risolto questo problema:
Aggiornato il 13 Settembre, 2017:
C'è un nuovo modulo NPM che rende l'intero processo molto più facile. Io suggerirei di usare andando avanti invece di mia risposta iniziale di seguito:
react-native-pdf
Una volta installato, rendendo il PDF è facile come questo:
export default class YourClass extends Component {
constructor(props) {
super(props);
this.pdf = null;
}
render() {
let yourPDFURI = {uri:'bundle-assets://pdf/YourPDF.pdf', cache: true};
return <View style={{flex: 1}}>
<Pdf ref={(pdf)=>{this.pdf = pdf;}}
source={yourPDFURI}
style={{flex: 1}}
onError={(error)=>{console.log(error);}} />
</View>
}
}
Basta mettere il pdf effettivo nel android/app/src/main/assets/pdf
cartella del tuo progetto.
risposta originale:
iOS
render: function() {
return <WebView source={{uri: 'My.pdf'}}/>
}
Il trucco è che è necessario includere My.pdf
nel progetto in Xcode e assicurarsi che sia aggiunto al vostro target build.
Non è stato sufficiente copiarlo nella cartella del progetto React Native. Doveva essere parte del progetto Xcode stesso.
Android
Sembra che Android non ha fornito un visualizzatore PDF nativo fino a 5.0 (Lollipop). Per aggirare il problema, ho dovuto fare uso di tre tecniche principali:
- Estrarre il PDF dal mio fagotto APK e memorizzarlo nella cartella
files
per la mia app. Questo SO risposta è stata molto utile nella realizzazione di questo:
Android: How to copy files from 'assets' folder to sdcard?
ho ottimizzato il codice un po 'in modo che il file non aveva intenzione di un sdcard
ma nella cartella del mio app files
.Ecco quello che ho aggiunto alla mia MainActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
AssetManager assetManager = getAssets();
String[] files = null;
try {
files = assetManager.list("pdf");
} catch (IOException e) {
Log.e("tag", "Failed to get asset file list.", e);
}
if (files != null) for (String filename : files) {
InputStream in = null;
OutputStream out = null;
try {
in = assetManager.open("pdf/" + filename);
File outFile = new File(getFilesDir(), filename);
out = new FileOutputStream(outFile);
copyFile(in, out);
Log.e("tag", "Copy was a success: " + outFile.getPath());
} catch(IOException e) {
Log.e("tag", "Failed to copy asset file: " + "pdf/" + filename, e);
}
finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
// NOOP
}
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
// NOOP
}
}
}
}
}
private void copyFile(InputStream in, OutputStream out) throws IOException {
byte[] buffer = new byte[1024];
int read;
while((read = in.read(buffer)) != -1){
out.write(buffer, 0, read);
}
}
ho anche fatto in modo che il mio PDF si trova nella cartella assets/pdf
sotto android/app/src/main
Ho quindi utilizzato il pacchetto react-native-fs per ottenere il assoluto URL al mio PDF, che ora è nella cartella files
:
var RNFS = require('react-native-fs');
var absolutePath = RNFS.DocumentDirectoryPath + '/My.pdf';
Con tutto questo a posto, ho usato react-native-pdf-view a carico effettivamente e visualizzare il PDF:
import PDFView from 'react-native-pdf-view';
render: function() {
var absolutePath = RNFS.DocumentDirectoryPath + '/My.pdf';
return <PDFView
ref={(pdf)=>{this.pdfView = pdf;}}
src={absolutePath}
style={ActharStyles.fullCover} />
}
Buona fortuna!
Suppongo che tu abbia già trovato questo, che è una soluzione solo Android https://github.com/cnjon/react-native-pdf-view anche se sembra che stanno lavorando su iOS. Hanno fatto il ponte al nativo per la loro soluzione. Potresti ottenere informazioni utili se hai avuto il tempo di approfondire. Mi piacerebbe sapere se è possibile caricare i pdf localmente in webview. –
@ChrisGeirman L'ho visto. Sono uno sviluppatore nativo iOS per mestiere, quindi ho potuto installare anche un bridge. So che potrei farlo funzionare in questo modo. Spero solo di non aver bisogno di saltare quei cerchi. – Axeva
Ti sento. Se lo fai, forse considera di contribuire al pacchetto di cui sopra in modo che il prossimo (forse io !!) non dovrà :) –