在app android中的片段中显示PDF

时间:2013-08-01 07:09:57

标签: android android-fragments pdf-viewer

在我的应用程序中,我必须在android中显示sdcard的PDF文件。该应用使用标签功能,所以我在我的应用程序中使用了片段。那么如何在片段中显示pdf文件呢? 我使用过pdfviewer.jar,但是我无法显示内部片段,它只适用于活动。

另一个问题是我想显示带有多缩放和垂直页面滚动的pdf以查看下一页/上一页,而不是通过手动点击缩放图标和箭头图标来查看pdfviewer.jar中使用的下一页。 / p>

2 个答案:

答案 0 :(得分:0)

我正在提供该更改片段的完整代码。我3年前就做过了,那时使用的是Sherlock图书馆。我想现在你必须用appcompat库替换它。

package net.sf.andpdf.pdfviewer;

import java.io.*;
import java.nio.channels.FileChannel;

import android.app.Activity;
import android.content.res.Configuration;
import android.graphics.*;
import android.widget.ImageView;
import android.widget.TextView;
import net.sf.andpdf.nio.ByteBuffer;
import net.sf.andpdf.pdfviewer.gui.TouchImageView;
import net.sf.andpdf.refs.HardReference;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.util.Log;
import android.view.Display;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.sun.pdfview.PDFFile;
import com.sun.pdfview.PDFImage;
import com.sun.pdfview.PDFPage;
import com.sun.pdfview.PDFPaint;
import com.sun.pdfview.decrypt.PDFAuthenticationFailureException;
import com.sun.pdfview.decrypt.PDFPassword;
import com.sun.pdfview.font.PDFFont;




public class PdfViewerFragment extends SherlockFragment  {

    private static final int STARTPAGE = 1;
    private static float STARTZOOM = 1f;


    private static final String TAG = "PDFVIEWER";
    private static final String FTAG = "PDFVIEWERFRG";

    public static final String EXTRA_PDFFILENAME = "net.sf.andpdf.extra.PDFFILENAME";
    public static final String EXTRA_SHOWIMAGES = "net.sf.andpdf.extra.SHOWIMAGES";
    public static final String EXTRA_ANTIALIAS = "net.sf.andpdf.extra.ANTIALIAS";
    public static final String EXTRA_USEFONTSUBSTITUTION = "net.sf.andpdf.extra.USEFONTSUBSTITUTION";
    public static final String EXTRA_KEEPCACHES = "net.sf.andpdf.extra.KEEPCACHES";

    public static final boolean DEFAULTSHOWIMAGES = true;
    public static final boolean DEFAULTANTIALIAS = true;
    public static final boolean DEFAULTUSEFONTSUBSTITUTION = false;
    public static final boolean DEFAULTKEEPCACHES = true;

    private String pdffilename;
    private PDFFile mPdfFile;
    private int mPage;
    private float mZoom;
    private File mTmpFile;
    private ProgressDialog progress;

    private TextView tv_page_no;
    String imgFileName;
    private ImageView rightArrow;
    private ImageView leftArrow;

    private PDFPage mPdfPage;

    private Thread backgroundThread;
    private Activity activity;

    TouchImageView tiv;

    @Override
    public void onAttach(Activity activity) {
        Log.i(FTAG, "PDFFragment.onAttatch");
        this.activity = activity;
        super.onAttach(activity);
    }

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Display display = activity.getWindowManager().getDefaultDisplay();
        int width = display.getWidth();
        int height = display.getHeight();

        if(activity.getResources().getConfiguration().orientation ==  Configuration.ORIENTATION_LANDSCAPE )
        {
            STARTZOOM = (1f*width)/800.0f;

        }
        else
        {
            STARTZOOM = (1f*height)/800.0f;

        }
        Log.i(FTAG, "PDFFragment: onCreate");
    }

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        Log.i(FTAG, "PDFFragment: onCreateView");

        View docView = inflater.inflate(R.layout.doc_viewer, container, false);
        setRetainInstance(true);

        boolean showImages = activity.getIntent().getBooleanExtra(PdfViewerFragment.EXTRA_SHOWIMAGES, PdfViewerFragment.DEFAULTSHOWIMAGES);
        PDFImage.sShowImages = showImages;
        boolean antiAlias = activity.getIntent().getBooleanExtra(PdfViewerFragment.EXTRA_ANTIALIAS, PdfViewerFragment.DEFAULTANTIALIAS);
        PDFPaint.s_doAntiAlias = antiAlias;
        boolean useFontSubstitution = activity.getIntent().getBooleanExtra(PdfViewerFragment.EXTRA_USEFONTSUBSTITUTION, PdfViewerFragment.DEFAULTUSEFONTSUBSTITUTION);
        PDFFont.sUseFontSubstitution= useFontSubstitution;
        boolean keepCaches = activity.getIntent().getBooleanExtra(PdfViewerFragment.EXTRA_KEEPCACHES, PdfViewerFragment.DEFAULTKEEPCACHES);
        HardReference.sKeepCaches= keepCaches;

        Bundle args = getArguments();
        if (args != null) {
            Log.i(FTAG, "Args Value: "+args.getString(EXTRA_PDFFILENAME));
            pdffilename = args.getString(EXTRA_PDFFILENAME);;
        } else {
            // TODO: open a default document
            pdffilename = "/mnt/sdcard/documents/3.pdf";
        }

        tiv = (TouchImageView) docView.findViewById(R.id.imageView); 
        leftArrow = (ImageView) docView.findViewById(R.id.leftArrow);
        rightArrow = (ImageView) docView.findViewById(R.id.rightArrow);

        leftArrow.setVisibility(View.GONE);
        rightArrow.setVisibility(View.GONE);

        if (pdffilename == null)
        {
            pdffilename = "No file selected";
        }
        else if(pdffilename.contains(".pdf"))
        {
            imgFileName= pdffilename.substring(0, pdffilename.lastIndexOf("."))+"_1.jpg";

            mPage = STARTPAGE;
            mZoom = STARTZOOM;
            progress = ProgressDialog.show(activity, "Loading", "Loading PDF Page", true, true);

            leftArrow.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    prevPage();
                }
            });

            rightArrow.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    nextPage();
                }
            });

            tv_page_no = (TextView) docView.findViewById(R.id.navigationText);

            tiv.setParent(this);
            setContent(null);
        }
        else if(pdffilename.contains(".jpg") || pdffilename.contains(".jpeg") || pdffilename.contains(".png") || pdffilename.contains(".gif") || pdffilename.contains(".bmp"))
        {
            imgFileName = pdffilename;
            tiv.setImageLocation(imgFileName);
        }
        else
        {
            pdffilename = "Invalid file extension";
        }

        return docView;
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        Log.i(FTAG, "PDFFragment: onViewCreated");
        super.onViewCreated(view, savedInstanceState);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        Log.i(FTAG, "PDFFragment: onActivityCreated");
    }

    @Override
    public void onStart() {
        Log.i(FTAG, "PDFFragment.onStart");
        super.onStart();
        //Bundle args = getArguments();
    }

    @Override
    public void onResume() {
        Log.i(FTAG, "PDFFragment.onResume");
        super.onResume();
    }

    @Override
    public void onPause() {
        Log.i(FTAG, "PDFFragment.onPause");
        super.onPause();
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        Log.i(FTAG, "PDFFragment.onSaveInstanceState");
        super.onSaveInstanceState(outState);
    }

    @Override
    public void onStop() {
        Log.i(FTAG, "PDFFragment.onStop");
        super.onStop();
    }

    @Override
    public void onDestroyView() {
        Log.i(FTAG, "PDFFragment.onDestroyView");
        super.onDestroyView();
    }

    @Override
    public void onDestroy() {
        Log.i(FTAG, "PDFFragment.onDestroy");
        super.onDestroy();
        if (mTmpFile != null) {
            mTmpFile.delete();
            mTmpFile = null;
        }
    }

    @Override
    public void onDetach() {
        Log.i(FTAG, "PDFFragment.onDetach");
        super.onDetach();
    }

    private boolean setContent(String password) {
        try {
            parsePDF(pdffilename, password);
            if(new File(imgFileName).exists())
            {
                tiv.setImageLocation(imgFileName);
                updateTexts(1);
                progress.dismiss();
            }
            else
                startRenderThread(mPage, mZoom);
        }
        catch (PDFAuthenticationFailureException e) {

        } catch (Exception e) {

        }
        return true;
    }

    public synchronized void startRenderThread(final int page, final float zoom) {
        if (backgroundThread != null)
            return;

        backgroundThread = new Thread(new Runnable() {
            public void run() {
                try {
                    if (mPdfFile != null) {
                        generatePDFPage(page, zoom);
                    }
                } catch (Exception e) {
                    Log.e(TAG, e.getMessage(), e);
                }
                backgroundThread = null;
            }
        });
        backgroundThread.start();
    }


    public void nextPage() {
        if (mPdfFile != null) {
            if (mPage < mPdfFile.getNumPages()) {
                mPage += 1;
                imgFileName= pdffilename.substring(0, pdffilename.lastIndexOf("."))+"_"+String.valueOf(mPage)+".jpg";
                if(new File(imgFileName).exists())
                {
                    tiv.setImageLocation(imgFileName);
                    updateTexts(mPage);
                    progress.dismiss();
                }
                else
                {
                    progress = ProgressDialog.show(activity, "Loading", "Loading PDF Page " + mPage, true, true);
                    startRenderThread(mPage, STARTZOOM);
                }
            }
        }
    }

    public void prevPage() {
        if (mPdfFile != null) {
            if (mPage > 1) {
                mPage -= 1;
                imgFileName= pdffilename.substring(0, pdffilename.lastIndexOf("."))+"_"+String.valueOf(mPage)+".jpg";
                if(new File(imgFileName).exists())
                {
                    tiv.setImageLocation(imgFileName);
                    updateTexts(mPage);
                    progress.dismiss();
                }
                else
                {
                    progress = ProgressDialog.show(activity, "Loading", "Loading PDF Page " + mPage, true, true);
                    startRenderThread(mPage, STARTZOOM);
                }
            }
        }
    }

    protected void updateTexts(int pageNo) {

        if (mPdfFile != null) {
            tv_page_no.setText("Page "+pageNo+"/"+mPdfFile.getNumPages());
            if(mPdfFile.getNumPages() > 1)
            {
                if(pageNo==1)
                    leftArrow.setVisibility(View.GONE);
                else
                    leftArrow.setVisibility(View.VISIBLE);

                if(pageNo == mPdfFile.getNumPages())
                    rightArrow.setVisibility(View.GONE);
                else
                    rightArrow.setVisibility(View.VISIBLE);
            }
        }
    }

    public void generatePDFPage(final int page, float zoom) throws Exception {

        try {
            // Only load the page if it's a different page (i.e. not just changing the zoom level)
            if (mPdfPage == null || mPdfPage.getPageNumber() != page) {
                mPdfPage = mPdfFile.getPage(page, true);
            }

            float width = mPdfPage.getWidth();
            float height = mPdfPage.getHeight();

            RectF clip = null;

            Bitmap bmp =  mPdfPage.getImage((int)(width*zoom), (int)(height*zoom), clip, true, true);
            //imgFileName +=  String.valueOf(page)+".jpg";

            FileOutputStream fo = null;
            try {
                ByteArrayOutputStream bytes = new ByteArrayOutputStream();
                bmp.compress(Bitmap.CompressFormat.JPEG, 50, bytes);
                File f = new File(imgFileName);
                f.createNewFile();
                fo = new FileOutputStream(f);
                fo.write(bytes.toByteArray());
            } catch (IOException e) {
                e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
            } catch (Exception ex) {

            } finally {
                if (fo != null) {
                    try {
                        fo.close();
                    } catch (IOException e) {
                        e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
                    }
                }
            }

            activity.runOnUiThread(new Runnable() {
                public void run() {
                    tiv.setImageLocation(imgFileName);
                    //tiv.setImageBitmap(BitmapFactory.decodeFile(imgFileName));
                    updateTexts(page);
                    if (progress != null)
                        progress.dismiss();
                }
            });




        } catch (Throwable e) {
            Log.e(TAG, e.getMessage(), e);

        }

    }

    public void parsePDF(String filename, String password) throws PDFAuthenticationFailureException {
        pdffilename =  filename;
        try {
            File f = new File(filename);
            long len = f.length();
            if (len == 0) {

            }
            else {

                openFile(f, password);
            }
        }
        catch (PDFAuthenticationFailureException e) {
            throw e;
        } catch (Throwable e) {
            e.printStackTrace();

        }

    }

    /**
     * <p>Open a specific pdf file.  Creates a DocumentInfo from the file,
     * and opens that.</p>
     *
     * <p><b>Note:</b> Mapping the file locks the file until the PDFFile
     * is closed.</p>
     *
     * @param file the file to open
     * @throws IOException
     */
    public void openFile(File file, String password) throws IOException {
        // first open the file for random access
        RandomAccessFile raf = null;
        try
        {
            raf = new RandomAccessFile(file, "r");
            // extract a file channel
            FileChannel channel = raf.getChannel();

            // now memory-map a byte-buffer
            ByteBuffer bb = ByteBuffer.NEW(channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size()));
            // create a PDFFile from the data
            if (password == null)
                mPdfFile = new PDFFile(bb);
            else
                mPdfFile = new PDFFile(bb, new PDFPassword(password));


        } catch (Exception ex)
        {

        } finally {
            raf.close();
        }


    }

}

答案 1 :(得分:0)

这是使用PDFViewer在片段中加载PDF

@Override     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_keluarga, container, false);
pdfView = (PDFView) v.findViewById(R.id.keluargaPdf);
pdfView.fromAsset("tiga.pdf").load();

// Inflate the layout for this fragment
return v;
}