Read a pdf file from assets folder

匿名 (未验证) 提交于 2019-12-03 02:11:02

问题:

public void DOCS(View btnDocs) {        File fileBrochure = new File("android.resource://com.project.datastructure/assets/abc.pdf");     if (!fileBrochure.exists())     {          CopyAssetsbrochure();     }       /** PDF reader code */     File file = new File("android.resource://com.project.datastructure/assets/abc.pdf");              Intent intent = new Intent(Intent.ACTION_VIEW);     intent.setDataAndType(Uri.fromFile(file),"application/pdf");     intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);     try      {         getApplicationContext().startActivity(intent);     }      catch (ActivityNotFoundException e)      {          Toast.makeText(Stack_dr.this, "NO Pdf Viewer", Toast.LENGTH_SHORT).show();     } } private void CopyAssetsbrochure() {     AssetManager assetManager = getAssets();     String[] files = null;     try      {         files = assetManager.list("");     }      catch (IOException e){}     for(int i=0; i<files.length; i++)     {         String fStr = files[i];         if(fStr.equalsIgnoreCase("abc.pdf"))         {             InputStream in = null;             OutputStream out = null;             try              {               in = assetManager.open(files[i]);               out = new FileOutputStream("/sdcard/" + files[i]);               copyFile(in, out);               in.close();               in = null;               out.flush();               out.close();               out = null;               break;             }              catch(Exception e){}         }     } }   private void copyFile(InputStream in, OutputStream out) throws IOException    {     byte[] buffer = new byte[1024];     int read;     while((read = in.read(buffer)) != -1){       out.write(buffer, 0, read);     } } 

I am trying to read a pdf file from assets folder which is present in my application folder . Everything is working perfectly when i click on my DOCS button a pop up comes to let me choose an application for opening the pdf i.e "abc.pdf" but after selecting an option i get an error message "The file path is not valid". I think their is some problem with the path which i have specified in the code. please help

回答1:

Try this

public class SampleActivity extends Activity     {          @Override         protected void onCreate(Bundle savedInstanceState)         {             super.onCreate(savedInstanceState);             setContentView(R.layout.main);             CopyReadAssets();          }          private void CopyReadAssets()         {             AssetManager assetManager = getAssets();              InputStream in = null;             OutputStream out = null;             File file = new File(getFilesDir(), "abc.pdf");             try             {                 in = assetManager.open("abc.pdf");                 out = openFileOutput(file.getName(), Context.MODE_WORLD_READABLE);                  copyFile(in, out);                 in.close();                 in = null;                 out.flush();                 out.close();                 out = null;             } catch (Exception e)             {                 Log.e("tag", e.getMessage());             }              Intent intent = new Intent(Intent.ACTION_VIEW);             intent.setDataAndType(                     Uri.parse("file://" + getFilesDir() + "/abc.pdf"),                     "application/pdf");              startActivity(intent);         }          private void copyFile(InputStream in, OutputStream out) throws IOException         {             byte[] buffer = new byte[1024];             int read;             while ((read = in.read(buffer)) != -1)             {                 out.write(buffer, 0, read);             }         }      } 

Make sure to include

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

in manifest



回答2:

Though this has been answered, I wanted to share my solution as I think it is a bit easier to include.

Usage:

new OpenLocalPDF(context, 'nameOfPDFStoredInAssets').execute() 

And here is the OpenLocalPDF class:

public class OpenLocalPDF {      private static String TAG = OpenLocalPDF.class.getSimpleName();      private WeakReference<Context> contextWeakReference;     private String fileName;      public OpenLocalPDF(Context context, String fileName) {         this.contextWeakReference = new WeakReference<>(context);         this.fileName = fileName.endsWith("pdf") ? fileName : fileName + ".pdf";     }      public void execute() {          Context context = contextWeakReference.get();         if (context != null) {             new CopyFileAsyncTask().execute();         }      }       private class CopyFileAsyncTask extends AsyncTask<Void, Void, File> {           final String appDirectoryName = BuildConfig.APPLICATION_ID;         final File fileRoot = new File(Environment.getExternalStoragePublicDirectory(                 Environment.DIRECTORY_DOCUMENTS), appDirectoryName);          @Override         protected File doInBackground(Void... params) {              Context context = contextWeakReference.get();              AssetManager assetManager = context.getAssets();              File file = new File(fileRoot, fileName);              InputStream in = null;             OutputStream out = null;             try {                  file.mkdirs();                  if (file.exists()) {                     file.delete();                 }                  file.createNewFile();                   in = assetManager.open(fileName);                 Log.d(TAG, "In");                  out = new FileOutputStream(file);                 Log.d(TAG, "Out");                  Log.d(TAG, "Copy file");                 copyFile(in, out);                  Log.d(TAG, "Close");                 in.close();                  out.flush();                 out.close();                  return file;             } catch (Exception e)             {                 Log.e(TAG, e.getMessage());             }              return null;         }          private void copyFile(InputStream in, OutputStream out) throws IOException         {             byte[] buffer = new byte[1024];             int read;             while ((read = in.read(buffer)) != -1)             {                 out.write(buffer, 0, read);             }         }          @Override         protected void onPostExecute(File file) {             super.onPostExecute(file);              Context context = contextWeakReference.get();               Intent intent = new Intent(Intent.ACTION_VIEW);             intent.setDataAndType(                     Uri.fromFile(file),                     "application/pdf");              context.startActivity(intent);          }     } } 

add this permission in Manifest.xml

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


回答3:

like say sunsil, but in the case for external directory.

import android.app.Activity; import android.content.Intent; import android.content.res.AssetManager; import android.net.Uri; import android.os.Environment; import android.os.Bundle; import android.util.Log; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream;   public class MainActivity extends Activity {      @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);          copyReadAssets();     }       private void copyReadAssets()     {         AssetManager assetManager = getAssets();          InputStream in = null;         OutputStream out = null;          String strDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)+ File.separator + "Pdfs";         File fileDir = new File(strDir);         fileDir.mkdirs();   // crear la ruta si no existe         File file = new File(fileDir, "example2.pdf");            try         {              in = assetManager.open("example.pdf");  //leer el archivo de assets             out = new BufferedOutputStream(new FileOutputStream(file)); //crear el archivo               copyFile(in, out);             in.close();             in = null;             out.flush();             out.close();             out = null;         } catch (Exception e)         {             Log.e("tag", e.getMessage());         }          Intent intent = new Intent(Intent.ACTION_VIEW);         intent.setDataAndType(Uri.parse("file://" + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + File.separator + "Pdfs" + "/example2.pdf"), "application/pdf");         startActivity(intent);     }      private void copyFile(InputStream in, OutputStream out) throws IOException     {         byte[] buffer = new byte[1024];         int read;         while ((read = in.read(buffer)) != -1)         {             out.write(buffer, 0, read);         }     } } 

change parts of code like these:

out = new BufferedOutputStream(new FileOutputStream(file)); 

the before example is for Pdfs, in case of to example .txt

FileOutputStream fos = new FileOutputStream(file); 


回答4:

Leider bekomme ich nichts angezeigt in meiner App. Wo und wie muss ich den Assets Ordner anlegen, oder wo muss ich die PDF `enter code here`Datei ablegen?  enter code here 

enter code here

    <uses-permission    `enter code here`android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 



回答5:

If you want to open a .pdf file that is stored locally in the assets folder without using an Intent to launch an external app, I suggest using the Android class PdfRenderer. Documentation found here.

This is a good example that worked for me.

However, this example wouldn't run when I downloaded it. I had to change it a bit to use the copyReadAssets() function as mentioned in the other answers here, then to reference the file (after it has been copied) I use:

File file = new File("/data/data/" + getContext().getPackageName() + "/files/mypdf.pdf"); 

I also ended up modifying onAttach() because it was using the deprecated form of onAttach() and closeRenderer() because it was throwing errors for closing objects that were null.

So my complete PdfRendererBasicFragment.java file looks like this:

package com.example.android.pdfrendererbasic;  import android.app.Activity; import android.app.Fragment; import android.content.Context; import android.content.res.AssetManager; import android.graphics.Bitmap; import android.graphics.pdf.PdfRenderer; import android.os.Bundle; import android.os.ParcelFileDescriptor; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.ImageView; import android.widget.Toast; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream;  /**  * This fragment has a big {@ImageView} that shows PDF pages, and 2 {@link android.widget.Button}s to move between  * pages. We use a {@link android.graphics.pdf.PdfRenderer} to render PDF pages as {@link android.graphics.Bitmap}s.  */ public class PdfRendererBasicFragment extends Fragment implements View.OnClickListener {      /**      * Key string for saving the state of current page index.      */     private static final String STATE_CURRENT_PAGE_INDEX = "current_page_index";      /**      * File descriptor of the PDF.      */     private ParcelFileDescriptor mFileDescriptor;      /**      * {@link android.graphics.pdf.PdfRenderer} to render the PDF.      */     private PdfRenderer mPdfRenderer;      /**      * Page that is currently shown on the screen.      */     private PdfRenderer.Page mCurrentPage;      /**      * {@link android.widget.ImageView} that shows a PDF page as a {@link android.graphics.Bitmap}      */     private ImageView mImageView;      /**      * {@link android.widget.Button} to move to the previous page.      */     private Button mButtonPrevious;      /**      * {@link android.widget.Button} to move to the next page.      */     private Button mButtonNext;      public PdfRendererBasicFragment() {     }      @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);         // Retain view references.         mImageView = (ImageView) view.findViewById(R.id.image);         mButtonPrevious = (Button) view.findViewById(R.id.previous);         mButtonNext = (Button) view.findViewById(R.id.next);         // Bind events.         mButtonPrevious.setOnClickListener(this);         mButtonNext.setOnClickListener(this);         // Show the first page by default.         int index = 0;         // If there is a savedInstanceState (screen orientations, etc.), we restore the page index.         if (null != savedInstanceState) {             index = savedInstanceState.getInt(STATE_CURRENT_PAGE_INDEX, 0);         }         showPage(index);     }      @Override     public void onAttach(Context context) {         super.onAttach(context);         try {             openRenderer(context);         } catch (IOException e) {             e.printStackTrace();             Toast.makeText(context, "Error! " + e.getMessage(), Toast.LENGTH_SHORT).show();             getActivity().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 {         // Copy the pdf to a usable location         CopyReadAssets();          File file = new File("/data/data/" + context.getPackageName() + "/files/sample.pdf");         mPdfRenderer = new PdfRenderer(ParcelFileDescriptor.open(file, ParcelFileDescriptor.MODE_READ_ONLY));     }      /**      * Closes the {@link android.graphics.pdf.PdfRenderer} and related resources.      *      * @throws java.io.IOException When the PDF file cannot be closed.      */     private void closeRenderer() throws IOException {         if (mCurrentPage != null) {             mCurrentPage.close();         }          if (mPdfRenderer != null) {             mPdfRenderer.close();         }          if (mFileDescriptor != null) {             mFileDescriptor.close();         }     }      /**      * Shows the specified page of PDF to the screen.      *      * @param index The page index.      */     private void showPage(int index) {         if (mPdfRenderer.getPageCount() <= index) {             return;         }         // Make sure to close the current page before opening another one.         if (null != mCurrentPage) {             mCurrentPage.close();         }         // Use `openPage` to open a specific page in PDF.         mCurrentPage = mPdfRenderer.openPage(index);         // Important: the destination bitmap must be ARGB (not RGB).         Bitmap bitmap = Bitmap.createBitmap(mCurrentPage.getWidth(), mCurrentPage.getHeight(),                 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);         // We are ready to show the Bitmap to user.         mImageView.setImageBitmap(bitmap);         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(R.string.app_name_with_index, 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 CopyReadAssets()     {         AssetManager assetManager = getActivity().getAssets();          InputStream in = null;         OutputStream out = null;         File file = new File(getActivity().getFilesDir(), "sample.pdf");          if(!file.exists()) {             try {                 in = assetManager.open("sample.pdf");                 out = getActivity().openFileOutput(file.getName(), Context.MODE_WORLD_READABLE);                  copyFile(in, out);                 in.close();                 in = null;                 out.flush();                 out.close();                 out = null;             } catch (Exception e) {                 Log.e("tag", e.getMessage());             }         }         else {             Log.d("test", "file already exists");         }     }      private void copyFile(InputStream in, OutputStream out) throws IOException     {         byte[] buffer = new byte[1024];         int read;         while ((read = in.read(buffer)) != -1)         {             out.write(buffer, 0, read);         }     }  } 


回答6:

try this:

public String getAssetsPdfPath(Context context) { String filePath = context.getFilesDir() + File.separator + "myFile.pdf"; File destinationFile = new File(filePath);  try { FileOutputStream outputStream = new FileOutputStream(destinationFile); InputStream inputStream = context.getAssets().open("myFile.pdf"); byte[] buffer = new byte[1024]; int length = 0; while ((length = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, length); } outputStream.close(); inputStream.close(); } catch (IOException e) { Log.e(context.getClass().getSimpleName(), "Error."); }  return destinationFile.getPath(); } 


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!