Просмотр PDF в React Native
может ли кто-нибудь предоставить пример кода для отображения PDF в React Native? iOS и Android.
это то, что я пробовал:
render: function() {
return <WebView
source={require('./my.pdf')}
/>
}
^ это приводит к Красному экрану смерти с ошибкой "невозможно разрешить модуль".
render: function() {
return <WebView
source={{uri: 'my.pdf'}}
/>
}
^ это дает сообщение "Ошибка загрузки страницы" в WebView. "Запрошенный url не найден на этом сервере"
Я знаю, что iOS способна показывать PDF в UIWebView. Я предполагаю, что Android может сделать тот же. Должно быть что-то в том, как указан источник, что мне не хватает.
2 ответов
ладно, для будущих поколений, вот как я решил эту проблему:
Обновлено 13 Сентября 2017:
существует новый модуль NPM, который делает весь этот процесс намного проще. Я бы предложил использовать его в будущем вместо моего первоначального ответа ниже:
после установки, рендеринг PDF так же просто, как это:
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>
}
}
просто поместите свой фактический pdf в android/app/src/main/assets/pdf
папка вашего проекта.
Оригинальный Ответ:
iOS
render: function() {
return <WebView source={{uri: 'My.pdf'}}/>
}
фокус в том, что вам нужно включить My.pdf
в ваш проект в Xcode и убедитесь, что он добавлен в вашу цель сборки.
просто скопировать его в папку React Native project было недостаточно. Это должно было быть частью самого проекта Xcode.
Android
похоже, что Android не предоставлял собственный просмотрщик PDF до 5.0 (Lollipop). Чтобы обойти это, мне пришлось использовать три ключевых метода:--15-->
- вытащите PDF из моего пакета APK и сохраните его в
files
папка для моего приложения. Этот ответ SO был очень полезен в выполнении этого:
Android: Как скопировать файлы из папки "активы" на sdcard?
я немного изменил код, чтобы файл не собирался в sdcard
но для моего приложения . Вот что я добавил к своему 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);
}
}
я также убедился, что мой PDF находится в под android/app/src/main
-
затем я использовал react-native-fs пакет, чтобы получить абсолютный URL-адрес моего PDF, который теперь находится в :
var RNFS = require('react-native-fs'); var absolutePath = RNFS.DocumentDirectoryPath + '/My.pdf';
-
со всем этим на месте, я использовал react-native-pdf-view фактически нагрузить и показать Формат 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} /> }
удачи!
простое решение этой проблемы-установить <WebView>
source/uri
для этого:
https://drive.google.com/viewerng/viewer?embedded=true&url={your pdf url}’