StarXpand SDKでテキストを印刷する（SwiftUI）

今回はスター精密プリンターの「mC-Label3」を使って、ラベル印刷をしてみます。

# 準備

まず、プリンターと接続して簡単に印刷するためには、[StarXpand SDKをインポート](https://qiita.com/s_mtd/items/145f43ae387cd29c27d8)します。

以下は、StarXpandを使用して印刷できる要素の例です。
- テキスト
- 画像
- バーコード
- QRコード

では早速、プリンターでラベルを印刷するためのコードを書いていきましょう！

# テキストを印刷してみる
今回は最も簡単なテキスト印刷をします。

印刷するには本来、プリンターに対しコマンドを送る必要があるのですが、StarXpand SDKはこのコマンドを自動的に生成してくれます。

コマンドを取得するため、主に以下の3クラスを使用します。

```swift:CommandBuilder
StarXpandCommand.StarXpandCommandBuilder()
```

```swift:DocumentBuilder
StarXpandCommand.DocumentBuilder()
```

```swift:PrinterBuilder
StarXpandCommand.PrinterBuilder()
```

上記のクラスを使い、以下の手順でコマンドを取得します。
1. `PrinterBuilder`に順次実行したい処理を追加していく
2. `DocumentBuilder`に`PrinterBuilder`を追加する
3. `CommandBuilder`に`DocumentBuilder`を追加する
4. `.getCommands()`でコマンドを取得する

実際に、テキストを印刷するコマンドを取得して、印刷してみましょう。

```swift:処理全体
func printLabel(_ printer: StarPrinter) async{
    let printerBuilder = StarXpandCommand.PrinterBuilder()
        .actionPrintText("Hello, World1")
        .actionFeedLine(1)
        .actionPrintText("Hello, World2")
        .actionFeedLine(1)
        .actionPrintText("Hello, World3")
        .actionFeedLine(1)
        .actionCut(.partial)
    let documentBuilder = StarXpandCommand.DocumentBuilder()
        .addPrinter(printerBuilder)
    let commandBuilder = StarXpandCommand.StarXpandCommandBuilder()
        .addDocument(documentBuilder)
    
    do{
        try await printer.open()
        try await printer.print(command: commandBuilder.getCommands())
    }
    catch{
        print("print label failed")
    }
    await printer.close()
}
```

順に説明していきます。
```swift
let printerBuilder = StarXpandCommand.PrinterBuilder()
    .actionPrintText("Hello, World1")
    .actionFeedLine(1)
    .actionPrintText("Hello, World2")
    .actionFeedLine(1)
    .actionPrintText("Hello, World3")
    .actionFeedLine(1)
    .actionCut(.partial)
```
`PrinterBuilder`で、印刷する内容を定義していきます。
`.actionFeedLine(1)`で行を送り、改行します。
`.actionCut(.partial)`で最後にパーシャルカットをします。
```swift
let documentBuilder = StarXpandCommand.DocumentBuilder()
    .addPrinter(printerBuilder)
let commandBuilder = StarXpandCommand.StarXpandCommandBuilder()
    .addDocument(documentBuilder)
```
`DocumentBuilder`に`PrinterBuilder`を追加し、
`CommandBuilder`に`DocumentBuilder`を追加します。

これでコマンドを取得する準備は完了です。
```swift
    do{
        try await printer.open()
        try await printer.print(command: commandBuilder.getCommands())
    }
    catch{
        print("print label failed")
    }
    await printer.close()
```
上記は、実際に印刷するコードです。

どのプリンターに印刷させるかは、引数のStarPrinterで定義します。
※周囲のプリンターを検索してStarPrinter型として取得するには、[ディスカバリ機能](https://qiita.com/s_mtd/items/145f43ae387cd29c27d8#4sdk%E3%81%AE%E5%8B%95%E4%BD%9C%E3%82%92%E8%A9%A6%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B)を使用します。

`.open()`でポートに接続し、
`.print(command:)`で取得したコマンドを使って印刷を実行します。
印刷が終わったら`.close()`でポートを閉じます。

これらは全て非同期処理なので`await`をつける必要があり、これらの処理を含む関数もasync関数にする必要があります。

それではこの処理を実行してみます。
![1-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3511059/a8a0091e-d07c-5c81-7881-48132b0b55f5.jpeg)
引数で指定したプリンターから、こちらのラベルが印刷されました。

# おわりに

今回は最も単純なテキスト印刷を行いました。StarXpand SDKを使用すれば、他にも画像、バーコード、QRコードなど様々な要素を簡単に印刷することができます。
今後も少しずつ記事を追加していきますので、是非参考にしてみてください！