.NET API:開発サポートツール

StarMicronics.CloudPRNT-Utilityパッケージは、Star CloudPRNTプロトコルに対応したサーバーサイドのアプリケーション開発を支援するAPIを提供します。


このAPIは .NET Standard 2.0仕様に基づいて構築されており、以下のアプリケーションで自由に使用できます。

  • .NET Framework 4.7.2以降
  • .NET Core 3.1以降

この.NET用ライブラリは、V1.2.0現在、.NET8環境で動作確認を行っています。



StarMicronics.CloudPRNT-Utilityは、CloudPRNTサーバー開発者をサポートする次の機能を提供します。


これらはCloudPRNTサーバー開発用のユーティリティクラスで使われることを意図して設計されていますが、ステータスのデコードとドキュメント形式の変換は、特に印刷にStarドキュメントマークアップを使用したいローカルアプリケーションにも有用です。


個々のクラスとタイプの詳細については、 API Reference を参照してください。 Visual StudioやVisual Studio CodeなどのIDEを使用すると、インラインヘルプも提供されます(英語のみ)。


.NET API 導入方法

Visual Studioでのインストール


1"ソリューションエクスプローラー"パネルでプロジェクトを右クリックし、"NuGetパッケージの管理..."を選択してNuGetダイアログを表示します。


2"参照"をクリックします。


3検索ボックスにStarMicronics.CloudPRNT-Utilityと入力してパッケージを探します。


4必要なバージョンを選択します(最新バージョンを推奨します)。


5"インストール"をクリックします。


dotnet コマンドでのインストール


1コマンドプロンプトを開き、"cd"コマンドでプロジェクトフォルダー(プロジェクトの".csproj"ファイルが存在するフォルダー)に移動します。


2下記のdotnetコマンドを実行します。


dotnet add package StarMicronics.CloudPRNT-Utility

プロジェクトへのインストール

StarMicronics.CloudPRNT-UtilityはNuGetパッケージとして提供され、Visual Studio NuGet UI、nuget コマンドラインユーティリティ、または dotnet コマンドラインユーティリティを介してインストールできます。

ライブラリバージョンにおける注意事項:
<V1.2.0以降>
画像処理にSixLabors.ImageSharp V2.1.9を使用しています。
<V1.1.2>
画像処理にSixLabors.ImageSharp V1.0.4を使用しています。
<V1.1.1>
画像処理にSixLabors.ImageSharp V1.0.2を使用しています。
<V1.0.4以下>
画像処理にプレリリースバージョンのSixLabors.ImageSharp V1.0.0-beta0007を使用しています。 このため、APIでの画像処理に関する仕様は予告なく変更される場合があります。 また、StarMicronics.CloudPRNT-Utilityがインストールできない場合、先に"NuGetパッケージの管理..."より"プレリリースを含める"にチェックを入れて、 SixLabors.ImageSharpを行ってください


.NET API 利用方法

StarMicronics.CloudPRNT Utilityパッケージのすべての要素は、名前空間 「StarMicronics.CloudPRNT」で使用できます。
提供されたAPIクラスは、既存のサービスの機能拡張としてCloudPRNTサポートを追加いただいた際に、主にCloudPRNT のPOST/GETリクエストの処理において利用されることを想定しています。

HTTP POSTリクエストによるCloudPRNTポーリング受信時

  • サーバーは、POST JSON本体をStarMicronics.CloudPrnt.CpMessage.PollRequestにデシリアライズして、簡単に処理できます。
    デシリアライズを実行するために、静的メソッドPollrequest.FromJson()が用意されています。
  • サーバーは、ポーリングへのレスポンスを準備するためにStarMicronics.CloudPrnt.CpMessage.PollResponse オブジェクトを作成できます。
    これをJSONにシリアライズして、適切なCloudPRNTポーリングレスポンスを作成できます。 シリアライズを実行するために、PollResponse.ToJson()メソッドが用意されています。
  • サーバーがクライアントにジョブの印刷を要求する場合、PollResponse.jobReadyプロパティをtrueに設定し、 StarMicronics.CloudPrnt.Document 静的メソッドGetOutputTypesFromType(string) および GetOutputTypesFromFilename(string) により PollResponse.mediaTypes プロパティを設定して、CloudPRNTクライアントが選択できる印刷形式を通知します。

HTTP GETリクエストによるCloudPRNTジョブデータ要求受信時

  • サーバーはAPIでサポートされている入力データ形式(PNG、JPEG、BMP、GIF、テキスト、Starドキュメントマークアップ)のいずれかを使用して、印刷ジョブを取得またはレンダリングできます。
  • サーバーは、StarMicronics.CloudPrnt.ConversionOptions オブジェクトを準備して印刷ジョブの準備方法(画像の印刷時にディザリングとスケーリングを使用するか等)を決定する必要があります。
  • サーバーは、StarMicronics.CloudPrnt.Document 静的ヘルパーメソッド Convert() または ConvertFromFile() を使用して、 ソースドキュメント(印刷ジョブ元)をCloudPRNTクライアントデバイスによって要求されたメディア形式に変換できます。


シリアライゼーションクラス

StarMicronics.CloudPRNT.CpMessage名前空間の下には、CloudPRNTポーリングJSONメッセージのシリアライズ/デシリアライズに利用できるクラスがあります。

主なクラスは下記2つのクラスです。


CloudPRNTポーリングリクエストを処理する単純なCloudPRNTサーバーメソッドは、次のようになります。(C#の場合)


string HandleCloudPRNTPoll(string request)
{
	PollRequest pollRequest = PollRequest.FromJson(request);
	Console.WriteLine(
		String.Format("Received CloudPRNT request from {0}, status: {1}",
		pollRequest.printerMAC,
		pollRequest.statusCode
	));

	// Create a response object
	PollResponse pollResponse = new PollResponse();

	// do not print anything at this time
	pollResponse.jobReady = false
	pollResponse.mediaTypes = null;

	return JsonConvert.SerializeObject(pollResponse);
}



ステータスデコード

StarMicronics.CloudPrnt.PrinterStatusクラスは、Star CloudPRNTクライアントによって返されるStar ASB形式のステータスを簡単にデコードおよび検証する方法を提供します。

CloudPRNTクライアントがプリンターデバイスのステータスを報告するとき、Star ASB仕様に従ってエンコードされた16進値の文字列として報告されます。

例として以下のようになります。

"23 86 00 00 00 00 00 00 00 00 00"

これは、PrinterStatusクラスを使用して処理しやすいフォームにデコードできます。
このクラスを使用するには次の例のようにコンストラクタ文字列としてステータス文字列を渡します。


PrinterStatus status = new PrinterStatus("23 86 00 00 00 00 00 00 00 00 00");
 if(status.CoverOpen)
 	Console.WriteLine("Printer cover is open");

コードに既にPollRequestオブジェクトがある場合は、PrinterStatusオブジェクトを取得するためのPollRequest.DecodedStatusプロパティが利用できます。


PollRequest pollRequest = PollRequest.FromJson(request);
 if(pollRequest.DecodedStatus.CoverOpen)
	Console.WriteLine("Printer cover is open");


印刷ジョブで使用可能な出力メディアタイプの決定

印刷ドキュメントの処理は、ICpDocumentインターフェースを実装するクラスを介して実行されます。
現在、APIでサポートされているドキュメントのコアタイプは3つあります。

  • Documents.ImageDoc - PNG、JPEG、BMP、GIFソースなどからグラフィカルに作成されたドキュメントを処理します。
  • Documents.TextDoc - UTF-8エンコードテキストとして作成されたプレーンテキストドキュメントを処理します。
  • Documents.MarkupDoc - Starドキュメントマークアップを使用して作成されたドキュメントを処理します。

これらのICpDocument実装は、それぞれ入力ドキュメントを様々な出力形式に変換してどのStarプリンターでも確実に処理できるようにします。
これらの各ドキュメントタイプを直接構築することは可能ですが、通常はファクトリメソッドを提供するStarMicronics.CloudPrnt.Document静的クラスを使用する方が便利です。 ドキュメントオブジェクトを作成し、ICpDocumentクラスの使用を完全に隠すことができます。

特定の入力に対してサポートされている出力メディアタイプのリストを取得するための最も簡単な方法は、Document.GetOutputTypesFromType(string)または Document.GetOutputTypesFromFileName(string)メソッドです。

たとえば、サーバー実装が Starドキュメントマークアップを使用して印刷ジョブを準備する場合、API がこれをどのデータ形式に変換できるかを決定できます。


string[] availableOutputMediaTypes = Document.GetOutputTypesFromType("text/vnd.star.markup");

また、ジョブがファイルから提供される場合、使用可能な出力タイプはファイル名から判別できます(認識できるファイル拡張子が必要です)。


string[] availableOutputMediaTypes = Document.GetOutputTypesFileName("jobs/order.png");

CloudPRNT POSTリクエストハンドラの例は以下の通りです。


string HandleCloudPRNTPoll(string request)
{
	PollRequest pollRequest = PollRequest.FromJson(request);
	Console.WriteLine(
		String.Format("Received CloudPRNT request from {0}, status: {1}",
			pollRequest.printerMAC,
			pollRequest.statusCode
		));

	// Create a response object
	PollResponse pollResponse = new PollResponse();

	if (database.jobAvailable(pollRequest.printerMAC))
	{
		pollResponse.jobReady = true;
		pollResponse.mediaTypes = new List<string>();
		pollResponse.mediaTypes.AddRange(Document.GetOutputTypesFromType("text/vnd.star.markup");
	}
	else
	{
		pollResponse.jobReady = false;
		pollResponse.mediaTypes = null;
	}

	return pollResponse.ToJson();
}

上記の例では、databaseオブジェクトは特定のデバイスの状態と要件を保持するために使用できるオブジェクトの一例として使用されていることに注意してください。



印刷ジョブデータの変換と提供(GETリクエスト)

サーバーから(ポーリングレスポンスによって)印刷ジョブが利用可能であることを通知され、利用可能なメディアタイプのリストが提供されると、CloudPRNTデバイスは次にHTTP GETによって実際の印刷ジョブデータを要求します。

印刷用のジョブをダウンロードする前に、クライアントデバイスは最初にジョブエンコーディングに優先メディアタイプを選択し、選択したメディアタイプをクエリー文字列の一部として渡してHTTP GETを実行します。
サーバーは、要求されたメディアタイプを無視して任意の形式で印刷ジョブを提供することもできます。クライアントデバイスは、その形式がサポートされている場合に印刷します。ただし、この方法は推奨しません。
また、すべてのクライアントデバイスでサポートされることが保証されているデータ形式はありません。

すべてのCloudPRNTクライアントデバイスとの互換性を確保するために、サーバーは常に要求されたメディアタイプのGETレスポンスを生成することを推奨します。
サーバーはStarMicronics.CloudPrnt.Document.Convert()またはStarMicronics.CloudPrnt.Document.ConvertFromFile()メソッドを使用して、この変換を実行できます。

たとえば、Starドキュメントマークアップで印刷ジョブを作成しクライアントデバイスが要求する形式に変換するには下記のようになります。


// Make a simple markup language job
StringBuilder job = new StringBuilder();
job.Append("Hello World!\n");
job.Append("[barcode: type code39; data 12345; height 10mm]\n");
job.Append("[cut]");
byte[] jobData = Encoding.UTF8.GetBytes(job.ToString());

// get the requested output media type from the query string
string outputFormat = context.Request.Query["type"];

// set the response media type, and output the converted job to the response body
context.Response.ContentType = outputFormat;
Document.Convert(jobData, "text/vnd.star.markup", context.Response.Body, outputFormat, null);

このサンプルコードは、サーバーのCloudPRNT GETハンドラー内にあることが想定されており、context は有効な .NET Core HTTPContext オブジェクトです(したがって、context.Response.Body はGETレスポンスを提供する出力ストリームです)。
最後のパラメーターはConversionsObjectクラス用で、nullのままにしてデフォルトを使用できます(すべての出力を80mmにフォーマットするため、本番環境では推奨されません)。




テンプレート印刷機能を利用する場合

Starドキュメントマークアップのテンプレート印刷機能を利用する場合はStarMicronics.CloudPRNT.Document.ConvertWithApplyTemplate() またはStarMicronics.CloudPRNT.Document.ConvertFileWithApplyTemplate()メソッドを利用します。

テンプレート印刷機能の仕様はStarドキュメントマークアップマニュアルをご参照ください。

テンプレート印刷機能を利用して印刷ジョブを作成するサンプルは以下のようになります。

コードサンプル


// Make a markup language job that contains replacing specifiers
StringBuilder template = new StringBuilder();
template.Append("Template Sample\n");
template.Append("[column: left ${item1.name}; right ${item1.price}]");
template.Append("[column: left ${item2.name}; right ${item2.price}]");
template.Append("[cut]");
byte[] templateData = Encoding.UTF8.GetBytes(template.ToString());

// Make a json data
string fieldJson =
    """
    {
        "item1": {
            "name": "coffee",
            "price": 5
        },
        "item2": {
            "name": "cake",
            "price": 10
        }
    }
    """;
byte[] fieldData = Encoding.UTF8.GetBytes(fieldJson);

MemoryStream resultStream = new MemoryStream();

// Apply template and get converted job
Document.ConvertWithApplyTemplate(templateData, fieldData, resultStream, "application/vnd.star.starprnt", null);