##はじめに
WordからPDFに変換する要件があり、様々技術検証した結果、OneDriveを利用して変換するのが一番変換精度が高いことが判明しました。
##まず結果から
docxファイル
図形も含めって完璧に変換されます。
##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);
##おわり
以上です。
ぜひぜひ皆さん試してみくださいねー!