FlutterアプリでWordファイル(DOCX)やPDFのレポートを自動生成したい、リッチな帳票をプログラムから出力したいと思ったことはありませんか?
そんなときに最適なのが docs_gee パッケージです。純粋なDartのみで構築されており、ネイティブプラグインに依存せず、1つのドキュメントモデルからDOCXとPDFの両方を生成できる非常に便利なライブラリです。
docs_geeとは?
docs_gee は、Microsoft Word(DOCX)およびPDFドキュメントを生成・読み込みするためのパッケージです。帳票出力やレポート生成機能を持つアプリ開発において、強力なサポートを提供してくれます。
主な特徴:
- ピュアDart: ネイティブ(iOS/Android向け)の依存関係がゼロ。Dartが動く環境ならどこでも動作します。
- デュアルフォーマット: 1つのドキュメント構築コードから、DOCXとPDFの両方を同時に生成可能。
- クロスプラットフォーム: iOS、Android、Web、macOS、Windows、Linuxに完全対応。
- 軽量設計: 外部パッケージへの依存は
archive(ZIP処理用)のみ。 - シンプルなAPI: 直感的なビルダーパターンで複雑なドキュメントも容易に構築できます。
インストール方法
pubspec.yaml に以下を追加します:
YAML
dependencies:
docs_gee: ^1.3.3
インストール後に実行:
Bash
flutter pub get
基本的な使い方
ドキュメントのインスタンスを作成し、そこに見出しや段落を追加していく直感的な仕様です。
Dart
import 'dart:io';
import 'package:docs_gee/docs_gee.dart';
void main() {
// ドキュメントの作成(メタデータを指定)
final doc = Document(title: '四半期レポート', author: 'Flutterエンジニア');
// コンテンツの追加
doc.addParagraph(Paragraph.heading('売上レポート', level: 1));
doc.addParagraph(Paragraph.text('このレポートは第4四半期の業績をまとめたものです。'));
// テーブル(表)の追加
doc.addTable(Table(
rows: [
TableRow(cells: [
TableCell.text('指標', backgroundColor: 'E0E0E0'),
TableCell.text('値', backgroundColor: 'E0E0E0'),
]),
TableRow(cells: [
TableCell.text('総収益'),
TableCell.text('¥1,200,000', alignment: Alignment.right),
]),
],
));
// DOCXとPDFの両方をバイトデータとして生成し、ファイルに保存
File('report.docx').writeAsBytesSync(DocxGenerator().generate(doc));
File('report.pdf').writeAsBytesSync(PdfGenerator().generate(doc));
}
リッチテキストとリストの作成
TextRun を組み合わせることで、1つの文の中で色や太字を自由に変更できます。また、箇条書きや番号付きリストも簡単に実装可能です。
Dart
// リッチテキストの例
doc.addParagraph(Paragraph(
runs: [
TextRun('これは通常のテキストで、'),
TextRun('ここは太字、', bold: true),
TextRun('ここは斜体、', italic: true),
TextRun('そして赤色です。', color: 'FF0000'),
],
));
// リストの例
doc.addParagraph(Paragraph.bulletItem('箇条書きアイテム1'));
doc.addParagraph(Paragraph.bulletItem('ネストされたアイテム', indentLevel: 1));
doc.addParagraph(Paragraph.numberedItem('ステップ 1'));
doc.addParagraph(Paragraph.numberedItem('ステップ 2'));
テーブルと高度なスタイル
罫線の色や太さをセル単位で調整したり、リンクや目次を自動生成することも可能です。
Dart
// カスタム罫線を持ったテーブル
doc.addTable(Table(
borders: const TableBorders.all(), // 基本の罫線
rows: [
TableRow(cells: [
// 下線だけを持つセル
TableCell.text('アンダーライン', borders: const CellBorders.bottom()),
// カスタム装飾されたセル
TableCell(
paragraphs: [Paragraph.text('警告')],
borders: const CellBorders(
top: Border(color: 'FF0000', size: 8, style: BorderStyle.double),
bottom: Border(color: '0000FF'),
),
),
]),
],
));
// 目次の自動生成設定
final tocDoc = Document(
title: '仕様書',
includeTableOfContents: true,
tocTitle: '目次',
tocMaxLevel: 3, // Heading 1〜3を目次に含める
);
実用例:Webやモバイルでのファイル保存・共有
生成したバイトデータ(Uint8List)を、モバイルやWebで処理する際の実装例です。
モバイルアプリでの共有(share_plus パッケージ利用)
Dart
import 'package:path_provider/path_provider.dart';
import 'package:share_plus/share_plus.dart';
Future<void> shareDocument(Uint8List bytes) async {
final dir = await getTemporaryDirectory();
final file = File('${dir.path}/document.docx');
await file.writeAsBytes(bytes);
await Share.shareXFiles([XFile(file.path)]); // 他アプリへ共有
}
Webアプリでのダウンロード処理
Dart
import 'dart:html' as html;
void downloadDocument(Uint8List bytes, String filename) {
final blob = html.Blob([bytes]);
final url = html.Url.createObjectUrlFromBlob(blob);
html.AnchorElement(href: url)
..setAttribute('download', filename)
..click();
html.Url.revokeObjectUrl(url); // メモリ解放
}
対応している機能一覧
| 機能 | DOCX | |
| テキスト装飾(太字・斜体・取り消し線) | ✅ | ✅ |
| 見出し(H1〜H4) | ✅ | ✅ |
| テキストの配置(左・中央・右・両端揃え) | ✅ | ✅ |
| リスト(最大9レベルのネスト対応) | ✅ | ✅ |
| テーブル(境界線・背景色対応) | ✅ | ✅ |
| 改ページ | ✅ | ✅ |
| ハイパーリンク(外部URL) | ✅ | ❌ |
| ドキュメント内リンク(ブックマーク) | ✅ | ❌ |
| 目次(TOC)の自動生成 | ✅ | ❌ |
(※一部機能は現在DOCXのみ対応となっていますが、基本的なドキュメント要件は網羅されています)
互換性と対応プラットフォーム
生成されたドキュメントは互換性が高く、以下のソフトウェアで開くことができます。
- Microsoft Word 2007以降
- Google Docs
- Apple Pages
- LibreOffice Writer
対応プラットフォーム:
Android, iOS, Web, macOS, Windows, Linux (全環境対応)
まとめ
| 特徴 | 内容 |
| デュアル生成 | 1回の処理でWordとPDFを同時に生成可能 |
| プラットフォーム依存なし | 純粋なDartパッケージのため、どのデバイスでも動く |
| 豊かな表現力 | リッチテキスト、リスト、複雑なテーブルなど業務要件に十分対応 |
docs_gee パッケージは、Flutterでのドキュメント出力を劇的にシンプルにしてくれます。ネイティブ連携によるトラブルを避けたい場合や、Webを含むマルチプラットフォームで安定したファイル出力を実装したい場合に、ぜひ導入を検討してみてください!
参考リンク
