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にアクセスして、認証情報を登録する。

[APIとサービス]→[認証情報]→[認証情報を作成]→[OAuthクライアントID]の順番に選択

今回は、お試しなので[その他]を選択

クライアントIDクライアントシークレットを取得(あとで使います。)

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

[許可]を選択

コードを取得(あとで使います。)

GoogleAPIで自動印刷

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

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();

リフレッシュトークンを取得する。
コードは一回使うと、もう使えなくなるのでリフレッシュトークンがわからなくなったら事前準備のコード取得から行う必要あり。

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();

アクセストークンを取得する。
リフレッシュトークンから都度アクセストークンを取得する。
プリンタにアクセスする度に、アクセストークンを取得するように構成する。

getPrinters
        HttpResponse<JsonNode> res = Unirest.get("https://www.google.com/cloudprint/search")
                .header("Authorization", token_type + " " + access_token)
                .asJson();

GoogleCloudPrintに設定されているプリンタ一覧を取得する。

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がいらなくなる日が来るかもしれない。