Флаттер создает PDF-файл с китайскими иероглифами и печатает на принтере - PullRequest
0 голосов
/ 20 октября 2018

Я пытаюсь разработать приложение Flutter, которое может печатать документ на бумаге.Я могу заставить его работать только с английскими символами.Может ли кто-нибудь помочь заставить его работать с китайским, пожалуйста?

Вот мой main.dart

import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';
import 'dart:ui';

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

void main() => runApp(new MaterialApp(home: new MyApp()));

class MyApp extends StatelessWidget {
  final shareWidget = new GlobalKey();

  Future<PDFDocument> _generateDocument() async{
    final pdf = new PDFDocument(deflate: zlib.encode);
    final page = new PDFPage(pdf, pageFormat: PDFPageFormat(216.0, 384.0));
    final g = page.getGraphics();
    final top = page.pageFormat.height;


    g.setColor(new PDFColor(0.0, 1.0, 1.0));


    var font = await rootBundle.load("assets/GenYoMinTW-Heavy.ttf");
    PDFTTFFont ttf = new PDFTTFFont(pdf, font);

    //PDFTTFFont ttf = new PDFTTFFont(pdf, (new File("assets/open-sans.ttf").readAsBytesSync() as Uint8List).buffer.asByteData());
    g.setColor(new PDFColor(0.3, 0.3, 0.3));

    //var encoded = utf8.encode("檯號: 1");
    g.drawString(ttf, 20.0, '\u4f60\u597d', 10.0 * PDFPageFormat.MM, top - 10.0 * PDFPageFormat.MM);



    return pdf;
  }

  void _printPdf() {
    print("Print ...");
//    final pdf = _generateDocument();
//    Printing.printPdf(document: pdf);

  _generateDocument().then((pdf) {
    Printing.printPdf(document: pdf);
  });

  }


  void _sharePdf() {
    print("Share ...");
    //final pdf = _generateDocument();

    // Calculate the widget center for iPad sharing popup position
    final RenderBox referenceBox =
    shareWidget.currentContext.findRenderObject();
    final topLeft =
    referenceBox.localToGlobal(referenceBox.paintBounds.topLeft);
    final bottomRight =
    referenceBox.localToGlobal(referenceBox.paintBounds.bottomRight);
    final bounds = new Rect.fromPoints(topLeft, bottomRight);

    _generateDocument().then((pdf) {
      Printing.sharePdf(document: pdf, bounds: bounds);
    });

  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: const Text('Printing example'),
      ),
      body: new Center(
        child: new Column(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: <Widget>[
            new RaisedButton(
                child: new Text('Print Document'), onPressed: _printPdf),
            new RaisedButton(
                key: shareWidget,
                child: new Text('Share Document'),
                onPressed: _sharePdf),
          ],
        ),
      ),
    );
  }
}

Экран не перейдет на страницу предварительного просмотра при использовании китайского Unicode для печати. ​​

Если это поможет, вот мой pubspec.yaml:

name: testmanual
description: A new Flutter application.

# The following defines the version and build number for your application.
# A version number is three numbers separated by dots, like 1.2.43
# followed by an optional build number separated by a +.
# Both the version and the builder number may be overridden in flutter
# build by specifying --build-name and --build-number, respectively.
# Read more about versioning at semver.org.
version: 1.0.0+1

environment:
  sdk: ">=2.0.0-dev.68.0 <3.0.0"


dependencies:
  flutter:
    sdk: flutter

  # The following adds the Cupertino Icons font to your application.
  # Use with the CupertinoIcons class for iOS style icons.
  cupertino_icons: ^0.1.2
  image_picker: ^0.4.10
  flutter_mailer: ^0.1.1
  video_player: ^0.6.5
  datetime_picker_formfield: ^0.1.3
  device_calendar: ^0.0.6
  connectivity: ^0.3.1
  path_provider: "^0.4.0"
  flutter_date_picker: ^0.1.2
  image_form_field: ^0.0.2
  flutter_youtube: "^1.1.1"
  cached_network_image: ^0.4.2
  qr_flutter: ^1.1.3
  share: ^0.5.3
  audioplayers: ^0.7.8
  chewie: ^0.7.0
  printing: ^1.0.5
  pdf: ^1.0.6
  font_awesome_flutter: ^8.1.0

dev_dependencies:
  flutter_test:
    sdk: flutter


# For information on the generic Dart part of this file, see the
# following page: https://www.dartlang.org/tools/pub/pubspec

# The following section is specific to Flutter.
flutter:

  # The following line ensures that the Material Icons font is
  # included with your application, so that you can use the icons in
  # the material Icons class.
  uses-material-design: true

  # To add assets to your application, add an assets section, like this:
  assets:
    - assets/ding.wav
    - assets/qpon_download.pdf
    - assets/open-sans.ttf
    - assets/GenYoMinTW-Heavy.ttf

  # An image asset can refer to one or more resolution-specific "variants", see
  # https://flutter.io/assets-and-images/#resolution-aware.

  # For details regarding adding assets from package dependencies, see
  # https://flutter.io/assets-and-images/#from-packages

  # To add custom fonts to your application, add a fonts section here,
  # in this "flutter" section. Each entry in this list should have a
  # "family" key with the font family name, and a "fonts" key with a
  # list giving the asset and other descriptors for the font. For
  # example:
#  fonts:
#     - family: Schyler
#       fonts:
#         - asset: fonts/Schyler-Regular.ttf
#         - asset: fonts/Schyler-Italic.ttf
#           style: italic
#     - family: Trajan Pro
#       fonts:
#         - asset: fonts/TrajanPro.ttf
#         - asset: fonts/TrajanPro_Bold.ttf
#           weight: 700
  #
  # For details regarding fonts from package dependencies,
  # see https://flutter.io/custom-fonts/#from-packages

enter image description here

Ответы [ 2 ]

0 голосов
/ 26 марта 2019

Теперь это работает с версией 1.3.5 библиотеки dart pdf: github.com/DavBfr/dart_pdf

0 голосов
/ 30 октября 2018

К сожалению, похоже, что библиотека PDF может использовать только символы ASCII.Здесь я приложил код для генерации PFD с английским языком.Он также получает доступ к странице «Поделиться» мобильного устройства, поэтому вы можете сохранить PDF-файл в другом приложении или отправить его на принтер с помощью таких методов, как AirPrint.Надеюсь это поможет.Я также переписал код.Я сделаю запрос на выгрузку в ближайшее время.Вы можете подать отчет об ошибке Дэвиду ФАМ-ВАНУ, который является автором библиотеки [PDF] [1].

import 'dart:io';

import 'package:flutter/material.dart';
import 'package:flutter_share/flutter_share.dart';
import 'package:pdf/pdf.dart';
import 'package:path_provider/path_provider.dart';

void main() => runApp(new MaterialApp(home: new MyApp()));

class MyApp extends StatelessWidget {
  Future<PDFDocument> _generateDocument() async{
    final pdf = new PDFDocument();
    final  page = new PDFPage(pdf, pageFormat: PDFPageFormat(216.0, 384.0));
    final top = page.pageFormat.height;

    final g = page.getGraphics();
    final font = new PDFFont(pdf);

    g.setColor(new PDFColor(0.3, 0.3, 0.3));
    String text = "We can only use ASCII characters";
    g.drawString(font, 12.0, text, 1.0 * PDFPageFormat.mm, top-10*PDFPageFormat.mm);

    await _localFile.then((File file){
      print("Saving local file");
      file.writeAsBytesSync(pdf.save());
    });
    return pdf;
  }

  void _sharePDF() {
    print("Print ...");
      _generateDocument().then((pdf) {
        _localPath.then((String path){
          FlutterShare.share(fileUrl: "$path/pdf.pdf");
        });
    });

  }

  Future<File> get _localFile async {
    final path = await _localPath;
    return File('$path/pdf.pdf');
  }

  Future<String> get _localPath async {
    final directory = await getApplicationDocumentsDirectory();
    return directory.path;
  }

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: const Text('Printing example'),
      ),
      body: new Center(
        child: new Column(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly,
          children: <Widget>[
            new RaisedButton(
              child: new Text('Print Document'), onPressed: _sharePDF)
          ],
        ),
      ),
    );
  }
}

Редактировать: Я не могу понятькак быстро отправить запрос на удаление, просто замените main.dart этим кодом.Также это код pubspec.yaml, который вы хотите /

name: testmanual
description: A new Flutter application.

# The following defines the version and build number for your application.
# A version number is three numbers separated by dots, like 1.2.43
# followed by an optional build number separated by a +.
# Both the version and the builder number may be overridden in flutter
# build by specifying --build-name and --build-number, respectively.
# Read more about versioning at semver.org.
version: 1.0.0+1

environment:
  sdk: ">=2.0.0-dev.68.0 <3.0.0"


dependencies:
  flutter:
    sdk: flutter

  # The following adds the Cupertino Icons font to your application.
  # Use with the CupertinoIcons class for iOS style icons.
  cupertino_icons: ^0.1.2
  image_picker: ^0.4.10
  path_provider: "^0.4.0"
  qr_flutter: ^1.1.3
  printing: ^1.0.5
  pdf: ^1.0.6
  flutter_share: ^0.0.4
  # flutter_mailer: ^0.1.1
  # video_player: ^0.6.5
  # datetime_picker_formfield: ^0.1.3
  # device_calendar: ^0.0.6
  # connectivity: ^0.3.1
  # flutter_date_picker: ^0.1.2
  # image_form_field: ^0.0.2
  # flutter_youtube: "^1.1.1"
  # cached_network_image: ^0.4.2
  # share: ^0.5.3
  # audioplayers: ^0.7.8
  # chewie: ^0.7.0
  # font_awesome_flutter: ^8.1.0

dev_dependencies:
  flutter_test:
    sdk: flutter


# For information on the generic Dart part of this file, see the
# following page: https://www.dartlang.org/tools/pub/pubspec

# The following section is specific to Flutter.
flutter:

  # The following line ensures that the Material Icons font is
  # included with your application, so that you can use the icons in
  # the material Icons class.
  uses-material-design: true

  # To add assets to your application, add an assets section, like this:
  assets:
    - assets/ding.wav
    - assets/qpon_download.pdf
    - assets/open-sans.ttf
    - assets/GenYoMinTW-Heavy.ttf

  # An image asset can refer to one or more resolution-specific "variants", see
  # https://flutter.io/assets-and-images/#resolution-aware.

  # For details regarding adding assets from package dependencies, see
  # https://flutter.io/assets-and-images/#from-packages

  # To add custom fonts to your application, add a fonts section here,
  # in this "flutter" section. Each entry in this list should have a
  # "family" key with the font family name, and a "fonts" key with a
  # list giving the asset and other descriptors for the font. For
  # example:
#  fonts:
#     - family: Schyler
#       fonts:
#         - asset: fonts/Schyler-Regular.ttf
#         - asset: fonts/Schyler-Italic.ttf
#           style: italic
#     - family: Trajan Pro
#       fonts:
#         - asset: fonts/TrajanPro.ttf
#         - asset: fonts/TrajanPro_Bold.ttf
#           weight: 700
  #
  # For details regarding fonts from package dependencies,
  # see https://flutter.io/custom-fonts/#from-packages

Изменить 2:

Важно! Когда вы пишете PDF вфайл, это записывает его прямо на телефон.Например, если вы работаете в iOS, перейдите в приложение Files и увидите папку с именем <your app name>, а внутри будет файл «pdf.pdf».Вы можете сделать небольшую очистку или найти другой способ обмена.

  [1]: https://pub.dartlang.org/packages/pdf
...