Search code examples
javaandroidpdfmupdf

Read online PDF file using MuPDF


I have two issues 1) Annotation not work 2) I want read online pdf document

I build MuPDF using this link http://mupdf.com/doc/how-to-build-mupdf-for-android

1) I get project mupdf/platform/android I run that default app annotation working fine but i create that project to library file they asking want to save but annotation not save.

2) It will read local file but i want read online file also. my android code

pdf = (TextView) findViewById(R.id.pdf);
    onPdf = (TextView) findViewById(R.id.onPdf);

    pdf.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            Uri uri = Uri.parse(path);

            Intent intent = new Intent(context, MuPDFActivity.class);

            intent.setAction(Intent.ACTION_VIEW);

            intent.setData(uri);

            startActivity(intent);


        }
    });

    onPdf.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            Uri uri = Uri.parse(netPath);


            Intent intent = new Intent(context, MuPDFActivity.class);

            intent.setAction(Intent.ACTION_VIEW);

            intent.setData(uri);

            startActivity(intent);

        }
    });

Modified MuPDFActivity - I change all file are open openBuffer method

private MuPDFCore openBuffer(byte buffer[]) {
    System.out.println("Trying to open byte buffer");
    try {
        String magic = "";
        core = new MuPDFCore(this, buffer, magic);
        // New file: drop the old outline data
        OutlineActivityData.set(null);
    } catch (Exception e) {
        System.out.println(e);
        return null;
    }
    return core;
}

My mainfest

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".PdfTestActivity"
        android:label="@string/app_name" >
       <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name="com.artifex.mupdfdemo.MuPDFActivity"
        android:label="@string/app_name"
        android:theme="@style/AppBaseTheme" >
    </activity>

     <activity
        android:name="com.artifex.mupdfdemo.OutlineActivity"
        android:label="@string/outline_title"
        android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen" >
    </activity>
    <activity
        android:name="com.artifex.mupdfdemo.PrintDialogActivity"
        android:label="@string/print"
        android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen" >
    </activity>
</application>

My stacktrace

12-25 19:02:41.544: E/TAG(22925): /sample.pdf:     open failed: ENOENT (No such file or directory)
12-25 19:02:41.544: E/tag(22925): file
12-25 19:02:41.546: I/System.out(22925): Trying to open        /sample.pdf
 12-25 19:02:41.549: D/dalvikvm(22925): Trying to load lib    /mnt/asec/com.example.testnew-1/lib/libmupdf.so 0x41792e10
 12-25 19:02:41.576: D/dalvikvm(22925): Added shared lib /mnt/asec/com.example.testnew-1/lib/libmupdf.so 0x41792e10
 12-25 19:02:41.576: D/dalvikvm(22925): No JNI_OnLoad found in /mnt/asec/com.example.testnew-1/lib/libmupdf.so 0x41792e10, skipping init
 12-25 19:02:41.577: I/libmupdf(22925): Opening document...
 12-25 19:02:41.577: E/libmupdf(22925): error: cannot open /sample.pdf: No such file or directory
 12-25 19:02:41.577: E/libmupdf(22925): error: cannot load document '/sample.pdf'
 12-25 19:02:41.577: E/libmupdf(22925): error: Cannot open document: '/sample.pdf'
 12-25 19:02:41.577: E/libmupdf(22925): Failed: Cannot open document: '/sample.pdf'
 12-25 19:02:41.580: I/System.out(22925): java.lang.Exception: Cannot open file: /sample.pdf

Solution

  • I download PDF file and convert to Bytes and open in MuPDF Core.

    Download file

    byte buffer[] = null;
        HttpURLConnection urlConnection = null;
        try {
    
            urlConnection = (HttpURLConnection) urls[0].openConnection();
            urlConnection.setReadTimeout(TIMEOUT_READ);
            InputStream inputStream = urlConnection.getInputStream();
    
            int len = inputStream.available();
            buffer = new byte[len];
    
            // inputStream.read(buffer, 0, len);
    
            while ((len = inputStream.read(buffer)) != -1) {
                byteBuffer.write(buffer, 0, len);
            }
            Log.e("Length", "" + byteBuffer.size());
            inputStream.close();
            // and then we can return your byte array.
    
        } catch (Exception e) {
            e.printStackTrace();
    
            });
    

    Open core

    RelativeLayout mupdfWrapper;
    MuPDFCore core;
    public byte[] buffer;
    mupdfWrapper = (RelativeLayout) viewRoot
                    .findViewById(R.id.mupdf_wrapper);
            // Intent intent =new Intent(getActivity(),MuPDFActivity.class);
            // startActivity(intent);
    
            core = new MuPDFCore(getActivity(), buffer, "");
            MuPDFReaderView mDocView = new MuPDFReaderView(getActivity());
            mDocView.setAdapter(new MuPDFPageAdapter(getActivity(), core));
            mupdfWrapper.addView(mDocView, new LayoutParams(
                    LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));