Как создать PDF-файл в приложении для Android?

Опубликовано: 30 Ноября, 2021

Существует множество приложений, в которых данные из приложения предоставляются пользователям в формате загружаемого файла PDF. Итак, в этом случае мы должны создать PDF-файл из данных, имеющихся в нашем приложении, и правильно представить эти данные внутри нашего приложения. Таким образом, используя эту технику, мы можем легко создать новый PDF-файл в соответствии с нашими требованиями. В этой статье мы рассмотрим создание нового PDF-файла из данных, имеющихся в вашем приложении для Android, и сохранение этого PDF-файла во внешнем хранилище пользовательского устройства. Итак, для создания нового PDF-файла из данных, имеющихся в нашем приложении для Android, мы будем использовать Canvas. Canvas - это предопределенный класс в Android, который используется для создания 2D-чертежей различных объектов на нашем экране. Итак, в этой статье мы будем использовать холст для рисования данных внутри холста, а затем сохраним этот холст в виде PDF-файла. Теперь перейдем к реализации нашего проекта.

Пример создания файла PDF

Ниже приведен образец GIF, в котором мы узнаем, что мы собираемся построить в этой статье. Обратите внимание, что это приложение создано с использованием языка Java. В этом проекте мы собираемся отобразить простую кнопку. После нажатия кнопки будет сгенерирован наш PDF-файл, и мы сможем увидеть этот PDF-файл, сохраненный в наших файлах.

Пошаговая реализация

Шаг 1. Создайте новый проект

Чтобы создать новый проект в Android Studio, обратитесь к разделу «Как создать / запустить новый проект в Android Studio». Обратите внимание, что выберите Java в качестве языка программирования.

Шаг 2. Работа с файлом activity_main.xml

Перейдите в файл activity_main.xml и обратитесь к следующему коду. Ниже приведен код файла activity_main.xml.

XML

<? xml version = "1.0" encoding = "utf-8" ?>
< RelativeLayout
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 >

Шаг 3. Добавьте разрешение на чтение и запись во внешнем хранилище.

Перейдите в приложение> файл AndroifManifest.xml и добавьте к нему следующие разрешения.

XML

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

Шаг 4: Работа с файлом MainActivity.java

Перейдите в файл MainActivity.java и ознакомьтесь со следующим кодом. Ниже приведен код файла MainActivity.java. Комментарии добавляются внутри кода для более подробного понимания кода.

Ява

import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.graphics.pdf.PdfDocument;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import static android.Manifest.permission.READ_EXTERNAL_STORAGE;
import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE;
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 succesfully." , "PDF file generated succesfully." , 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 @NonNull requestCode, 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();
}
}
}
}
}

Выход:

Хотите более динамичную и конкурентную среду для изучения основ Android?
Щелкните здесь, чтобы перейти к уникальному руководству, составленному нашими экспертами с целью мгновенно подготовить вашу отрасль!