1

这是我的问题。

当我在 3rd 方 pdf 阅读器中打开 pdf 时,它显示正确。

在此处输入图像描述

但是,当我使用本机 android pdf 阅读器打开 pdf 时,它无法正确显示。

它显示为

在此处输入图像描述

这是代码

ShowPDFActivity.java

public class ShowPDFActivity extends Activity {

    public static final String FRAGMENT_PDF_RENDERER_BASIC = "pdf_renderer_basic";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_pdf_container);

        Intent in = getIntent();

        //String filepath = in.getExtras().getString("filepath");
        File f = (File)in.getExtras().get("file");
        if (savedInstanceState == null) {
            getFragmentManager().beginTransaction()
                    .add(R.id.container, new PdfRendererBasicFragment(f),
                            FRAGMENT_PDF_RENDERER_BASIC)
                    .commit();
        }
    }

PDFRendererBasicFragment.java

public class PdfRendererBasicFragment extends Fragment implements View.OnClickListener {

    
    private static final String STATE_CURRENT_PAGE_INDEX = "current_page_index";
    private ParcelFileDescriptor mFileDescriptor;
    private PdfRenderer mPdfRenderer;
    private PdfRenderer.Page mCurrentPage;
    private TouchImageView mImageView;
    private Button mButtonPrevious;
    private Button mButtonNext;
    private String filepath;
    private File file;

    public PdfRendererBasicFragment(File file) 
    {
    	//this.filepath = filepath;
    	this.file = file;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_pdf_renderer_basic, container, false);
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        
        mImageView = (TouchImageView) view.findViewById(R.id.image);
        mButtonPrevious = (Button) view.findViewById(R.id.previous);
        mButtonNext = (Button) view.findViewById(R.id.next);
        mButtonPrevious.setOnClickListener(this);
        mButtonNext.setOnClickListener(this);
        // Show the first page by default.
        int index = 0;
        
        if (null != savedInstanceState) {
            index = savedInstanceState.getInt(STATE_CURRENT_PAGE_INDEX, 0);
        }
        showPage(index);
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            openRenderer(activity);
        } catch (IOException e) {
            e.printStackTrace();
            Toast.makeText(activity, "Error! " + e.getMessage(), Toast.LENGTH_SHORT).show();
            activity.finish();
        }
    }

    @Override
    public void onDetach() {
        try {
            closeRenderer();
        } catch (IOException e) {
            e.printStackTrace();
        }
        super.onDetach();
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        if (null != mCurrentPage) {
            outState.putInt(STATE_CURRENT_PAGE_INDEX, mCurrentPage.getIndex());
        }
    }

    /**
     * Sets up a {@link android.graphics.pdf.PdfRenderer} and related resources.
     */
    private void openRenderer(Context context) throws IOException {
       
    	Log.d("FILE :",""+Environment.getExternalStorageDirectory());
    	//File f = new File(Environment.getExternalStorageDirectory()+"/Dec_Newsletter.pdf");
    	//Toast.makeText(getActivity(), "Filepath "+filepath, Toast.LENGTH_LONG).show();
    	//File f = new File(filepath);
    	//Log.d("File :", "File :"+f);
        mFileDescriptor = ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY);
  
        mPdfRenderer = new PdfRenderer(mFileDescriptor);
    }

   
    private void closeRenderer() throws IOException {
        if (null != mCurrentPage) {
            mCurrentPage.close();
        }
        mPdfRenderer.close();
        mFileDescriptor.close();
    }

   
    private void showPage(int index) {
        if (mPdfRenderer.getPageCount() <= index) {
            return;
        }
        
        if (null != mCurrentPage) {
            mCurrentPage.close();
        }
        
        mCurrentPage = mPdfRenderer.openPage(index);
       
        Bitmap bitmap = Bitmap.createBitmap(mCurrentPage.getWidth()*2, mCurrentPage.getHeight()*2,
                Bitmap.Config.ARGB_8888);
        // Here, we render the page onto the Bitmap.
        // To render a portion of the page, use the second and third parameter. Pass nulls to get
        // the default result.
        // Pass either RENDER_MODE_FOR_DISPLAY or RENDER_MODE_FOR_PRINT for the last parameter.
        mCurrentPage.render(bitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);
        bitmap.setHasAlpha(true);
        bitmap.setHasMipMap(true);
        // We are ready to show the Bitmap to user.
        mImageView.setImageBitmap(bitmap);
        saveBitmapTpSdCard(bitmap,"testimage");
        updateUi();
    }

    /**
     * Updates the state of 2 control buttons in response to the current page index.
     */
    private void updateUi() {
        int index = mCurrentPage.getIndex();
        int pageCount = mPdfRenderer.getPageCount();
        mButtonPrevious.setEnabled(0 != index);
        mButtonNext.setEnabled(index + 1 < pageCount);
      //  getActivity().setTitle(getString(0, index + 1, pageCount));
    }

    /**
     * Gets the number of pages in the PDF. This method is marked as public for testing.
     *
     * @return The number of pages.
     */
    public int getPageCount() {
        return mPdfRenderer.getPageCount();
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.previous: {
                // Move to the previous page
                showPage(mCurrentPage.getIndex() - 1);
                break;
            }
            case R.id.next: {
                // Move to the next page
                showPage(mCurrentPage.getIndex() + 1);
                break;
            }
        }
    }
    
    private void saveBitmapTpSdCard(Bitmap bitmap, String fileName) {
        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 40, bytes);

        File f = new File(Environment.getExternalStorageDirectory()
                + File.separator + getString(R.string.app_name));

        try {
            if(!f.exists()) {
                f.mkdirs();
            }
            File imageFile = new File(f, fileName + ".png");
            FileOutputStream fo = new FileOutputStream(imageFile);
            fo.write(bytes.toByteArray());
            fo.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

4

1 回答 1

0

花了几个小时后我找到了简单的答案......

在android清单文件中是

<uses-sdk android:minSdkVersion="8"/>

在 android 清单文件中,您需要包含

<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="21"/>
于 2015-06-24T11:48:22.707 回答