Създаването на PDF файл за запазване на фактура, писмо, автобиография и т.н. сега е едно от най-важните неща в света на програмирането.

Например :
Създавате система и едно от изискванията е да създадете pdf, който ще може да се отпечатва и ще съдържа информация, свързана с една сметка, ако сметката е на английски, това е лесна задача тъй като пакетът pdf поддържа английски език, но ако искате да създадете сметка на арабски, как трябва да направите това?

Да го направим заедно !!

Първо се нуждаете от тези три пакета

dependencies:
  flutter:
    sdk: flutter
pdf: ^1.11.0
path_provider: ^1.6.14
printing: ^3.6.0

Не забравяйте да ги потърсите в pub.dev и да получите най-новата версия

Първият пакет pdf ще се погрижи за конвертирането на dart код (flutter) в pdf
Вторият path_provider ще отговаря за получаването на текущия път на приложението
Третият пакет printing е отговорен за процеса на печат

Първо нека създадем бутон за отпечатване на сметката

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';

class PrintBillInArabic extends StatelessWidget{
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Center(
          child: Text('Arabic Bill Printing'),
        ),
      ),
      body: Container(
        child: RaisedButton(
          shape: RoundedRectangleBorder(
              borderRadius: BorderRadius.circular(10)),
          onPressed: (){
            return generateAndPrintArabicPdf(context);
          },
          color: Color(0xffff9900),
          child: Text(
            'Print Arabic Bill',
            style: TextStyle(color: Colors.white),
          ),
        ),
      ),
    );
  }
}

Сега нека създадем метод generateAndPrintArabicPdf, който ще се погрижи за генерирането на pdf от flutter код и ще пренасочи потребителя към действие за печат

Забележете, че ако искате да създадете метода в същия файл, трябва да го импортирате по този начин

импортиране на „package:pdf/widgets.dart“ като pw;

Ако го импортирате като реда по-долу, той ще влезе в конфликт с приспособленията Material.dart и ще покаже грешки

import ‘package:pdf/widgets.dart’;

Но ако го поставите в друг файл, всичко е наред, така че ще използваме втората опция, за да запазим основния файл прост

Сега, за да използвате арабски език, трябва да изтеглите този файл и да го поставите в тази папка

активи/шрифтове/

и след това го импортирайте в pubsec.yaml по този начин

flutter:
uses-material-design: true
активи:
— активи/шрифтове/

и преименувайте файла с шрифтове на HacenTunisia.ttf

Вече сме готови, нека изградим нашия метод!

import 'dart:io';

import 'package:flutter/services.dart';
import 'package:path_provider/path_provider.dart';
import 'package:pdf/pdf.dart';
import 'package:pdf/widgets.dart';
import 'package:printing/printing.dart';

Future<void> generateAndPrintArabicPdf() async {
final Document pdf = Document();

var arabicFont = Font.ttf(await rootBundle.load("assets/fonts/HacenTunisia.ttf"));
pdf.addPage(Page(
  theme: ThemeData.withFont(
    base: arabicFont,
  ),
  pageFormat: PdfPageFormat.roll80,
  build: (Context context) {
    return Center(
        child: Column(
            children: [
              Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    Directionality(
                        textDirection: TextDirection.rtl,
                        child: Center(
                            child: Text(
                                '  الفرع الأول ', style: TextStyle(
                              fontSize: 10,
                            ))
                        )
                    ),
                    Directionality(
                        textDirection: TextDirection.rtl,
                        child: Center(
                            child: Text('الفرع : ', style: TextStyle(
                              fontSize: 10,
                            ))
                        )
                    ),
                  ]
              ),
              Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    Directionality(
                        textDirection: TextDirection.rtl,
                        child: Center(
                            child: Text(
                                '  01231324234  ', style: TextStyle(
                              fontSize: 10,
                            ))
                        )
                    ),
                    Directionality(
                        textDirection: TextDirection.rtl,
                        child: Center(
                            child: Text('الرقم الضريبي : ', style: TextStyle(
                              fontSize: 10,
                            ))
                        )
                    ),
                  ]
              ),
              Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    Directionality(
                        textDirection: TextDirection.rtl,
                        child: Center(
                            child: Text(
                                '  حي الخليج - الرياض ', style: TextStyle(
                              fontSize: 10,
                            ))
                        )
                    ),
                    Directionality(
                        textDirection: TextDirection.rtl,
                        child: Center(
                            child: Text('الموقع : ', style: TextStyle(
                              fontSize: 10,
                            ))
                        )
                    ),
                  ]
              ),

              Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    Directionality(
                        textDirection: TextDirection.rtl,
                        child: Center(
                            child: Text(
                                '  0123456789 ', style: TextStyle(
                              fontSize: 10,
                            ))
                        )
                    ),
                    Directionality(
                        textDirection: TextDirection.rtl,
                        child: Center(
                            child: Text('هاتف : ', style: TextStyle(
                              fontSize: 10,
                            ))
                        )
                    ),
                  ]
              ),
              Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    Directionality(
                        textDirection: TextDirection.rtl,
                        child: Center(
                            child: Text(
                                '  1  ', style: TextStyle(
                              fontSize: 10,
                            ))
                        )
                    ),
                    Directionality(
                        textDirection: TextDirection.rtl,
                        child: Center(
                            child: Text('رقم الفاتورة : ', style: TextStyle(
                              fontSize: 10,
                            ))
                        )
                    ),
                  ]
              ),
              Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    Directionality(
                        textDirection: TextDirection.rtl,
                        child: Center(
                            child: Text(
                                '  خالد  ', style: TextStyle(
                              fontSize: 10,
                            ))
                        )
                    ),
                    Directionality(
                        textDirection: TextDirection.rtl,
                        child: Center(
                            child: Text('اسم العميل : ', style: TextStyle(
                              fontSize: 10,
                            ))
                        )
                    ),
                  ]
              ),

              Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    Directionality(
                        textDirection: TextDirection.rtl,
                        child: Center(
                            child: Text(
                                '  0506040215 ', style: TextStyle(
                              fontSize: 10,
                            ))
                        )
                    ),
                    Directionality(
                        textDirection: TextDirection.rtl,
                        child: Center(
                            child: Text('رقم هاتف العميل : ', style: TextStyle(
                              fontSize: 10,
                            ))
                        )
                    ),
                  ]
              ),

              Directionality(
                  textDirection: TextDirection.rtl,
                  child: Text('المشتريات' , style: TextStyle(
                      fontSize: 10
                  ))
              ),
              Container(
                margin: EdgeInsets.fromLTRB(22, 5, 22, 5),
                child: Directionality(
                  textDirection: TextDirection.rtl,
                  child: Table.fromTextArray(
                      headerStyle: TextStyle(
                          fontSize: 6
                      ),
                      headers: <dynamic>['الإجمالي', 'العدد' ,'الخدمة', 'القطعة'],
                      cellAlignment: Alignment.center,
                      cellStyle: TextStyle(
                          fontSize: 5
                      ),
                      data:  <List<dynamic>>[
                        <dynamic>['50', '10' ,'كوي', 'قميص' ],
                      ],
                  ),
                ),
              ),
              Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    Directionality(
                        textDirection: TextDirection.rtl,
                        child: Center(
                            child: Text(
                                '  50  ', style: TextStyle(
                              fontSize: 10,
                            ))
                        )
                    ),
                    Directionality(
                        textDirection: TextDirection.rtl,
                        child: Center(
                            child: Text('المجموع الفرعي : ', style: TextStyle(
                              fontSize: 10,
                            ))
                        )
                    ),
                  ]
              ),
              Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    Directionality(
                        textDirection: TextDirection.rtl,
                        child: Center(
                            child: Text(
                                 '  -20  ',
                                style: TextStyle(
                                  fontSize: 10,
                                ))
                        )
                    ),
                    Directionality(
                        textDirection: TextDirection.rtl,
                        child: Center(
                            child: Text('خصم العميل : ', style: TextStyle(
                              fontSize: 10,
                            ))
                        )
                    ),
                  ]
              ),
                  Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    Directionality(
                        textDirection: TextDirection.rtl,
                        child: Center(
                            child: Text(
                                '  1  ', style: TextStyle(
                              fontSize: 10,
                            ))
                        )
                    ),
                    Directionality(
                        textDirection: TextDirection.rtl,
                        child: Center(
                            child: Text('خصم عددي : ', style: TextStyle(
                              fontSize: 10,
                            ))
                        )
                    ),
                  ]
              ),
              Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    Directionality(
                        textDirection: TextDirection.rtl,
                        child: Center(
                            child: Text(
                                '  29  ', style: TextStyle(
                              fontSize: 10,
                            ))
                        )
                    ),
                    Directionality(
                        textDirection: TextDirection.rtl,
                        child: Center(
                            child: Text('الإجمالي : ', style: TextStyle(
                              fontSize: 10,
                            ))
                        )
                    ),
                  ]
              ),
              Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    Directionality(
                        textDirection: TextDirection.rtl,
                        child: Center(
                            child: Text(
                                 '  مدفوعة  ',
                                style: TextStyle(
                                  fontSize: 10,
                                ))
                        )
                    ),
                    Directionality(
                        textDirection: TextDirection.rtl,
                        child: Center(
                            child: Text('حالة الفاتورة : ', style: TextStyle(
                              fontSize: 10,
                            ))
                        )
                    ),
                  ]
              ),
              Row(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: [
                    Directionality(
                        textDirection: TextDirection.rtl,
                        child: Center(
                            child: Text(
                                '  نقدا  ',
                                style: TextStyle(
                                  fontSize: 10,
                                ))
                        )
                    ),
                    Directionality(
                        textDirection: TextDirection.rtl,
                        child: Center(
                            child: Text('طريقة الدفع : ', style: TextStyle(
                              fontSize: 10,
                            ))
                        )
                    ),
                  ]
              ),
            ]
        )
    );
  }
));
final String dir = (await getApplicationDocumentsDirectory()).path;
final String path = '$dir/1.pdf';
final File file = File(path);
await file.writeAsBytes(pdf.save());
await Printing.layoutPdf(onLayout: (PdfPageFormat format) async => pdf.save());
}

Резултатът

Приятно кодиране на всички