我的flutter应用程序将小部件捕获到图像,然后创建PDF文件到打印机,但如下图所示却显示出荒谬的结果。
让我知道您是否有更好的方法将汉字和二维图像打印到收据(纸张宽度为75mm的蓝牙打印机)
在此带有小部件:
async
这里具有创建图像和pdf到打印机的功能。
RepaintBoundary(
key: _renderObjectKey,
child: ListView(
children: <Widget>[
Form(
key: tableNumberFormKey,
child:
ListTile(
title: TextFormField(
initialValue: "",
style: TextStyle(fontSize: 48.0),
textAlign: TextAlign.center,
maxLength: 4,
keyboardType: TextInputType.phone,
onSaved: (val) => inputTableNumber = val.toString(),
validator: (val) => val.isEmpty ? '' : null,
decoration: new InputDecoration(
labelText: "輸入檯號",
hintText: "例如:12",
),
),
),
),
FlatButton(
textColor: Colors.blueAccent,
child: Text(
"列印 QR CODE",
style: TextStyle(fontWeight: FontWeight.w500, fontSize: 20.0),
),
color: Colors.transparent,
onPressed: () {
_showQRandPrint();
SystemChannels.textInput.invokeMethod('TextInput.hide');
},
),
inputTableNumber == ""
? ListTile(title: Text(''),)
: Center(
child: QrImage(
data: qrString,
size: 300.0,
version: 10,
backgroundColor: Colors.white,
),
),
],
),
);
图片预览:
屏幕上的小部件是:
答案 0 :(得分:3)
一些错误:
PDFPageFormat(75.0,100.0)为pdf本机尺寸。如果需要毫米,请执行以下操作:
PDFPageFormat(75.0 * PDFPageFormat.MM, 100.0 * PDFPageFormat.MM)
声明图像时,必须传递像素大小
图像不能是png,但可以是rawRgba数据:
// var img = await image.toByteData(format: ui.ImageByteFormat.rawRgba);
PDFImage image = new PDFImage(
pdf,
image: img.buffer.asUint8List(),
width: img.width,
height: img.height);
pdf坐标系在页面的左下角具有0,0,并且仍以pdf单位 因此您必须使用:
g.drawImage(image, 100.0 * PDFPageFormat.MM, 0.0, 75.0* PDFPageFormat.MM);
第三个参数设置宽度。计算高度以保持宽高比。
也许您需要对其进行调整以使图像居中,但是library page上有一个示例。
答案 1 :(得分:0)
找到了最简单的解决方案。 只需使用AspectRatio来调整图像大小,而不是在PdfImage的声明中。 拥有Uint8List文件后,请执行以下操作:
let string_rule = "[a-zA-Z]{2,10}";
然后,在pdf文档本身上使用:
final image = PdfImage.file(
pdf.document,
bytes: list, //Uint8List
);
仅此而已。