1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-04-20

##はじめに
WordからPDFに変換する要件があり、様々技術検証した結果、OneDriveを利用して変換するのが一番変換精度が高いことが判明しました。
##まず結果から
docxファイル
image.png

pdfファイル
image.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);

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

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?