How can I Open a PDF document using PDFView inside an AlertDialog?

1.2k views Asked by At

I am creating an app where people can share documents with it. I want to create it in a way that when a user clicks on the document, it opens inside the application, rather than downloading and opening it with a third party app like WPS. I want the document to open using a PDFView inside An alertDialog. This code that Am using only creates an alertDialog, but it does not load the PDF. Any ideas on how the PDF can be loaded? It is doable?

holder.postDocument.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            final AlertDialog.Builder builder = new AlertDialog.Builder(mContext, R.style.AlertDialog);
            builder.setTitle("Post document");

            final String pdfUrl = "https://www.tutorialspoint.com/computer_programming/computer_programming_tutorial.pdf";
            final PDFView pdfView = new PDFView(mContext, null);
            pdfView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
            pdfView.fromUri(Uri.parse(post.getPostdocument() pdfUrl)).load();
            builder.setView(pdfView);

            builder.setPositiveButton("Close", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(final DialogInterface dialog, int which) {
                 
                 dialog.dismiss();
                   

                }
            }).setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                }
            });

            builder.show();
        }
    });
1

There are 1 answers

9
Mouaad Abdelghafour AITALI On

1 - First you need to download the PDF file and store it into your phone storage :

@SuppressLint("StaticFieldLeak")
    private class DownloadFile extends AsyncTask<String, Integer, String> {

        String savedFilePath = null;
        ProgressDialog progressDialog;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
            StrictMode.setVmPolicy(builder.build());
            progressDialog = new ProgressDialog(MainActivity.this);
            progressDialog.setTitle("Downloading PDF");
            progressDialog.setMessage("Please wait (0%)");
            progressDialog.show();
        }

        @Override
        protected String doInBackground(String... urlParams) {
            int count;
            String fileName = urlParams[1] + ".pdf";
            File storageDir = new File(
                    Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
                            + "/PDF_FOLDER/");
            boolean success = true;
            if (!storageDir.exists()) {
                success = storageDir.mkdirs();
            }
            if (success) {
                File file = new File(storageDir, fileName);
                savedFilePath = file.getAbsolutePath();
                if (!file.exists()) {
                    try {
                        URL url = new URL(urlParams[0]);
                        URLConnection conexion = url.openConnection();
                        conexion.connect();
                        int lengthOfFile = conexion.getContentLength();
                        InputStream input = new BufferedInputStream(url.openStream());
                        OutputStream output = new FileOutputStream(file);
                        byte[] data = new byte[1024];
                        long total = 0;
                        while ((count = input.read(data)) != -1) {
                            total += count;
                            publishProgress((int) (total * 100 / lengthOfFile));
                            output.write(data, 0, count);
                        }
                        output.flush();
                        output.close();
                        input.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }

            }
            return savedFilePath;
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            progressDialog.setMessage("Please wait (" + values[0] + "%)");
        }

        @Override
        protected void onPostExecute(String pdfPath) {
            super.onPostExecute(pdfPath);
            if (pdfPath != null && !pdfPath.isEmpty()) {
                progressDialog.dismiss();
                showPDFDialog(pdfPath);
            }
        }
    }

2 - When the download process finished, show the PDF in custom dialog as follows :

  public void showPDFDialog(String pdfPath) {
        Dialog dialog = new Dialog(MainActivity.this);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        assert dialog.getWindow() != null;
        dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        dialog.setCancelable(false);
        dialog.setContentView(R.layout.dialog_view);
        PDFView pdfView = dialog.findViewById(R.id.pdfView);
        if (pdfPath != null && FileUtils.isFileExists(FileUtils.getFileByPath(pdfPath)))
            pdfView.fromFile(FileUtils.getFileByPath(pdfPath)).defaultPage(0)
                    .enableAnnotationRendering(true)
                    .scrollHandle(new DefaultScrollHandle(this))
                    .load();
        else ToastUtils.showShort("FILE NOT EXISTS");
        dialog.show();
    }

3 - Dialog XML :

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@android:color/white">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:gravity="center"
            android:text="Post document"
            android:textAllCaps="true"
            android:textColor="@android:color/black"
            android:textSize="24sp"
            android:textStyle="bold" />

        <com.github.barteksc.pdfviewer.PDFView
            android:id="@+id/pdfView"
            android:layout_width="match_parent"
            android:layout_height="400dp" />

        <Button
            android:id="@+id/cancel_action"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="end"
            android:layout_margin="4dp"
            android:background="@null"
            android:text="Cancel" />
    </LinearLayout>
</RelativeLayout>

4 - Call the Download class like this :

 final String pdfUrl = "https://www.tutorialspoint.com/computer_programming/computer_programming_tutorial.pdf";
    

 new DownloadFile().execute(pdfUrl, "PDF_NAME_");

Result :

The used libraries :

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

Permissions :

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>