2

Я использую библиотеку react-native-pdf-view, и у меня возникли проблемы с заполнением PDFView с помощью pdf.react-native-pdf-view - Как заполнить pdfView с base64 или blob

Как мой проект работает в том, что я получаю base64 PDF с сервером, на котором я тогда сохранить в андроиде файловой системы с помощью библиотеки react-native-fs так:
(это работает отлично)

saveFile(filename){ 

    var base64Image = this.state.imageBase64; 

    // create a path you want to write to 
    var path = RNFS.DocumentDirectoryPath + '/' + filename; 

    // write the file 
    RNFS.writeFile(path, base64Image, 'base64').then((success) => { 
    console.log('FILE WRITTEN!'); 
    this.setState(
     {pdf_dirPath: path} 
    ); 
    this._display_fileAttachment() 
    }) 
    .catch((err) => { 
    console.log(err.message); 
    }); 
} 

I попробуйте заполнить вид PDF-файл с этим:

<PDFView 
    ref={(pdf)=>{this.pdfView = pdf;}} 
    src={"path/To/base64/pdf"} 
    style={styles.pdf} 
/> 

Вопрос

Возникает ли в файле action-native-pdf-файл файл с файлом или файл base64 pdf или blob.

Если он может взять base64 или blob, пожалуйста, объясните или дайте пример кода о том, как это сделать.
Благодаря

Nb: This StackOverflow question очень похожи, но мне нужно знать, как, в какой форме, чтобы сохранить или получить base64 из файловой системы и как заполнять PDF.

+1

глядя, как [исходного кода] (https: // GitHub.com/cnjon/react-native-pdf-view/blob/master/RNPDFView/RNPDFView.m # L56), он, похоже, не принимает base64, вам нужно будет указать путь. Чтобы устранить это, я бы 'console.log'' путь/to/pdf', чтобы подтвердить, что он сохранен и является хорошим PDF-файлом. –

+0

@ Kyle Finley Спасибо, что указали это. Кажется, проблема заключается в сохранении файла. Проверьте это сообщение для получения более подробной информации. http://stackoverflow.com/questions/38662309/how-to-save-pdf-to-android-file-system-react-native Спасибо. – Larney

ответ

2

Для тех, у кого такая же проблема, вот решение.

Решение

реагируют-nativive-PDF-взгляд должен принять путь к файлу в pdf_base64.

Во-первых, я использовал react-native-fetch-blob для запроса pdf base64 с сервера. (Поскольку API RN fetch еще не поддерживает BLOB).

Также я обнаружил, что response-native-fetch-blob также имеет API-интерфейс FileSystem, который лучше документирован и легче понимается, чем библиотека «response-native-fs». (Check out its FileSystem API documentation)

Прием base64 PDF и сохранить его в путь к файлу:

var RNFetchBlob = require('react-native-fetch-blob').default; 

const DocumentDir = RNFetchBlob.fs.dirs.DocumentDir; 

getPdfFromServer: function(uri_attachment, filename_attachment) { 
    return new Promise((RESOLVE, REJECT) => { 

     // Fetch attachment 
     RNFetchBlob.fetch('GET', config.apiRoot+'/app/'+uri_attachment) 
     .then((res) => { 

      let base64Str = res.data; 
      let pdfLocation = DocumentDir + '/' + filename_attachment; 

      RNFetchBlob.fs.writeFile(pdfLocation, pdf_base64Str, 'base64'); 
      RESOLVE(pdfLocation); 
     }) 
    }).catch((error) => { 
     // error handling 
     console.log("Error", error) 
    }); 
} 

Что я делаю неправильно было вместо сохранения pdf_base64Str на местоположение файла, как я сделал в приведенном выше примере. Я сохранял это следующим образом:

var pdf_base64= 'data:application/pdf;base64,'+pdf_base64Str; 

который был не прав.

Populate вид PDF с путем к файлу:

<PDFView 
    ref={(pdf)=>{this.pdfView = pdf;}} 
    src={pdfLocation} 
    style={styles.pdf} 
/> 
+0

Что это за функция «RESOLVE»? Кажется, он нигде не определен и дал мне ошибку, когда я попытался запустить ваш код. – Pedram

+0

@Pedram «Resolve() возвращает объект Promise, который разрешен с заданным значением». - https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise – Larney

+0

О, я вижу. Это просто обратный вызов, который передается, чтобы быть выполненным, когда ваше обещание будет разрешено. – Pedram

1

Похоже, есть гораздо более простой способ сделать это. Просто скажите RNFletchBlob, чтобы сохранить его прямо на диск. Обратите внимание, что вам придется очистить файл позже.

RNFetchBlob 
    .config({ 
    // add this option that makes response data to be stored as a file. 
    fileCache : true, 
    appendExt : 'pdf' 
    }) 
    .fetch('GET', 'http://www.example.com/file/example.zip', { 
    //some headers .. 
    }) 
    .then((res) => { 
    // the temp file path 
    this.setState({fileLocation: res.path()}); 
    console.log('The file saved to ', res.path()) 
    }) 

А потом

<PDFView 
    ref={(pdf)=>{this.pdfView = pdf;}} 
    path={this.state.fileLocation} 
    onLoadComplete = {(pageCount)=>{ 
    this.pdfView.setNativeProps({ 
     zoom: 1.0 
    }); 
    console.log("Load Complete. File has " + pageCount + " pages."); 
    }} 
    style={styles.pdf}/>