GraphAPI：OneDriveを使ったWord⇒PDF変換

##はじめに
WordからPDFに変換する要件があり、様々技術検証した結果、OneDriveを利用して変換するのが一番変換精度が高いことが判明しました。
##まず結果から
docxファイル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1352889/e151139e-0a82-2173-e01d-4c6f3c985dee.png)

pdfファイル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1352889/ddd8b638-b6e9-d190-e9d7-7219ea09d7c7.png)

図形も含めって完璧に変換されます。

##OneDriveを利用して実現するための主要手順
- ①Office365のアカウントを用意する
　　⇒「OneDrive for Business」のサブスクリプションが持っているが前提。
- ②AzureAD上でWEBアプリを登録し、APIのアクセス許可設定にて、①のアカウントを紐づける
　　⇒具体的には、「委任されたアクセス許可」として、Files.ReadWrite.Allとoffline_accessを設定する
- ③②のアプリに対してOneDrive用APIを利用してPDF化を実現するプログラムを作成する
　　⇒WORDファイルアップロード＆PDF形式でダウンロード

##AzureAD上でWEBアプリ登録
①．プラットフォームの追加でWEBを選択して、
　　リダイレクトURLに https://testprj.localhost/ 等を入れる。
　　ログアウトURLは入力しなくて良い。
　　暗黙の付与 「アクセストークン」と「IDトークン」にチェックを入れる
　　サポートされているアカウントの種類
　　　⇒任意の組織ディレクトリ内のアカウント (任意の Azure AD ディレクトリ - マルチテナント) と個人の Microsoft アカウント (Skype、Xbox など)
　　詳細設定
　　　⇒全部「はい」にする

②．クライアント シークレットを作成する。
　　[テナントID],[クライアントID],[クライアントシークレット]をメモする。

③．APIのアクセス許可のところで、
　　「アクセス許可の追加」→「委任されたアクセス許可」
　　　　files.readwrite.allとoffline_accessを選択する。

## APIアクセス許可の委任
　ブラウザを開いて以下のURLにアクセス
　テナントID、クライアントIDを指定する必要。

    https://login.microsoftonline.com/[テナントID]/oauth2/v2.0/authorize 	　?client_id=[クライアントID] 	　&scope=Files.ReadWrite.All+offline_access 	　&response_type=token 	　&redirect_uri=https%3A%2F%2Ftestprj.localhost%2F 

##GraphAPIを利用するプログラムを作成する（PHP）
①アクセストークン取得

    $auth_url = 'https://login.microsoftonline.com/[テナントID]/oauth2/v2.0/token';
    $options = [
      'form_params' => [
        'client_id' => [クライアントID],
        'client_secret' => [クライアントシークレット],
        'scope' => 'Files.ReadWrite.All offline_access',
        'username' => [Office365アカウント],
        'password' => [Office365パスワード],
        'grant_type' => 'password'
      ]
    ];
    $guzzle = new Client();
    $response = $guzzle->post($auth_url, $options);
    $response_body = json_decode((string) $response->getBody(), true);
    $access_token = $response_body['access_token'];

②Wordファイルアップロード

    $docfile = 'test.docx';
    $doc_path = '/test/' . $docfile;
    $file_url = sprintf('https://graph.microsoft.com/v1.0/me/drive/special/approot:/word/%s:/content', $docfile);

    $options = [
      'headers' => [
        'Authorization' => 'Bearer ' . $access_token,
        'Content-Type' => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
      ],
      'body' => file_get_contents($doc_path)
    ];
    $guzzle_upload = new Client();
    $response = $guzzle_upload->put($file_url, $options);
    $response_body = json_decode((string) $response->getBody(), true);

③Pdfファイルダウンロード

    $docfile = 'test.docx';
    $pdf_file = '/test/test.pdf';
    $file_url = sprintf('https://graph.microsoft.com/v1.0/me/drive/special/approot:/word/%s:/content', $docfile);
    $pdf_url = $file_url . '?format=pdf';
    $options = [
      'headers' => [
        'Authorization' => 'Bearer ' . $access_token,
      ]
    ];
    $guzzle_upload = new Client();
    $response = $guzzle_download->get($pdf_url, $options);
    if ($response->hasHeader('Location')) {
      $response = $client->get($new_pdf_url);
    }
    $data = $response->getBody()->getContents();
    file_put_contents($pdf_file, $data);

##おわり
以上です。
ぜひぜひ皆さん試してみくださいねー！