问题
I am trying to develop a Flutter application which can print a document to paper. I am only able to get it to work with English characters. Can someone help to make it work with Chinese please?
Here is my 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),
],
),
),
);
}
}
The Screen will not go to the print preview page when using Chinese Unicode to print.
If it helps, here is my 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
回答1:
Unfortunately it looks like the PDF library can only use ASCII characters. Here, I have attached code to generate a PFD with the English language. It also accesses the 'share' page of the mobile device so you can save the PDF to another app or send it to the printer via methods like AirPrint. Hope this helps. I have also re-written the code. I will make a pull request to your repo soon. You may want to file a bug report to David PHAM-VAN who is the author of the [PDF][1] library.
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)
],
),
),
);
}
}
Edit: I can't figure out quickly how to send a pull request so just replace your main.dart with this code. Also this is the pubspec.yaml code you want/
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
Edit 2:
Important! When you write the PDF to a file, this writes it directly to the phone. For example, if you are on iOS, go to the Files
app and you will see a folder called <your app name>
and inside, there will be 'pdf.pdf'. You may want to do a bit of cleaning or find another sharing method.
[1]: https://pub.dartlang.org/packages/pdf
回答2:
This now works with the version 1.3.5 of the dart pdf library: github.com/DavBfr/dart_pdf
来源:https://stackoverflow.com/questions/52903682/flutter-create-chinese-character-pdf-file-and-print-file-in-printer