How to render a pdf in android using pdf renderer

5.2k views Asked by At

Hello guys how do solve this my error log I'm trying to render pdfs using the android graphics pdfrenderer class in android I've tried to observe where or how I got it wrong but I can't see yet please guys how exactly do I achieve this using this particular class any idea will be very much appreciated.


Shared attribute region not available to be mapped
02-04 05:35:25.750 15257 15257 W   ActivityThread                               handleWindowVisibility: no activity for token android.os.BinderProxy@cb509ee
02-04 05:35:25.936 15257 15257 W   Bundle                                       Key filePath expected String but value was a java.io.File.  The default value <null> was returned.
02-04 05:35:25.950 15257 15257 W   Bundle                                       Attempt to cast generated internal exception:
02-04 05:35:25.950 15257 15257 W   Bundle                                       java.lang.ClassCastException: java.io.File cannot be cast to java.lang.String
02-04 05:35:25.950 15257 15257 W   Bundle                                       at android.os.BaseBundle.getString(BaseBundle.java:1170)
02-04 05:35:25.950 15257 15257 W   Bundle                                       at android.content.Intent.getStringExtra(Intent.java:7907)
02-04 05:35:25.950 15257 15257 W   Bundle                                       at com.jaay.docReader.PdfActivity.onCreate(PdfActivity.java:26)
02-04 05:35:25.950 15257 15257 W   Bundle                                       at android.app.Activity.performCreate(Activity.java:7873)
02-04 05:35:25.950 15257 15257 W   Bundle                                       at android.app.Activity.performCreate(Activity.java:7861)
02-04 05:35:25.950 15257 15257 W   Bundle                                       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1312)
02-04 05:35:25.950 15257 15257 W   Bundle                                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3331)
02-04 05:35:25.950 15257 15257 W   Bundle                                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3533)
02-04 05:35:25.950 15257 15257 W   Bundle                                       at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
02-04 05:35:25.950 15257 15257 W   Bundle                                       at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)

This the activity handling the pdf activity and it's display


public class PdfActivity extends AppCompatActivity {
    
    String filePath = "";
    ImageView pdfView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_pdf);
        pdfView = (ImageView) findViewById(R.id.pdfview);
        filePath = getIntent().getStringExtra("filePath");
        File file = new File(filePath);
        try{
            openPDF(file);
        }catch(IOException ioe){
            ioe.printStackTrace();
        }
        
        //File file = new File(filePath);
        //Uri uri = Uri.fromFile(file);
        //pdfView.fromUri(uri).load();
        
        
    }
    
    
    public void openPDF(File file) throws IOException {
       // File file = new File(filePath);

        ParcelFileDescriptor fileDescriptor = null;
        fileDescriptor = ParcelFileDescriptor.open(
            file, ParcelFileDescriptor.MODE_READ_ONLY);

        //min. API Level 21
        PdfRenderer pdfRenderer = null;
        pdfRenderer = new PdfRenderer(fileDescriptor);

        final int pageCount = pdfRenderer.getPageCount();
        Toast.makeText(this,
                       "pageCount = " + pageCount,
                       Toast.LENGTH_LONG).show();

        //Display page 0
        PdfRenderer.Page rendererPage = pdfRenderer.openPage(0);
        int rendererPageWidth = rendererPage.getWidth();
        int rendererPageHeight = rendererPage.getHeight();
        Bitmap bitmap = Bitmap.createBitmap(
            rendererPageWidth,
            rendererPageHeight,
            Bitmap.Config.ARGB_8888);
        rendererPage.render(bitmap, null, null,
                            PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);

        pdfView.setImageBitmap(bitmap);
        rendererPage.close();

        pdfRenderer.close();
        fileDescriptor.close();
    }
    
    
    
}

This is the code passing the pdf files using intent from fragment to activity.

startActivity(new Intent(getActivity(), PdfActivity.class).putExtra("filePath", file.getAbsoluteFile()));

Here is the pdf activity xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_pdf"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="10dp"
    android:paddingLeft="10dp"
    android:paddingRight="10dp"
    android:paddingTop="10dp"
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="20dp"
        android:layout_gravity="center_horizontal"
        android:autoLink="web"
        android:text="jaa"
        android:textStyle="bold"/>

    <ImageView
        android:id="@+id/pdfview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
    
    
</LinearLayout>

Where did I go wrong and what's odd in

filePath = getIntent().getStringExtra("filePath");
        File file = new File(filePath);
3

There are 3 answers

0
blackapps On BEST ANSWER

startActivity(new Intent(getActivity(), PdfActivity.class).putExtra("filePath", file.getAbsoluteFile()));

Change to:

startActivity(new Intent(getActivity(), PdfActivity.class).putExtra("filePath", file.getAbsolutePath()));
0
Vikash Rathore On

there you can use this code. it's working fine for me

    fun getPdfThumbnail(context: Context, file:File, imageView: ImageView, pageCountTV:TextView) {
    // create a new renderer
    try {
        val pfd = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY)
        val renderer = PdfRenderer(pfd)
        val bitmap = Bitmap.createBitmap(900, 900, Bitmap.Config.ARGB_4444)
        val page = renderer.openPage(0)
        val count = renderer.pageCount
        pageCountTV.text = "$count pages"
        page.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY)

        Glide.with(context).load(bitmap).into(imageView)
        page.close()
        renderer.close()
    }
    catch (e:Exception){
        e.printStackTrace()
    }
}
1
Justice Chuks On

Okay guys thank you for coming to my aid but I later found out the answer to my question the thing is at

startActivity(new Intent(getActivity(), PdfActivity.class).putExtra("filePath", file.getAbsoluteFile()));

I was not actually returning a string but rather a file absolute path which was returned a file, this is the reason why the log said it's not possible to cast a file to string and the code kept falling back to the default string value of file path which is null my solution was to convert the file absolute path to a string by adding this startActivity(new Intent(getActivity(), PdfActivity.class).putExtra("filePath", file.getAbsoluteFile().toString())); That did the job.