Read pdf file from data folder

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'm trying to read a pdf file from a resource folder that is present in my application folder. Everything works fine, when I click on the DOCS button, a pop-up window appears that allows me to select the application to open pdf ie "abc.pdf", but after choosing the option I get the error "Invalid file path". I think their problem is related to what I indicated in the code. please, help

+20
java android android-intent
Jun 13 '13 at 11:08
source share
10 answers

try it

 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); } } } 

Be sure to enable

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

in manifest

+36
Jun 13 '13 at 11:17
source share

You can do it like this (tested and working on API 27)

Step 1

Add the following dependency in the application graph:

 implementation 'com.github.barteksc:android-pdf-viewer:2.8.2' 

Step 2

Add the following XML code:

 <com.github.barteksc.pdfviewer.PDFView android:id="@+id/pdfv" android:layout_width="match_parent" android:layout_height="match_parent"> </com.github.barteksc.pdfviewer.PDFView> 

Step 3

Add the following code to your java file:

 public class MainActivity extends AppCompatActivity { PDFView pdfView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); pdfView=findViewById(R.id.pdfv); pdfView.fromAsset("filename.pdf").load(); } } 

These changes will load the PDF file when you create your activity.

+6
Jun 23 '18 at 13:09
source share

Although this was answered, I wanted to share my decision, because, in my opinion, it is a little easier to include.

Using:

 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 to Manifest.xml

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
+5
Dec 18 '16 at 20:47
source share

like sunsil , but in the case of an 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 the parts of the code as follows:

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

previous example for Pdfs, in the case of, for example, .txt

 FileOutputStream fos = new FileOutputStream(file); 
+3
May 28 '15 at 21:43
source share
 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" /> 

  <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> MainActivity: package de.wosi34.sampleactivity; 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, "abc1.pdf"); try { in = assetManager.open("abc.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" + "/abc1.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); } } } activity_main.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="de.wosi34.sampleactivity.MainActivity"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" /> <WebView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerVertical="true" android:layout_centerHorizontal="true" /> </RelativeLayout> Es wäre nett wenn man mir weiterhelfen könnte. Ich möchte nur mehrere PDF Dateien in der App fest ablegen und sie in der App anzeigen lassen. Vielen Dank im voraus. 
0
Jan 21 '17 at 4:30
source share

try the following:

 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(); } 
0
josef May 15 '17 at 6:27
source share

I can do this on the main activity files, but can someone tell me how to do this under TAB? I mean, I want to load different pdf files under each tab, for example pdf1 under TAB1, pdf2 under TAB2.

0
Jan 19 '19 at 13:08
source share

I had success using a response from cYrixmorten , with the OpenLocalPDF class.

But Environment.DIRECTORY_DOCUMENTS is not supported for Android 18. To support Android 18 - 28, I had to make the following changes.

In "CopyFileAsyncTask" change the fileRoot declaration:

 final File fileRoot = new File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_DOCUMENTS), appDirectoryName); 

To that:

 final File fileRoot = new File(Environment.getExternalStorageDirectory() + "/YourAppName"); 

In "onPostExecute" change this:

 Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType( Uri.fromFile(file), "application/pdf"); context.startActivity(intent); 

To that:

 Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(FileProvider.getUriForFile(context, "com.example.yourappname.provider", file), "application/pdf"); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); context.startActivity(intent); 

Finally, configure the manifest to support FileProvider, as described in this post.

0
Jul 07 '19 at 20:02
source share

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

This is a good example that worked for me.

However, this example will not work when I downloaded it. I had to modify it a bit to use the copyReadAssets () function, as mentioned in other answers here , then refer to the file (after copying it) I use

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

I also finished modifying onAttach () because it used the deprecated form onAttach () and closeRenderer (), because it threw errors to close objects that were empty.

So my full 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); } } } 
-one
08 Oct '16 at 18:22
source share

This code works with every version of Android:

Activity:

 import android.app.Activity; import android.content.Intent; import android.content.pm.PackageManager; import android.content.res.AssetManager; import android.net.Uri; import android.os.Environment; import android.os.Bundle; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v4.content.FileProvider; import android.util.Log; import android.widget.Toast; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import unimedbh.UnimedBH.R; public class MainActivity extends Activity { private static final int MY_PERMISSION_REQUEST_STORAGE = 1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(MainActivity.this, new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSION_REQUEST_STORAGE); } else { copyReadAssets("YOUR_PDF_NAME.pdf"); } } private void copyReadAssets(String fileName) { String dirPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/MyFiles"; File dir = new File(dirPath); if (!dir.exists()) { dir.mkdirs(); } AssetManager assetManager = getAssets(); InputStream in = null; OutputStream out = null; try { in = assetManager.open(fileName); File outFile = new File(dirPath, fileName); out = new FileOutputStream(outFile); copyFile(in, out); Intent intent = new Intent(Intent.ACTION_VIEW, FileProvider.getUriForFile(this, "com.package.name.fileprovider", outFile)); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_ACTIVITY_NO_HISTORY); startActivity(intent); } catch (IOException e) { e.printStackTrace(); Toast.makeText(this, "Error!", Toast.LENGTH_SHORT).show(); } finally { if (in != null) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } if (out != null) { try { out.close(); } catch (IOException e) { e.printStackTrace(); } } } } 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); } } } 

manifest.xml:

 <provider android:name="android.support.v4.content.FileProvider" android:authorities="com.package.name.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider> 

file_paths.xml:

 <paths> <files-path name="app_directory" path="directory/"/> </paths> 

Tested in API 16-28, worked on all api's!

-one
Jun 11 '18 at 19:39
source share



All Articles