Flutter: aplicación sencilla de generación de PDF

Flutter Community ha creado varios paquetes para trabajar con archivos PDF en nuestras aplicaciones. En este artículo, crearemos una aplicación simple de generación de PDF. Esta aplicación convertirá un texto sin formato a PDF. Los paquetes que vamos a necesitar se enumeran a continuación con sus usos:

  • pdf: es una biblioteca de creación de PDF para flutter. Puede crear un documento completo de varias páginas con imágenes, tablas, diferentes fuentes, etc.
  • flutter_full_pdf_viewer: Se utiliza para obtener una vista previa del PDF.
  • path_provider: se utiliza para encontrar ubicaciones de uso común en el sistema de archivos.

Ahora vamos a hacer un poco de codificación.

Primero, tenemos que instalar los paquetes necesarios en la sección de dependencias del archivo pubspec.yaml como se muestra a continuación:

pubspec.yaml ss

1. Página de pantalla de vista previa de PDF:

Ahora que los paquetes están instalados primero, vamos a crear una pantalla de vista previa de PDF como un nuevo archivo dart ( pdf_preview_screen.dart ) con la ruta dada como se muestra a continuación:

Dart

import 'package:flutter/material.dart';
import 'package:flutter_full_pdf_viewer/flutter_full_pdf_viewer.dart';
  
class PdfPreviewScreen extends StatelessWidget {
  final String path;
  
  PdfPreviewScreen({this.path});
  
  @override
  Widget build(BuildContext context) {
    return PDFViewerScaffold(
      path: path,
    );
  }
}

En esta página hemos creado PDFPreviewScreen como StatelessWidget con la ruta del archivo PDF como parámetro.

2. Página principal:

Hemos importado los paquetes necesarios para crear el diseño deseado. Aquí hemos importado ‘ paquete:pdf/widgets.dart ‘ como pw porque el paquete de material ya tiene una clase de widget.

Dart

import 'dart:io';
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'package:pdf/pdf.dart';
import 'package:pdf/widgets.dart' as pw;
import 'package:pdf_demo/pdf_preview_screen.dart';

Esta es la función principal que se llama cuando se inicia la aplicación:

Dart

void main() {
  runApp(MyApp());
}
  
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'PDF Demo',
      theme: ThemeData(
        primarySwatch: Colors.grey,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: MyHomePage(),
    );
  }
}

El paquete de widgets de pdf tiene diferentes tipos de widgets para crear el diseño deseado. MyHomePage() es un StatelessWidget que contiene el código para la creación de PDF. Ahora vamos a agregar contenido a la aplicación. Crearemos una función writeOnPdf() para este propósito:

Dart

class MyHomePage extends StatelessWidget {
  final pdf = pw.Document();
  
  writeOnPdf() {
    pdf.addPage(pw.MultiPage(
      pageFormat: PdfPageFormat.a4,
      margin: pw.EdgeInsets.all(32),
      build: (pw.Context context) {
        return <pw.Widget>[
          pw.Header(
              level: 0,
              child: pw.Row(
                  mainAxisAlignment: pw.MainAxisAlignment.spaceBetween,
                  children: <pw.Widget>[
                    pw.Text('Geeksforgeeks', textScaleFactor: 2),
                  ])),
          pw.Header(level: 1, text: 'What is Lorem Ipsum?'),
            
          // Write All the paragraph in one line. 
          // For clear understanding
          // here there are line breaks.
          pw.Paragraph(
              text:
                  'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
                  tempor incididunt ut labore et dolore magna aliqua. Nunc mi ipsum faucibus
                  vitae aliquet nec. Nibh cras pulvinar mattis nunc sed blandit libero
                  volutpat. Vitae elementum curabitur vitae nunc sed velit. Nibh tellus
                  molestie nunc non blandit massa. Bibendum enim facilisis gravida neque.
                  Arcu cursus euismod quis viverra nibh cras pulvinar mattis. Enim diam
                  vulputate ut pharetra sit. Tellus pellentesque eu tincidunt tortor
                  aliquam nulla facilisi cras fermentum. '),
          pw.Paragraph(
              text:
                  'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
                  tempor incididunt ut labore et dolore magna aliqua. Nunc mi ipsum faucibus
                  vitae aliquet nec. Nibh cras pulvinar mattis nunc sed blandit libero
                  volutpat Vitae elementum curabitur vitae nunc sed velit. Nibh tellus
                  molestie nunc non blandit massa. Bibendum enim facilisis gravida neque.
                  Arcu cursus euismod quis viverra nibh cras pulvinar mattis. Enim diam
                  vulputate ut pharetra sit. Tellus pellentesque eu tincidunt tortor
                  aliquam nulla facilisi cras fermentum. '),
          pw.Header(level: 1, text: 'This is Header'),
          pw.Paragraph(
              text:
                  'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
                  tempor incididunt ut labore et dolore magna aliqua. Nunc mi ipsum faucibus
                  vitae aliquet nec. Nibh cras pulvinar mattis nunc sed blandit libero
                  volutpat. Vitae elementum curabitur vitae nunc sed velit. Nibh tellus
                  molestie nunc non blandit massa. Bibendum enim facilisis gravida neque.
                  Arcu cursus euismod quis viverra nibh cras pulvinar mattis. Enim diam
                  vulputate ut pharetra sit. Tellus pellentesque eu tincidunt tortor aliquam
                  nulla facilisi cras fermentum. Consectetur adipiscing elit duis tristique
                  sollicitudin nibh sit. '),
          pw.Paragraph(
              text:
                  'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
                  tempor incididunt ut labore et dolore magna aliqua. Nunc mi ipsum faucibus
                  vitae aliquet nec. Nibh cras pulvinar mattis nunc sed blandit libero
                  volutpat. Vitae elementum curabitur vitae nunc sed velit. Nibh tellus
                  molestie nunc non blandit massa. Bibendum enim facilisis gravida neque.
                  Arcu cursus euismod quis viverra nibh cras pulvinar mattis. Enim diam
                  vulputate ut pharetra sit. Tellus pellentesque eu tincidunt tortor aliquam
                  nulla facilisi cras fermentum. Consectetur adipiscing elit duis tristique
                  sollicitudin nibh sit. '),
          pw.Padding(padding: const pw.EdgeInsets.all(10)),
          pw.Table.fromTextArray(context: context, data: const <List<String>>[
            <String>['Year', 'Sample'],
            <String>['SN0', 'GFG1'],
            <String>['SN1', 'GFG2'],
            <String>['SN2', 'GFG3'],
            <String>['SN3', 'GFG4'],
          ]),
        ];
      },
    ));
  }

Los widgets disponibles en este paquete no son los mismos que los disponibles en el paquete de material. Se utilizan para estructurar el diseño del documento. Aquí hemos creado el documento con algunos encabezados, párrafos y tablas para mostrar cómo se puede crear la estructuración básica.

Dart

Future savePdf() async {
    Directory documentDirectory = await getApplicationDocumentsDirectory();
    String documentPath = documentDirectory.path;
    File file = File("$documentPath/example.pdf");
    file.writeAsBytesSync(pdf.save());
  }

La función savePdf() se usa para guardar el PDF que luego se usa para obtener una vista previa del documento desde la ruta provista. Después de escribir las líneas de código anteriores, tenemos que volver a ejecutar la aplicación.

El código anterior es para la pantalla que obtendremos después de ejecutar la aplicación. Contiene una barra de aplicaciones junto con un botón elevado que se usa para generar y obtener una vista previa del PDF que hemos creado escribiendo la línea de código anterior. Pasamos una función asíncrona al parámetro onPressed del botón, ya que se necesita la ubicación del archivo, lo que devuelve un futuro como ya almacenado al guardar el archivo. Este es también el final de la clase MyHomePage .

Dart

Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Geeksforgeeks"),
      ),
      body: Container(
        padding: EdgeInsets.all(10),
        child: Column(
          children: <Widget>[
            SizedBox(
              width: double.infinity,
              child: RaisedButton(
                color: Colors.blueGrey,
                child: Text(
                  'Preview PDF',
                  style: TextStyle(
                      fontWeight: FontWeight.bold,
                      fontSize: 18,
                      color: Colors.white),
                ),
                onPressed: () async {
                  writeOnPdf();
                  await savePdf();
  
                  Directory documentDirectory =
                      await getApplicationDocumentsDirectory();
  
                  String documentPath = documentDirectory.path;
  
                  String fullPath = "$documentPath/example.pdf";
                  print(fullPath);
  
                  Navigator.push(
                      context,
                      MaterialPageRoute(
                          builder: (context) => PdfPreviewScreen(
                                path: fullPath,
                              )));
                },
              ),
            ),
          ],
        ),
      ),
    );
  }
}

Producción:

Publicación traducida automáticamente

Artículo escrito por muazzamfaraaz y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *