#android #flutter #pdf #dart
#Android #флаттер #PDF #dart
Вопрос:
В настоящее время у меня есть эта функция, которая возвращает Uint8List. Я хотел бы отобразить его в формате pdf в своем приложении для Android, чтобы я мог его видеть. Не уверен, как это сделать, любая помощь приветствуется! Это исходный код, если это также может помочь. Спасибо https://github.com/DavBfr/dart_pdf/blob/master/demo/lib/invoice.dart
Future<Uint8List> generateInvoice(PdfPageFormat pageFormat) async {
final lorem = pw.LoremText();
final products = <Product>[
Product('19874', lorem.sentence(4), 3.99, 2),
Product('98452', lorem.sentence(6), 15, 2),
Product('28375', lorem.sentence(4), 6.95, 3),
Product('95673', lorem.sentence(3), 49.99, 4),
Product('23763', lorem.sentence(2), 560.03, 1),
Product('55209', lorem.sentence(5), 26, 1),
Product('09853', lorem.sentence(5), 26, 1),
];
final invoice = Invoice(
invoiceNumber: '982347',
products: products,
customerName: 'Abraham Swearegin',
customerAddress: '54 rue de Rivolin75001 Paris, France',
paymentInfo:
'4509 Wiseman StreetnKnoxville, Tennessee(TN), 37929n865-372-0425',
tax: .15,
baseColor: PdfColors.teal,
accentColor: PdfColors.blueGrey900,
);
return await invoice.buildPdf(pageFormat);
}
class Invoice {
Invoice({
this.products,
this.customerName,
this.customerAddress,
this.invoiceNumber,
this.tax,
this.paymentInfo,
this.baseColor,
this.accentColor,
});
final List<Product> products;
final String customerName;
final String customerAddress;
final String invoiceNumber;
static const _darkColor = PdfColors.blueGrey800;
static const _lightColor = PdfColors.white;
PdfColor get _baseTextColor =>
baseColor.luminance < 0.5 ? _lightColor : _darkColor;
PdfColor get _accentTextColor =>
baseColor.luminance < 0.5 ? _lightColor : _darkColor;
double get _total =>
products.map<double>((p) => p.total).reduce((a, b) => a b);
double get _grandTotal => _total * (1 tax);
PdfImage _logo;
Future<Uint8List> buildPdf(PdfPageFormat pageFormat) async {
// Create a PDF document.
final doc = pw.Document();
final font1 = await rootBundle.load('assets/roboto1.ttf');
final font2 = await rootBundle.load('assets/roboto2.ttf');
final font3 = await rootBundle.load('assets/roboto3.ttf');
_logo = PdfImage.file(
doc.document,
bytes: (await rootBundle.load('assets/logo.png')).buffer.asUint8List(),
);
// Add page to the PDF
doc.addPage(
pw.MultiPage(
pageTheme: _buildTheme(
pageFormat,
font1 != null ? pw.Font.ttf(font1) : null,
font2 != null ? pw.Font.ttf(font2) : null,
font3 != null ? pw.Font.ttf(font3) : null,
),
header: _buildHeader,
footer: _buildFooter,
build: (context) => [
_contentHeader(context),
_contentTable(context),
pw.SizedBox(height: 20),
_contentFooter(context),
pw.SizedBox(height: 20),
_termsAndConditions(context),
],
),
);
// Return the PDF file content
return doc.save();
}
Ответ №1:
Вы можете сохранить файл локально и отобразить его с помощью какого-либо средства просмотра pdf
final String dir = (await getApplicationDocumentsDirectory()).path;
final String path = '$dir/example.pdf';
final File file = File(path);
await file.writeAsBytes(doc.save());
Теперь вы можете использовать этот путь для просмотра PDF с помощью программы просмотра pdf.
Вы можете проверить это сообщение medium для справки.
Комментарии:
1. Спасибо. Хотя это создает файл pdf, при попытке открыть файл я получаю сообщение об ошибке
Failed to load PDF document.
Ответ №2:
С помощью этого решения вам не нужно сохранять файл, чтобы просмотреть его как виджет.
Используйте пакет: syncfusion_flutter_pdfviewer
syncfusion_flutter_pdfviewer: ^19.4.42-beta
Этот пакет предоставляет виджет, который может загружать PDF из байтов
Scaffold(
body:SfPdfViewer.memory(_your_pdf_in_bytes),
);
This widget can be added anywhere in the widget tree in your app