STEP - 1 : Add permission to Manifest
Manifest.xml
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
STEP - 2 : a. Create a New Project
b. Create Assets folder
Go to - app --- right click --- new --- folder --- Assets Folder --- Finish
STET - 3 : Copy a pdf file in Assets folder
In my case - Name : "sample.pdf"
STEP - 4 : On Main Activity
a. Move PDF Button - move pdf from assets to storage
b. View PDF Button - Show PDF after move
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
android:orientation="vertical" >
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="View PDF"
android:onClick="viewPDF"
/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Move PDF"
android:layout_marginTop="48dp"
android:onClick="movePDF"
/></LinearLayout>
MainActivity.java
import android.app.ProgressDialog;
import android.content.Context;import android.content.Intent;import android.content.res.AssetManager;import android.os.AsyncTask;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;
import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;
public class MainActivity extends AppCompatActivity {
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
}
public void viewPDF(View view)
{
Intent pdfIntent = new Intent(MainActivity.this, PDFViewActivity.class); startActivity(pdfIntent); }
public void movePDF(View view)
{
AsyncTaskRunner taskRunner = new AsyncTaskRunner(MainActivity.this); taskRunner.execute(); }
// ---------------------------------------------------for image transfer public class AsyncTaskRunner extends AsyncTask<Void,String,Void> {
ProgressDialog progressDialog; private Context ctx; public AsyncTaskRunner(Context myContext) {
this.ctx = myContext; }
@Override protected void onPreExecute() {
super.onPreExecute(); progressDialog = ProgressDialog.show(ctx,"Moving File", "Processing..."); }
@Override protected Void doInBackground(Void... voids) {
publishProgress("Processing..."); // Calls onProgressUpdate() try {
copyDirorfileFromAssetManager("AllFile", "Pdf"); } catch (IOException e) {
e.printStackTrace(); }
return null; }
@Override protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid); progressDialog.dismiss(); }
public String copyDirorfileFromAssetManager(String arg_assetDir, String arg_destinationDir) throws IOException {
String dest_dir_path = addLeadingSlash(arg_destinationDir); File dest_dir = new File(ctx.getExternalFilesDir(null), dest_dir_path); createDir(dest_dir); AssetManager asset_manager = ctx.getAssets(); String[] files = asset_manager.list(arg_assetDir); for (int i = 0; i < files.length; i++) {
String abs_asset_file_path = addTrailingSlash(arg_assetDir) + files[i]; String sub_files[] = asset_manager.list(abs_asset_file_path); if (sub_files.length == 0) {
String dest_file_path = addTrailingSlash(dest_dir_path) + files[i]; File dest_file = new File(ctx.getExternalFilesDir(null), dest_file_path); System.out.print(dest_file); String testpath = String.valueOf(dest_file); copyAssetFile(abs_asset_file_path, testpath); } else {
copyDirorfileFromAssetManager(abs_asset_file_path, addTrailingSlash(arg_destinationDir) + files[i]); }
}
return dest_dir_path; }
public void copyAssetFile(String assetFilePath, String destinationFilePath) throws IOException {
InputStream in = ctx.getAssets().open(assetFilePath); OutputStream out = new FileOutputStream(destinationFilePath); byte[] buf = new byte[1024]; int len; while ((len = in.read(buf)) > 0)
out.write(buf, 0, len); in.close(); out.close(); }
public String addTrailingSlash(String path) {
if (path.charAt(path.length() - 1) != '/') {
path += "/"; }
return path; }
public String addLeadingSlash(String path) {
if (path.charAt(0) != '/') {
path = "/" + path; }
return path; }
public void createDir(File dir) throws IOException {
if (dir.exists()) {
if (!dir.isDirectory()) {
throw new IOException("Can't create directory, a file is in the way"); }
} else {
dir.mkdirs();
if (!dir.isDirectory()) {
throw new IOException("Unable to create directory"); }
}
}
}
}
STEP - 5 : Create a activity, which is work like as a container of pdf
activity_pdfview.xml
<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" tools:ignore="MergeRootFrame" />
PDFViewActivity.java
package pdfreader2.pdf.app.com.pdffromstorage;
import android.app.Activity;import android.app.AlertDialog;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;
public class PDFViewActivity 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_pdfview); if (savedInstanceState == null) {
getFragmentManager().beginTransaction()
.add(R.id.container, new PdfRendererBasicFragment(), FRAGMENT_PDF_RENDERER_BASIC)
.commit(); }
}
}
STEP - 6 : Create a fragment, which retrieve data from storage and show on view
a. create a class, where your MainActivity.java exist
PdfRendererBasicFragment.java
import android.app.Activity;import android.app.Fragment;import android.content.Context;import android.graphics.Bitmap;import android.graphics.pdf.PdfRenderer;import android.os.Bundle;import android.os.ParcelFileDescriptor;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;
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 ImageView mImageView;
private Button mButtonPrevious;
private Button mButtonNext;
Context context; 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(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()); }
}
private void openRenderer(Context context) throws IOException {
// In this sample, we read a PDF from the assets directory. //mFileDescriptor = context.getAssets().openFd("sample.pdf").getParcelFileDescriptor(); //File f = FileUtils.fileFromAsset(context, "AllFile/Pdf/sample.pdf"); File dest_dir = new File(getActivity().getExternalFilesDir(null), "/Pdf/Pdf/sample.pdf"); // ParcelFileDescriptor pfd = ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_READ_ONLY); mFileDescriptor = ParcelFileDescriptor.open(dest_dir, ParcelFileDescriptor.MODE_READ_ONLY); // mFileDescriptor = ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_READ_ONLY); // This is the PdfRenderer we use to render the PDF. mPdfRenderer = new PdfRenderer(mFileDescriptor); }
private void closeRenderer() throws IOException {
if (null != mCurrentPage) {
mCurrentPage.close(); }
mPdfRenderer.close(); 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)); }
/** * 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; }
}
}
}
b. create a layout in res--->layout, which is view of pdf
fragment_pdf_renderer_basic.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" >
<ImageView android:id="@+id/image" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:background="@android:color/white" android:scaleType="fitCenter" />
<LinearLayout style="?android:attr/buttonBarStyle" android:layout_width="match_parent" android:layout_height="wrap_content" android:measureWithLargestChild="true" android:orientation="horizontal">
<Button android:id="@+id/previous" style="?android:attr/buttonBarButtonStyle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="@string/previous" />
<Button android:id="@+id/next" style="?android:attr/buttonBarButtonStyle" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="@string/next" /> </LinearLayout>
</LinearLayout>
STEP - 6 : Create a class, which handle the interation between app storage ( Phone or Assets)
FileUtils.java
import android.content.Context;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;
public class FileUtils {
private FileUtils() {
// Prevents instantiation }
public static File fileFromAsset(Context context, String assetName) throws IOException {
File outFile = new File(context.getCacheDir(), assetName + "-pdfview.pdf"); if (assetName.contains("/")) {
outFile.getParentFile().mkdirs(); }
copy(context.getAssets().open(assetName), outFile); return outFile; }
public static void copy(InputStream inputStream, File output) throws IOException {
OutputStream outputStream = null; try {
outputStream = new FileOutputStream(output); int read = 0; byte[] bytes = new byte[1024]; while ((read = inputStream.read(bytes)) != -1) {
outputStream.write(bytes, 0, read); }
} finally {
try {
if (inputStream != null) {
inputStream.close(); }
} finally {
if (outputStream != null) {
outputStream.close(); }
}
}
}
}
\\\