GoogleCloudPrintに使ってPDFを印刷する。（GoogleAPI）

## Google Cloud Print とは
Googleアカウントに端末に設定しているプリンタを登録して、クラウド経由で別端末から印刷ができるサービス。

   - 印刷に必要な設定
     - Googleアカウントの取得
     - Chromeブラウザのインストール
     - プリンタの登録
   - GoogleAPIから呼び出す為に必要な設定
     - GoogleAPIの認証キーの取得

## 処理の流れ

 1. リフレッシュトークンの取得（一度取得していれば不要）
 2. アクセストークンの取得
 3. GoogleCloudPrintの操作(プリンタ一覧の取得,プリンタID指定で印刷実行)


## 事前準備
GoogleCloudPrintのプリンタ登録は、以下を参考に実施。
https://www.google.com/cloudprint/learn/

### GoogleAPIのクライアントIDとシークレット取得
GoogleCloudPratformにアクセスして、認証情報を登録する。

https://console.cloud.google.com/

 [APIとサービス]→[認証情報]→[認証情報を作成]→[OAuthクライアントID]の順番に選択
  ![image.png](https://qiita-image-store.s3.amazonaws.com/0/282054/d9ce3313-bcb2-401a-ddd4-2bc4e71c47d6.png)

 今回は、お試しなので[その他]を選択
  ![image.png](https://qiita-image-store.s3.amazonaws.com/0/282054/4d2815c6-2bab-2ae9-1894-995149c7b95e.png)

 `クライアントID`と`クライアントシークレット`を取得（あとで使います。）
  ![image.png](https://qiita-image-store.s3.amazonaws.com/0/282054/3de90d9b-5323-1e9b-55ef-435b255b0434.png)

### GoogleCloudPrintへのアクセス許可と、アプリケーションに設定するコードを取得

 取得した`クライアントID`をURL設定して、ブラウザに直接アクセス
  https://accounts.google.com/o/oauth2/auth?redirect_uri=oob&response_type=code&client_id=＜ここに上記で取得したクライアントIDを指定＞&scope=https://www.googleapis.com/auth/cloudprint

 [許可]を選択
  ![image.png](https://qiita-image-store.s3.amazonaws.com/0/282054/f9209ed2-767e-c774-a653-7dc7e35b66a2.png)
  ![image.png](https://qiita-image-store.s3.amazonaws.com/0/282054/3692cdb2-b408-92f2-9dc1-4fba0d132759.png)

 `コード`を取得（あとで使います。）
 ![image.png](https://qiita-image-store.s3.amazonaws.com/0/282054/805671e2-3a33-5949-5368-e96e2b2c6c78.png)


## GoogleAPIで自動印刷
今回は、JavaのUnirestを使って、実行してみる。
重要な処理だけをピックアップして記載

```java:getRefreshToken
		HttpResponse<JsonNode> res = Unirest.post("https://www.googleapis.com/oauth2/v3/token")
				.field("code", code) //　事前準備で取得したコードを設定 
				.field("client_id", client_id)  //　事前準備で取得したクライアントIDを設定
				.field("client_secret", client_secret)  //　事前準備で取得したクライアントシークレットを設定
				.field("grant_type", "authorization_code")
				.field("redirect_uri", "oob")
				.asJson();
```
リフレッシュトークンを取得する。
コードは一回使うと、もう使えなくなるのでリフレッシュトークンがわからなくなったら事前準備のコード取得から行う必要あり。

```java:getAccessToken
		HttpResponse<JsonNode> res = Unirest.post("https://www.googleapis.com/oauth2/v3/token")
				.field("client_id", client_id)  //　事前準備で取得したクライアントIDを設定
				.field("client_secret", client_secret)  //　事前準備で取得したクライアントシークレットを設定
				.field("grant_type", "refresh_token")
				.field("refresh_token", refresh_token)  // getRefreshTokenで取得したリフレッシュトークンを設定
				.asJson();
```
アクセストークンを取得する。
リフレッシュトークンから都度アクセストークンを取得する。
プリンタにアクセスする度に、アクセストークンを取得するように構成する。

```java:getPrinters
		HttpResponse<JsonNode> res = Unirest.get("https://www.google.com/cloudprint/search")
				.header("Authorization", token_type + " " + access_token)
				.asJson();
```
GoogleCloudPrintに設定されているプリンタ一覧を取得する。

```java:submitFile
		HttpResponse<JsonNode> res = Unirest.post("https://www.google.com/cloudprint/submit")
				.header("Authorization", token_type + " " + access_token)
				.field("printerid", printerid)  // プリンタIDを設定：デフォルトのGoogleDriveは[__google__docs]です。
				.field("title", file.getName())
				.field("ticket", gson.toJson(new TicketBean()))
				.field("content", file)
				.asJson();
```
GoogleCloudPrintにローカルPDFファイルの印刷要求を行う。
fileには、java.io.File型です。



#### これらの処理を順番に行うことで印刷できます。

##　最後に
例えば、サーバ側に動的なPDF作成処理を実装し、複数クライアント側のプリンタに対して印刷を行うなど。
簡単に実現できる仕組みとなる。

今はアカウントにプリンタを登録する必要があるので難しいが
いずれ、Faxがいらなくなる日が来るかもしれない。