如何使用pdfviewer在Android Studio中从Firebase显示PDF

时间:2018-03-20 10:42:55

标签: android firebase firebase-storage pdf-viewer

我正在创建一个应用程序,让用户上传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的新手,我确信我做错了什么......如果有人能帮助我,我将非常感激。谢谢!

5 个答案:

答案 0 :(得分:1)

AndroidPdfViewer库支持从本地存储加载PDF文件,而不是从远程URL加载。由于您正在尝试加载远程链接,它不会显示任何内容。您需要在应用缓存中下载您的pdf文件并从该路径加载它

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

您可以参考以下问题HERE

答案 1 :(得分:1)

我没有使用Firebase,但我的PDF存储在服务器上。我使用Retrofit调用服务器将PDF下载为Stream。然后我将Stream提供给pdf Viewer

显示PDF

#pragma mark UIImagePickerControllerDelegate

- (void)imagePickerController:(UIImagePickerController *)picker  didFinishPickingMediaWithInfo:(NSDictionary *)info {

UIImage *img = nil;

CGRect cropRect = [[info valueForKey:UIImagePickerControllerCropRect] CGRectValue];

if (cropRect.origin.y < 0) {

    img = [info objectForKey:UIImagePickerControllerOriginalImage];

} else {

    img = [info objectForKey:UIImagePickerControllerEditedImage];

}

}

改造服务

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

在改造响应中

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

答案 2 :(得分:1)

我终于成功使用了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

答案 3 :(得分:1)

这个也可以。
这是从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();
        }
    });
}

答案 4 :(得分:0)

在搜索并重试不同的代码后,我找到了解决方案。 无需在设备中下载即可查看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();
            }
        });

注意:当您在 firbase 存储中以编程方式保存 pdf 文件时,您需要保留 url 的文件名,因为您使用 name no url 检索文件