拍打捕获小部件以图像,然后创建PDF文件至打印机

时间:2018-10-31 18:13:57

标签: printing flutter

我的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,
            ),
          ),

        ],
      ),
    );

图片预览:

enter image description here

屏幕上的小部件是:

enter image description here

2 个答案:

答案 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
);

仅此而已。