Как использовать pdfviewer для отображения PDF из Firebase в Android Studio

Я делаю приложение, которое позволяет пользователю загружать файлы PDF, а затем я сохраняю их в Firebase. Сейчас я пытаюсь отобразить их в своем приложении, я не хочу, чтобы пользователь мог загрузить файл, но я хочу, чтобы он отображался прямо в приложении.

Вот как я сохраняю файлы:

private void uploadFile() {
    progressBar.setVisibility(View.VISIBLE);

    StorageReference sRef = mStorageReference.child(Constants.STORAGE_PATH_COURSES + System.currentTimeMillis() + ".pdf");
    sRef.putFile(filepath)
            .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @SuppressWarnings("VisibleForTests")
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                    progressBar.setVisibility(View.GONE);
                    textViewStatus.setText("File Uploaded Successfully");

                    Course upload = new Course(editTextFilename.getText().toString(), taskSnapshot.getDownloadUrl().toString());
                    mDatabaseReference.child(mDatabaseReference.push().getKey()).setValue(upload);
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception exception) {
                    Toast.makeText(getApplicationContext(), exception.getMessage(), Toast.LENGTH_LONG).show();
                }
            })
            .addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
                @SuppressWarnings("VisibleForTests")
                @Override
                public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
                    double progress = (100.0 * taskSnapshot.getBytesTransferred()) / taskSnapshot.getTotalByteCount();
                    textViewStatus.setText((int) progress + "% Uploading...");
                }
            });

}

Я искал возможности и попробовал несколько, но я не могу заставить их работать.

Я пытался использовать это, но ничего не отображается. https://github.com/barteksc/AndroidPdfViewer

 pdfView=(PDFView) findViewById(R.id.pdfView);

    Bundle bundle = getIntent().getExtras();
    if (bundle != null) {
        url = getIntent().getStringExtra("url");
    }
    uri=Uri.parse(url);
   pdfView.fromUri(uri).load();

Если я загружаю PDF из папки ресурсов, он работает хорошо.

Я также попробовал веб-просмотр:

    WebView webview = (WebView) findViewById(R.id.webview);
    webview.getSettings().setJavaScriptEnabled(true);
    webview.loadUrl("http://drive.google.com/viewerng/viewer?embedded=true&url=" + url)

Я действительно новичок в Android, и я уверен, что я делаю что-то не так... Я был бы очень благодарен, если бы кто-то мог мне помочь. Спасибо!

5 ответов

Решение

AndroidPdfViewer Библиотека поддерживает загрузку PDF-файла из локального хранилища, а не из удаленного URL-адреса. Так как вы пытаетесь загрузить удаленную ссылку, она ничего не показывает. Вам нужно скачать pdf-файл в кеш приложения и загрузить его по этому пути.

WebView будет нормально работать в этой ситуации, потому что его загрузка удаленного URL в браузере

Вы можете обратиться к следующей проблеме ЗДЕСЬ

Мне наконец удалось использовать PDFViewer. Вот мой код:

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_course);

    pdfView=(PDFView) findViewById(R.id.pdfView);

    Bundle bundle = getIntent().getExtras();
    if (bundle != null) {
        url = getIntent().getStringExtra("url");
    }
    new RetrievePDFStream().execute(url);
}


class RetrievePDFStream extends AsyncTask<String,Void,InputStream>{
    @Override
    protected InputStream doInBackground(String... strings) {
        InputStream inputStream=null;

        try{

            URL urlx=new URL(strings[0]);
            HttpURLConnection urlConnection=(HttpURLConnection) urlx.openConnection();
            if(urlConnection.getResponseCode()==200){
                inputStream=new BufferedInputStream(urlConnection.getInputStream());

            }
        }catch (IOException e){
            return null;
        }
        return inputStream;

    }

    @Override
    protected void onPostExecute(InputStream inputStream) {
        pdfView.fromStream(inputStream).load();
    }
}

Это действительно помогло: https://www.youtube.com/watch?v=-Ld1IoOF_uk

Я не использую Firebase, но мой PDF хранится на сервере. Я звоню на сервер, используя Retrofit, чтобы загрузить PDF в виде потока. Тогда я даю поток в PDF Viewer

Для отображения PDF

private void displayPDF(InputStream stream) {
    mPdfView.fromStream(stream)
            .defaultPage(0)
            .load();
}

Модернизация Сервис

@Streaming
@GET
Call<ResponseBody> downloadPDF(@Url String url);

В ответ на модификацию

displayPDF(responseBody.byteStream());

Этот тоже работает.
Это с веб-сайта Firebase Doc:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // Write a message to the database
    pdfView = (PDFView) findViewById(R.id.pdfView);
    mFirebaseStorage=FirebaseStorage.getInstance();
    mmFirebaseStorageRef=mFirebaseStorage.getReference().child("sources");
    final long ONE_MEGABYTE = 1024 * 1024;

    mmFirebaseStorageRef.child("smpl.pdf").getBytes(ONE_MEGABYTE).addOnSuccessListener(new OnSuccessListener<byte[]>() {
        @Override
        public void onSuccess(byte[] bytes) {
     pdfView.fromBytes(bytes).load();
        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            Toast.makeText(MainActivity.this,"download unsuccessful",Toast.LENGTH_LONG).show();
        }
    });
}

после поиска и повторения разных кодов я нашел решение. просматривать PDF-файл без загрузки на устройство

Библиотека для просмотра pdf есть

      implementation 'com.github.barteksc:android-pdf-viewer:2.8.2'

Добавить в XML

       <com.github.barteksc.pdfviewer.PDFView
        android:id="@+id/pdfview"
        android:background="@color/white"

        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

и это Java-код

       StorageReference storageRef;
        FirebaseApp app;
        FirebaseStorage storage;
        storageRef = FirebaseStorage.getInstance().getReference();
        app = FirebaseApp.getInstance();
        storage = FirebaseStorage.getInstance(app);
        storageRef = storage.getReference().child("books/booksPDF/documenttcv.pdf");

        storageRef.getStream().addOnSuccessListener(new OnSuccessListener<StreamDownloadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(StreamDownloadTask.TaskSnapshot taskSnapshot) {
                
                pdfview.fromStream(taskSnapshot.getStream()).load();
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Toast.makeText(ReadBookActivity.this, "Fail :"+e.getMessage(), Toast.LENGTH_SHORT).show();
            }
        });

ПРИМЕЧАНИЕ. Когда вы программно сохраняете файл pdf в хранилище firbase, вам необходимо сохранить имя файла без URL-адреса, потому что вы извлекаете файлы, используя имя без URL-адреса.

Другие вопросы по тегам