如何使用 pdfviewer 在 Android Studio 中显示来自 Firebase 的 PDF

How to use pdfviewer to Display PDF from Firebase in 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();

如果我从 assets 文件夹加载 pdf,效果很好。

我也试过 webview:

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

我真的是 Android 的新手,我确定我做错了什么...如果有人能帮助我,我将不胜感激。谢谢!

AndroidPdfViewer 库支持从本地存储而不是远程加载 PDF 文件 url.Since 你正在尝试加载远程 link 它不会显示 anything.You 需要下载你的 pdf应用程序缓存中的文件并从该路径加载它

WebView 在这种情况下可以正常工作,因为它在浏览器中加载远程 url

可以参考以下IssueHERE

我没有使用 Firebase,但我的 PDF 存储在服务器上。我使用 Retrofit 调用服务器以将 PDF 作为流下载。然后我将 Stream 提供给 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());

我终于成功使用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 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[=13= 检索文件]