Creating a pdf file in android programmatically and writing in it
I'm trying to create a pdf file inside my app, save it on the external storage the open it. Saving a file isn't an issue for me, nor is opening one, my issue is with creating one and writing in it. So after some research online I found the following way of doing it:
File file = new File(directoryName, fileName);
// Creating output stream to write in the newly created file
FileOutputStream fOut = null;
try {
fOut = new FileOutputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
// Creating a new document
Document document = new Document(PageSize.A4, 50, 50, 50, 50);
try {
PdfWriter.getInstance(document, fOut);
// Open the document for writing
document.open();
// Write in the document
document.add(new Paragraph("Hello world"));
document.close();
} catch (DocumentException de) {
System.err.println(de.getMessage());
}
Upon running my app and executing the code above, I get the following error:
java.lang.NoClassDefFoundError: Failed resolution of: Ljava/awt/Color;
Would someone know what's the issue with my code, or of another way that is sure to work for creating and writing a pdf file ?
Thanks !
So apparently the code I was using wasn't compatible with android, hence the error I was getting. Below you'll find the correct code that actually works right (for creating a pdf file, putting some content in it, saving in and the opening the newly created file):
PS: For this you'll need to add the jar of iTextG to your project:
// Method for creating a pdf file from text, saving it then opening it for display
public void createandDisplayPdf(String text) {
Document doc = new Document();
try {
String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Dir";
File dir = new File(path);
if(!dir.exists())
dir.mkdirs();
File file = new File(dir, "newFile.pdf");
FileOutputStream fOut = new FileOutputStream(file);
PdfWriter.getInstance(doc, fOut);
//open the document
doc.open();
Paragraph p1 = new Paragraph(text);
Font paraFont= new Font(Font.COURIER);
p1.setAlignment(Paragraph.ALIGN_CENTER);
p1.setFont(paraFont);
//add paragraph to document
doc.add(p1);
} catch (DocumentException de) {
Log.e("PDFCreator", "DocumentException:" + de);
} catch (IOException e) {
Log.e("PDFCreator", "ioException:" + e);
}
finally {
doc.close();
}
viewPdf("newFile.pdf", "Dir");
}
// Method for opening a pdf file
private void viewPdf(String file, String directory) {
File pdfFile = new File(Environment.getExternalStorageDirectory() + "/" + directory + "/" + file);
Uri path = Uri.fromFile(pdfFile);
// Setting the intent for pdf reader
Intent pdfIntent = new Intent(Intent.ACTION_VIEW);
pdfIntent.setDataAndType(path, "application/pdf");
pdfIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
try {
startActivity(pdfIntent);
} catch (ActivityNotFoundException e) {
Toast.makeText(TableActivity.this, "Can't read pdf file", Toast.LENGTH_SHORT).show();
}
}
PdfDocument class enables generating a PDF document from native Android content. By using this class we can create pdf and also open it by using PdfRenderer. Sample code for creating a pdf file
public void stringtopdf(String data) {
String extstoragedir = Environment.getExternalStorageDirectory().toString();
File fol = new File(extstoragedir, "pdf");
File folder=new File(fol,"pdf");
if(!folder.exists()) {
boolean bool = folder.mkdir();
}
try {
final File file = new File(folder, "sample.pdf");
file.createNewFile();
FileOutputStream fOut = new FileOutputStream(file);
PdfDocument document = new PdfDocument();
PdfDocument.PageInfo pageInfo = new
PdfDocument.PageInfo.Builder(100, 100, 1).create();
PdfDocument.Page page = document.startPage(pageInfo);
Canvas canvas = page.getCanvas();
Paint paint = new Paint();
canvas.drawText(data, 10, 10, paint);
document.finishPage(page);
document.writeTo(fOut);
document.close();
}catch (IOException e){
Log.i("error",e.getLocalizedMessage());
}
Download source code from here (Create pdf file in android programmatically)
activity_main.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff"
android:orientation="vertical">
<Button
android:id="@+id/btn_generate"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Generate PDF" />
<LinearLayout
android:layout_width="match_parent"
android:orientation="vertical"
android:id="@+id/ll_pdflayout"
android:background="#ffffff"
android:layout_height="match_parent">
<ImageView
android:id="@+id/iv_image"
android:src="@drawable/image"
android:layout_width="300dp"
android:scaleType="fitXY"
android:layout_marginTop="10dp"
android:layout_gravity="center"
android:layout_height="250dp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="14dp"
android:text="Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum."
android:layout_marginTop="10dp"
android:gravity="center"
android:paddingLeft="10dp"
android:paddingRight="10dp"
android:textColor="#000000"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tv_link"
android:textSize="10dp"
android:textColor="#000000"/>
</LinearLayout>
</LinearLayout>
MainActivity.java
package com.deepshikha.generatepdf;
import android.Manifest;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.pdf.PdfDocument;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Display;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
Button btn_generate;
TextView tv_link;
ImageView iv_image;
LinearLayout ll_pdflayout;
public static int REQUEST_PERMISSIONS = 1;
boolean boolean_permission;
boolean boolean_save;
Bitmap bitmap;
ProgressDialog progressDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
fn_permission();
listener();
}
private void init(){
btn_generate = (Button)findViewById(R.id.btn_generate);
tv_link = (TextView)findViewById(R.id.tv_link);
iv_image = (ImageView) findViewById(R.id.iv_image);
ll_pdflayout = (LinearLayout) findViewById(R.id.ll_pdflayout);
}
private void listener(){
btn_generate.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_generate:
if (boolean_save) {
Intent intent = new Intent(getApplicationContext(), PDFViewActivity.class);
startActivity(intent);
} else {
if (boolean_permission) {
progressDialog = new ProgressDialog(MainActivity.this);
progressDialog.setMessage("Please wait");
bitmap = loadBitmapFromView(ll_pdflayout, ll_pdflayout.getWidth(), ll_pdflayout.getHeight());
createPdf();
// saveBitmap(bitmap);
} else {
}
createPdf();
break;
}
}
}
private void createPdf(){
WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
DisplayMetrics displaymetrics = new DisplayMetrics();
this.getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
float hight = displaymetrics.heightPixels ;
float width = displaymetrics.widthPixels ;
int convertHighet = (int) hight, convertWidth = (int) width;
// Resources mResources = getResources();
// Bitmap bitmap = BitmapFactory.decodeResource(mResources, R.drawable.screenshot);
PdfDocument document = new PdfDocument();
PdfDocument.PageInfo pageInfo = new PdfDocument.PageInfo.Builder(convertWidth, convertHighet, 1).create();
PdfDocument.Page page = document.startPage(pageInfo);
Canvas canvas = page.getCanvas();
Paint paint = new Paint();
canvas.drawPaint(paint);
bitmap = Bitmap.createScaledBitmap(bitmap, convertWidth, convertHighet, true);
paint.setColor(Color.BLUE);
canvas.drawBitmap(bitmap, 0, 0 , null);
document.finishPage(page);
String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString() + "/PdfTett/";
File dir = new File(path);
if (!dir.exists())
dir.mkdirs();
File filePath = new File(dir,"Testtt.pdf");
try {
document.writeTo(new FileOutputStream(filePath));
btn_generate.setText("Check PDF");
boolean_save=true;
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(this, "Something wrong: " + e.toString(), Toast.LENGTH_LONG).show();
}
// close the document
document.close();
}
public static Bitmap loadBitmapFromView(View v, int width, int height) {
Bitmap b = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
v.draw(c);
return b;
}
private void fn_permission() {
if ((ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)||
(ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)) {
if ((ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, android.Manifest.permission.READ_EXTERNAL_STORAGE))) {
} else {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE},
REQUEST_PERMISSIONS);
}
if ((ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE))) {
} else {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUEST_PERMISSIONS);
}
} else {
boolean_permission = true;
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_PERMISSIONS) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
boolean_permission = true;
} else {
Toast.makeText(getApplicationContext(), "Please allow the permission", Toast.LENGTH_LONG).show();
}
}
}
}
Thanks!
You May use bellow like.
pdf will like bellow..
-
activity_main.xml
<Button
android:id="@+id/btnCreatePdf"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Create PDF" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:gravity="center"
android:orientation="vertical">
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:singleLine="true"
android:text="Thank You!"
android:textAppearance="@style/Base.TextAppearance.AppCompat.Medium"
android:textSize="20sp"
android:textStyle="bold" />
<TextView
android:id="@+id/tv_sub_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:singleLine="true"
android:text="Your transaction is successful"
android:textAppearance="@style/Base.TextAppearance.AppCompat.Small"
android:textSize="16sp" />
</LinearLayout>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#e6e6e6" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:orientation="vertical"
android:padding="10dp">
<TextView
android:id="@+id/tv_location"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Location" />
<TextView
android:id="@+id/tv_city"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="5dp"
android:text="Dhaka"
android:textStyle="bold" />
</LinearLayout>
-
MainActivity:
public class MainActivity extends AppCompatActivity { Button btnCreatePdf; TextView tv_title; TextView tv_sub_title; TextView tv_location; TextView tv_city; String file_name_path = ""; int PERMISSION_ALL = 1; String[] PERMISSIONS = { android.Manifest.permission.WRITE_EXTERNAL_STORAGE, android.Manifest.permission.READ_EXTERNAL_STORAGE, }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder(); StrictMode.setVmPolicy(builder.build()); if (!hasPermissions(MainActivity.this, PERMISSIONS)) { ActivityCompat.requestPermissions(MainActivity.this, PERMISSIONS, PERMISSION_ALL); } File file = new File(this.getExternalFilesDir(null).getAbsolutePath(), "pdfsdcard_location"); if (!file.exists()) { file.mkdir(); } btnCreatePdf = findViewById(R.id.btnCreatePdf); tv_title = findViewById(R.id.tv_title); tv_sub_title = findViewById(R.id.tv_sub_title); tv_location = findViewById(R.id.tv_location); tv_city = findViewById(R.id.tv_city); btnCreatePdf.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { createpdf(); } }); } public void createpdf() { Rect bounds = new Rect(); int pageWidth = 300; int pageheight = 470; int pathHeight = 2; final String fileName = "mypdf"; file_name_path = "/pdfsdcard_location/" + fileName + ".pdf"; PdfDocument myPdfDocument = new PdfDocument(); Paint paint = new Paint(); Paint paint2 = new Paint(); Path path = new Path(); PdfDocument.PageInfo myPageInfo = new PdfDocument.PageInfo.Builder(pageWidth, pageheight, 1).create(); PdfDocument.Page documentPage = myPdfDocument.startPage(myPageInfo); Canvas canvas = documentPage.getCanvas(); int y = 25; // x = 10, int x = 10; paint.getTextBounds(tv_title.getText().toString(), 0, tv_title.getText().toString().length(), bounds); x = (canvas.getWidth() / 2) - (bounds.width() / 2); canvas.drawText(tv_title.getText().toString(), x, y, paint); paint.getTextBounds(tv_sub_title.getText().toString(), 0, tv_sub_title.getText().toString().length(), bounds); x = (canvas.getWidth() / 2) - (bounds.width() / 2); y += paint.descent() - paint.ascent(); canvas.drawText(tv_sub_title.getText().toString(), x, y, paint); y += paint.descent() - paint.ascent(); canvas.drawText("", x, y, paint); //horizontal line path.lineTo(pageWidth, pathHeight); paint2.setColor(Color.GRAY); paint2.setStyle(Paint.Style.STROKE); path.moveTo(x, y); canvas.drawLine(0, y, pageWidth, y, paint2); //blank space y += paint.descent() - paint.ascent(); canvas.drawText("", x, y, paint); y += paint.descent() - paint.ascent(); x = 10; canvas.drawText(tv_location.getText().toString(), x, y, paint); y += paint.descent() - paint.ascent(); x = 10; canvas.drawText(tv_city.getText().toString(), x, y, paint); //blank space y += paint.descent() - paint.ascent(); canvas.drawText("", x, y, paint); //horizontal line path.lineTo(pageWidth, pathHeight); paint2.setColor(Color.GRAY); paint2.setStyle(Paint.Style.STROKE); path.moveTo(x, y); canvas.drawLine(0, y, pageWidth, y, paint2); //blank space y += paint.descent() - paint.ascent(); canvas.drawText("", x, y, paint); Resources res = getResources(); Bitmap bitmap = BitmapFactory.decodeResource(res, R.drawable.logo); Bitmap b = (Bitmap.createScaledBitmap(bitmap, 100, 50, false)); canvas.drawBitmap(b, x, y, paint); y += 25; canvas.drawText(getString(R.string.app_name), 120, y, paint); myPdfDocument.finishPage(documentPage); File file = new File(this.getExternalFilesDir(null).getAbsolutePath() + file_name_path); try { myPdfDocument.writeTo(new FileOutputStream(file)); } catch (IOException e) { e.printStackTrace(); } myPdfDocument.close(); viewPdfFile(); } public void viewPdfFile() { File file = new File(this.getExternalFilesDir(null).getAbsolutePath() + file_name_path); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(file), "application/pdf"); startActivity(intent); } public static boolean hasPermissions(Context context, String... permissions) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context != null && permissions != null) { for (String permission : permissions) { if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) { return false; } } } return true; } }
-
Don't forget to add bellow permission in manifest file
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
-
Full source Download from GitHub : https://github.com/enamul95/CreatePdf.git