Сохранение Linear layout в PDF Android Studio
Нужно сохранить Linear layout в PDF, при нажатии кнопки buttonSaveAsPDF ничего не происходит
public class ResultsManualSLP extends AppCompatActivity {
private LinearLayout pdf_layout;
private static final int REQUEST_PERMISSION = 1;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.results_manual_slp);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
Button buttonSaveAsPDF = findViewById(R.id.button_PDF);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
buttonSaveAsPDF.setVisibility(View.VISIBLE);
else buttonSaveAsPDF.setVisibility(View.INVISIBLE);
pdf_layout = findViewById(R.id.linearLayoutManSLP);
buttonSaveAsPDF.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
checkPermission();
}
});
}
private void checkPermission() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED
&& ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED) {
} else {
ActivityCompat.requestPermissions(this, new String[]{
Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE
}, REQUEST_PERMISSION);
}
}
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
switch (requestCode) {
case REQUEST_PERMISSION: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
generatePdf();
}
} else {
// в разрешении отказано (в первый раз, когда чекбокс "Больше не спрашивать" ещё не показывается)
if (ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.READ_EXTERNAL_STORAGE)) {
finish();
}
// в разрешении отказано (выбрано "Больше не спрашивать")
else {
// показываем диалог, сообщающий о важности разрешения
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(
"Вы отказались предоставлять разрешение на чтение хранилища.\n\nЭто необходимо для работы приложения."
+ "\n\n"
+ "Нажмите \"Предоставить\", чтобы предоставить приложению разрешения.")
// при согласии откроется окно настроек, в котором пользователю нужно будет вручную предоставить разрешения
.setPositiveButton("Предоставить", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
finish();
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
Uri.fromParts("package", getPackageName(), null));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
})
// закрываем приложение
.setNegativeButton("Отказаться", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
finish();
}
});
builder.setCancelable(false);
builder.create().show();
}
}
break;
}
}
}
@RequiresApi(api = Build.VERSION_CODES.O)
private void generatePdf() {
DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
float height = displaymetrics.heightPixels;
float width = displaymetrics.widthPixels;
int convertHeight = (int) height, convertWidth = (int) width;
// создаем документ
PdfDocument document = new PdfDocument();
// определяем размер страницы
PdfDocument.PageInfo pageInfo =
new PdfDocument.PageInfo.Builder(convertWidth, convertHeight, 1).create();
// получаем страницу, на котором будем генерировать контент
PdfDocument.Page page = document.startPage(pageInfo);
// получаем холст (Canvas) страницы
Canvas canvas = page.getCanvas();
Paint paint = new Paint();
canvas.drawPaint(paint);
// получаем контент, который нужно добавить в PDF, и загружаем его в Bitmap
Bitmap bitmap = loadBitmapFromView(pdf_layout, pdf_layout.getWidth(), pdf_layout.getHeight());
bitmap = Bitmap.createScaledBitmap(bitmap, convertWidth, convertHeight, true);
// рисуем содержимое и закрываем страницу
paint.setColor(Color.BLUE);
canvas.drawBitmap(bitmap, 0, 0, null);
document.finishPage(page);
File dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/PDF");
if (!dir.exists()) {
dir.mkdirs();
}
// сохраняем записанный контент
LocalTime current = LocalTime.now();
String targetPdf = dir.getAbsolutePath() + "/Отчет по параметрам сварки.pdf";
File filePath = new File(targetPdf);
try {
document.writeTo(new FileOutputStream(filePath));
Toast.makeText(getApplicationContext(), "PDf сохранён в " + filePath.getAbsolutePath(),
Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(this, "Что-то пошло не так: " + e.toString(), Toast.LENGTH_LONG).show();
}
// закрываем документ
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;
}
XML
<?xml version="1.0" encoding="utf-8"?>
<ScrollView 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:background="@color/white"
tools:context=".ResultsManualSLP">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="7dp"
android:layout_marginEnd="7dp"
android:orientation="vertical"
tools:ignore="RtlHardcoded">
<LinearLayout
android:id="@+id/linearLayoutManSLP"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:fontFamily="sans-serif-black"
android:gravity="center"
android:text="ПАРАМЕТРЫ СВАРКИ"
android:textColor="@color/black"
android:textSize="28sp" />
<TextView
android:id="@+id/mainTitle_man_slp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_marginBottom="20dp"
android:fontFamily="sans-serif-black"
android:gravity="center"
android:text="ПРИ ЕДИНСТВЕННОМ НИЗКОМ ДАВЛЕНИИ"
android:textColor="@color/black"
android:textSize="18sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_marginBottom="20dp"
android:layout_weight="1"
android:orientation="horizontal"
android:padding="5dp">
<TextView
android:id="@+id/text_t6_coolNotPress_man_slp"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="8"
android:gravity="start"
android:text="Минимальное время охлаждения вне машины"
android:textColor="@color/black"
android:textSize="18sp" />
<TextView
android:id="@+id/t6_coolNotPres_man_slp"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="4"
android:gravity="center"
android:textColor="@color/black"
android:textSize="18sp" />
</LinearLayout>
<TextView
android:id="@+id/titleRecommendation_man_slp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="РЕКОМЕНДАЦИИ"
android:textColor="@color/black"
android:textSize="20sp" />
<TextView
android:id="@+id/textRecommendation_man_slp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="start"
android:textColor="@color/black"
android:textSize="18sp" />
</LinearLayout>
<Button
android:id="@+id/button_PDF"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginTop="10dp"
android:text="Сохранить в PDF"
android:textColor="@color/black"
android:textSize="15sp" />
</LinearLayout>
</ScrollView>
В манифест внес
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
tools:ignore="ScopedStorage" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
В гредл
implementation 'com.itextpdf:itextg:5.5.10'