joseph-grabinger / flutter_to_pdf

Create PDFs but work with normal Flutter Widgets.
MIT License
21 stars 17 forks source link
dart flutter pdf-generation

codecov Pub

The FlutterToPDF package lets you export any Flutter widget to PDF Documents and is written natively in Dart.

Installing

Depend on it

Run this command:

$ flutter pub add flutter_to_pdf

This will add a line like this to your package's pubspec.yaml (and run an implicit flutter pub get):

dependencies:
  flutter_to_pdf: ^0.2.2

Alternatively, your editor might support flutter pub get. Check the docs for your editor to learn more.

Import it

Now in your Dart code, you can use:

import 'package:flutter_to_pdf/flutter_to_pdf.dart';

Features

Usage

Create an instance of the ExportDelegate, wrap your widget with a ExportFrame widget and provide a frameId, as well as the exportDelegate.

When you want to export the widget call the desired export function (either exportToPdfDocument, exportToPdfPage or exportToPdfWidget) and pass in the frameId.

// create instance of ExportDelegate
final ExportDelegate exportDelegate = ExportDelegate();

ExportFrame(
  frameId: 'someFrameId',
  child: SomeWidget(), // the widget you want to export
)

// export the frame to a PDF Document
final pdf = await exportDelegate.exportToPdfDocument('someFrameId');

// export the frame to a PDF Page
final page = await exportDelegate.exportToPdfPage('someFrameId');

// export the frame to a PDF Widget
final widget = await exportDelegate.exportToPdfWidget('someFrameId');

Note: If you wish to use types on the variables pdf, page and widget, you can use the Document, Page and Widget classes provided by PDF-package.

Custom TTF Fonts

If the widget you want to export contains any custom TTF fonts, you must provide the used ttfFonts to the ExportDelegate.

final ExportDelegate exportDelegate = ExportDelegate(
  ttfFonts: {
    'SomeFontFamily': 'assets/fonts/someFont.ttf',
  },
);

TextFields and Checkboxes

If the widget you want to export contains any TextField, TextFormField or Checkbox, a unique Key must be provided to each TextField, TextFormField and Checkbox.

TextField(
  key: Key('someUniqueTextFieldKey'),
  controller: TextEditingController(),
  ...
)

Checkbox(
  key: Key('someUniqueCheckboxKey'),
  value: false,
  ...
)

Other widgets like CustomPaint and Charts

If the widget you want to export contains any custom widgets like CustomPaint or Charts, the widgets you want to export must be wrapped in a CaptureWrapper widget. Furthermore, the CaptureWrapper must have a unique Key. These widgets will then be captured as an image and exported to the PDF Document.

CaptureWrapper(
  key: const Key('someUniqueCustomPaintKey'),
  child: CustomPaint(
    size: const Size(300, 300),
    painter: SomePainter(),
  ),
)

Export Options

The ExportDelegate´s constructor has a named optional parameter options which can be used to customize the export process.

final ExportOptions options = ExportOptions(
  pageFormatOptions: PageFormatOptions.a3(),
  textFieldOptions: TextFieldOptions.uniform(
    interactive: false,
  ),
  checkboxOptions: CheckboxOptions.uniform(
    interactive: false,
  ),
);

final ExportDelegate exportDelegate = ExportDelegate(options: options);

The ExportDelegate´s options can also be overriden using the named optional parameter overrideOptions in the export function.

final ExportOptions options = ExportOptions(
  pageFormatOptions: PageFormatOptions.a3(),
  textFieldOptions: TextFieldOptions.uniform(
    interactive: false,
  ),
  checkboxOptions: CheckboxOptions.uniform(
    interactive: false,
  ),
);

final ExportDelegate exportDelegate = ExportDelegate(options: options);

final ExportOptions overrideOptions = ExportOptions(
  pageFormatOptions: PageFormatOptions.a4(),
  textFieldOptions: TextFieldOptions.uniform(
    interactive: true,
  ),
  checkboxOptions: CheckboxOptions.uniform(
    interactive: true,
  ),
);

// export the frame to a PDF Document, using the override options
final pdf = await exportDelegate.exportToPdfDocument('someFrameId', overrideOptions: overrideOptions);

// export the frame to a PDF Page, using the override options
final page = await exportDelegate.exportToPdfPage('someFrameId', overrideOptions: overrideOptions);

// export the frame to a PDF Widget, using the override options
final widget = await exportDelegate.exportToPdfWidget('someFrameId', overrideOptions: overrideOptions);

Page Format Options

The PageFormatOptions class can be used to customize the page format of the exported PDF Document.

All constructors have an optional parameter clip which can be used to define if the content of the page should be clipped to the page format. The default value is true.

For the PageFormatOptions class there are several predefined constructors available:

Text Field Options

The TextFieldOptions class can be used to customize the text fields of the exported PDF Document.

All constructors have an optional parameter interactive which can be used to define if the text fields should be interactive. The default value is true. If interactive is set to false, the text fields will be rendered as Text.

For the TextFieldOptions class there are several predefined constructors available:

Checkbox Options

The CheckboxOptions class can be used to customize the checkboxes of the exported PDF Document.

All constructors have an optional parameter interactive which can be used to define if the checkboxes should be interactive. The default value is true. If interactive is set to false, the checkboxes will be rendered as a Container and will not be clickable.

For the CheckboxOptions class there are several predefined constructors available: