حسام رسولیان

آموزش ساخت فایل PDF در اندروید با زبان جاوا

ساخت PDF

به احتمال زیاد با اپلیکیشن های مختلفی کار کرده اید که به شما این امکان را میدهند تا یک سری از اطلاعات را در قالب فایل PDF ذخیره کنید. برای مثال متنی نوشته اید در یک برنامه نوت یا فاکتوری ایجاد کرده اید که قصد دارید بصورت PDF هم آن را داشته باشید. مثال های مختلفی برای این نوع از اپلیکیشن ها وجود دارد. در این پست به آموزش ساخت و ذخیره یک فایل PDF با اطلاعات داخلی اپلیکیشن در اندروید به کمک زبان برنامه نویسی جاوا میپردازیم.

ابزار اصلی مورد استفاده در این روش Canvas میباشد که برای ساخت طراحی های دو بعدی از آن در برنامه نویسی اندروید استفاده میشود.

مرحله اول ساخت PDF

در ابتدا نیاز است که یک پروژه جدید اندرویدی ایجاد کنید. بعد از اینکه پروژه مورد نظر کامل ساخته شد نوبت به طراحی رابط کاربری میرسد. به منظور اینکار در فایل activity_main.xml طراحی زیر را انجام میدهیم.

<RelativeLayout
    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"
    tools:context=".MainActivity">
 
    <!--Button for generating the PDF file-->
    <Button
        android:id="@+id/idBtnGeneratePDF"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="Generate PDF" />
     
</RelativeLayout>

به شکل کاملا ساده فقط یک دکمه در مرکز صفحه قرار میدهیم که کاربر با کلیک کردن برروی آن فایل PDF ایجاد شده را ذخیره میکند.

در مرحله سوم سطح دسترسی هایی که اپلیکیشن اندروید به آن نیاز دارد را داخل فایل Manifest قرار میدهیم. به دلیل اینکه قصد داریم فایل نهایی را در گوشی ذخیره کنیم به دسترسی خواندن و نوشتن حافظه نیاز خواهیم داشت.

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

در این قسمت نوبت به بخش برنامه نویسی آموزش میرسد. به همین منظور وارد فایل MainActivity.java شوید و قدم به قدم مراحل زیر را انجام دهید.

public class MainActivity extends AppCompatActivity {
 
    // variables for our buttons.
    Button generatePDFbtn;
     
    // declaring width and height
    // for our PDF file.
    int pageHeight = 1120;
    int pagewidth = 792;
     
    // creating a bitmap variable
    // for storing our images
    Bitmap bmp, scaledbmp;
     
    // constant code for runtime permissions
    private static final int PERMISSION_REQUEST_CODE = 200;
     
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         
        // initializing our variables.
        generatePDFbtn = findViewById(R.id.idBtnGeneratePDF);
        bmp = BitmapFactory.decodeResource(getResources(), R.drawable.gfgimage);
        scaledbmp = Bitmap.createScaledBitmap(bmp, 140, 140, false);
 
        // below code is used for
          // checking our permissions.
        if (checkPermission()) {
            Toast.makeText(this, "Permission Granted", Toast.LENGTH_SHORT).show();
        } else {
            requestPermission();
        }
 
        generatePDFbtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // calling method to
                  // generate our PDF file.
                generatePDF();
            }
        });
    }
 
    private void generatePDF() {
        // creating an object variable
        // for our PDF document.
        PdfDocument pdfDocument = new PdfDocument();
         
        // two variables for paint "paint" is used
        // for drawing shapes and we will use "title"
        // for adding text in our PDF file.
        Paint paint = new Paint();
        Paint title = new Paint();
         
        // we are adding page info to our PDF file
        // in which we will be passing our pageWidth,
        // pageHeight and number of pages and after that
        // we are calling it to create our PDF.
        PdfDocument.PageInfo mypageInfo = new PdfDocument.PageInfo.Builder(pagewidth, pageHeight, 1).create();
         
        // below line is used for setting
        // start page for our PDF file.
        PdfDocument.Page myPage = pdfDocument.startPage(mypageInfo);
         
        // creating a variable for canvas
        // from our page of PDF.
        Canvas canvas = myPage.getCanvas();
         
        // below line is used to draw our image on our PDF file.
        // the first parameter of our drawbitmap method is
        // our bitmap
        // second parameter is position from left
        // third parameter is position from top and last
        // one is our variable for paint.
        canvas.drawBitmap(scaledbmp, 56, 40, paint);
 
        // below line is used for adding typeface for
        // our text which we will be adding in our PDF file.
        title.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.NORMAL));
         
        // below line is used for setting text size
        // which we will be displaying in our PDF file.
        title.setTextSize(15);
         
        // below line is sued for setting color
        // of our text inside our PDF file.
        title.setColor(ContextCompat.getColor(this, R.color.purple_200));
         
        // below line is used to draw text in our PDF file.
        // the first parameter is our text, second parameter
        // is position from start, third parameter is position from top
        // and then we are passing our variable of paint which is title.
        canvas.drawText("A portal for IT professionals.", 209, 100, title);
        canvas.drawText("Geeks for Geeks", 209, 80, title);
 
        // similarly we are creating another text and in this
        // we are aligning this text to center of our PDF file.
        title.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL));
        title.setColor(ContextCompat.getColor(this, R.color.purple_200));
        title.setTextSize(15);
         
        // below line is used for setting
        // our text to center of PDF.
        title.setTextAlign(Paint.Align.CENTER);
        canvas.drawText("This is sample document which we have created.", 396, 560, title);
 
        // after adding all attributes to our
        // PDF file we will be finishing our page.
        pdfDocument.finishPage(myPage);
         
        // below line is used to set the name of
        // our PDF file and its path.
        File file = new File(Environment.getExternalStorageDirectory(), "GFG.pdf");
 
        try {
            // after creating a file name we will
            // write our PDF file to that location.
            pdfDocument.writeTo(new FileOutputStream(file));
             
            // below line is to print toast message
            // on completion of PDF generation.
            Toast.makeText(MainActivity.this, "PDF file generated successfully.", Toast.LENGTH_SHORT).show();
        } catch (IOException e) {
            // below line is used
            // to handle error
            e.printStackTrace();
        }
        // after storing our pdf to that
        // location we are closing our PDF file.
        pdfDocument.close();
    }
 
    private boolean checkPermission() {
        // checking of permissions.
        int permission1 = ContextCompat.checkSelfPermission(getApplicationContext(), WRITE_EXTERNAL_STORAGE);
        int permission2 = ContextCompat.checkSelfPermission(getApplicationContext(), READ_EXTERNAL_STORAGE);
        return permission1 == PackageManager.PERMISSION_GRANTED && permission2 == PackageManager.PERMISSION_GRANTED;
    }
 
    private void requestPermission() {
        // requesting permissions if not provided.
        ActivityCompat.requestPermissions(this, new String[]{WRITE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE}, PERMISSION_REQUEST_CODE);
    }
 
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == PERMISSION_REQUEST_CODE) {
            if (grantResults.length > 0) {
                 
                // after requesting permissions we are showing
                // users a toast message of permission granted.
                boolean writeStorage = grantResults[0] == PackageManager.PERMISSION_GRANTED;
                boolean readStorage = grantResults[1] == PackageManager.PERMISSION_GRANTED;
 
                if (writeStorage && readStorage) {
                    Toast.makeText(this, "Permission Granted..", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(this, "Permission Denined.", Toast.LENGTH_SHORT).show();
                    finish();
                }
            }
        }
    }
}

ابتدا با استفاده از دو متغیر pageHeight و pagewidth اندازه صفحه را مشخص میکنیم.

دو متغیر از نوع Bitmap هم برای ذخیره کردن تصویر تعریف میکنیم.

با کلیک کردن روی دکمه برنامه بررسی میکند آیا سطح دسترسی مورد نظر را در اختیار دارد یا خیر, در صورتی که دسترسی ایجاد شده باشد متد generatePDF() فراخوانی میشود.

در این متد یک شی از کلاس PdfDocument و دو شی هم از کلاس Paint میسازیم.

با کمک متد Builder ابتدا فایل PDF را بر اساس اندازه های تعریف شده ایجاد میکنیم.

در ادامه با استفاده از شی canvas تصویر مورد نظر را در فایل PDF قرار میدهیم.

با متد drawText میتوانیم هر متنی که نیاز داریم را روی صفحات canvas بنویسیم که در اینجا اطلاعاتی که میخواهیم ذخیره شود را با استفاده از همین متد قرار میدهیم.

در انتها متد finishPage پایان صفحه PDF را اعلام میکند و با استفاده از دستور pdfDocument.writeTo فایل را داخل حافظه گوشی ذخیره میکنیم.

پیش نمایش برنامه به شکل زیر خواهد بود:

آموزش برنامه نویسی اندروید

نظر دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

*

code