GoogleDriveを使ってExcelからPDFへ変換する

# はじめに

ASTERIA Warpを使って「ExcelからPDFへ変換」を考えてみました。

まずExcelファイルをそのままPDFファイルへ変換するようなコンポーネントは現在用意されていません。
”変換（エクスポート）”ではないですがExcelPOIInputとPDFコンポーネントを使って読み込んだExcelファイルのデータをもとにPDFデータを作ることは思いつきます。
「ExcelのPDFエクスポート機能を使ったVBAプログラム」を自作してExeコンポーネントで実行 もありますが今回はGoogleDriveを使ってExcelからPDFヘ変換(エクスポート)する方法を考えてみました。

# 環境
 + OS: Windows10
 + Java:1.8.0.191
 + ASTERIA Warp : 1812

# フロー
GoogleDriveアダプターのGoogleDriveSQLCallを使います。
完成したフローはこんな感じです。

![gdrive01.png](https://qiita-image-store.s3.amazonaws.com/0/180292/9e00b2f5-18d6-74f9-3c85-ce67b5acea1a.png)

大まかには
GoogleDriveへアップロード → (アップロードしたIdの取得) → GoogleDriveからダウンロード → アップロードしたファイルの削除　といった感じです。

## ダウンロード - GoogleDriveSQLCall

![gdrive02.png](https://qiita-image-store.s3.amazonaws.com/0/180292/992ff334-f873-fb9a-aa2c-3d3cdc285e57.png)

まずは肝となるダウンロード部分のGoogleDriveSQLCallから。
ストアドプロシージャの`DownloadFile`を使いました。
記述方法はCData Software Inc.社のオンラインドキュメントを参考にしています。

「CData JDBC Driver for Google Drive 2018J」
[データモデル]-[ストアドプロシージャ]-[DownloadFile]
http://cdn.cdata.com/help/GGD/jdbc/pg_sp-downloadfile.htm


プロシージャのInput

|Name  |Type  |説明  |
|---|---|---|
|Id  |String  |ダウンロードするリソースのId  |
|FileFormat  |String  |ファイルの保存時に適用されるファイル形式 |
|LocalFile  |String  |保存先のローカルファイルパス  |
|Encoding  |String  |LocalFile インプットが空白の場合に使用されるエンコード  |
|Overwrite  |String  |保存先のファイルを上書きするかどうか  |

にあわせて以下のような設定にしました。

実行する処理：`ストアド実行(結果なし)`
SQL文：`{ call DownloadFile(?Id?,?FileFormat?,?LocalFile?,?Encoding?,?Overwrite?)}`

![gdrive03.png](https://qiita-image-store.s3.amazonaws.com/0/180292/8feae531-dd29-9aca-e4a6-a33f0a5f9c9a.png)

SQLパラメーター：

![gdrive04.png](https://qiita-image-store.s3.amazonaws.com/0/180292/9f37faff-b62b-6c98-3ab1-189b5c40da58.png)

「FileFormat」には`application/pdf`を指定してます。

「Id」はひとまずブラウザからURLに埋め込まれているファイルのIdを確認してセットしてもOKだと思います。

<img width="972" alt="gdrive05.png" src="https://qiita-image-store.s3.amazonaws.com/0/180292/7e38acc1-4355-1c6e-2fa3-d70d03d74130.png">


### エクスポートの制限

ExcelをGoogleDriveにアップロードしてGoogleDriveSQLCallでpdfに変換しようとすると

```
Export only supports Google Docs.
```

というエラーになりました。FileFormatを指定してエクスポートするときはGoogle Docsしかサポートされていないようです。ExcelではなくGoogle スプレッドシートではないとダメなようです。

### MIMETypeを確認する

ということでダウンロードするファイルタイプを確認してみます。
ブラウザーからはファイルの詳細の`種類`で確認できそうです。

<img width="864" alt="gdrive06.png" src="https://qiita-image-store.s3.amazonaws.com/0/180292/e853978e-fb40-a7e9-ed6e-65e9b5581957.png">


GoogleDriveGetではFilesテーブルの`MIMEType`というフィールドの値で確認できるみたいです。

<img width="701" alt="gdrive08.png" src="https://qiita-image-store.s3.amazonaws.com/0/180292/58513ef6-a15e-eb8c-52bb-7ce5b8cb0f65.png">


## アップロード - GoogleDrivePut

![gdrive09.png](https://qiita-image-store.s3.amazonaws.com/0/180292/0486ba4a-db53-fd45-6651-801db4bfa15d.png)


上記エクスポートの制限があるので「MIMEType」にGoogleDriveGetで確認できた値`application/vnd.google-apps.spreadsheet`をセットしてます。
「MIMEType」をセットしておくとアップロード時に適宜、ファイル形式を変換してくれるようです。

＜GoogleDrivePutの内容＞
![gdrive10.png](https://qiita-image-store.s3.amazonaws.com/0/180292/cd097c47-a78c-1daa-f579-fbc7aebfb0cd.png)


＜直前のマッパーの内容＞
![gdrive11.png](https://qiita-image-store.s3.amazonaws.com/0/180292/8086a870-504a-3872-970d-6a4fb6658681.png)

wordやpptファイルも変換対象にしてみたのでTable関数使って拡張子でセットする値を変えてます。
`ParentIds`はアップロード先のフォルダーIdをセットしてみてます。

<img width="830" alt="gdrive16.png" src="https://qiita-image-store.s3.amazonaws.com/0/180292/d1220bd1-8f83-90fd-15fa-a2af7f0c400e.png">

## ファイル削除 - GoogleDrivePut

![gdrive12.png](https://qiita-image-store.s3.amazonaws.com/0/180292/ba646284-ffc7-5cec-410c-de4636657979.png)

アップロードして・・pdfでエクスポートして・・最後にアップロードしたファイルの削除を入れてます。GoogleDrivePutで「実行する処理」を`Delete`としてます。

![gdrive13.png](https://qiita-image-store.s3.amazonaws.com/0/180292/63dac27c-28a5-a2fe-d88c-a344acf1eb6b.png)


## Id取得 - GoogleDriveGet

![gdrive14.png](https://qiita-image-store.s3.amazonaws.com/0/180292/8f721185-f374-9d8d-10e9-c4b130408f25.png)

アップロードしたファイルのIdを取得するために今回はアップロード後にもう一度GoogleDriveGetでデータ取得してます。ついでにMIMETypeとか確認するのにも使ってました。

＜GoogleDriveGetの内容＞
![gdrive15.png](https://qiita-image-store.s3.amazonaws.com/0/180292/ff22649b-14a6-56e3-e74d-c78ae6c3ba05.png)

＜SQL文＞

```SQL
SELECT A.Id,
       A.Name,
       A.MIMEType,
       A.ParentIds,
       B.Name 
  FROM GoogleDrive.Files A LEFT OUTER JOIN GoogleDrive.Folders B ON A.ParentIds = B.Id 
 WHERE A.Trashed = 'false'
   AND  A.Folder = 'false'
   AND  A.Name = ?FileName?
   AND  B.Id = ?ParentId?
```

# おわりに

FileFormatに何も指定しなければそのままのファイル形式でダウンロードできるようです。コネクションの作成手順などは割愛しましたが、GooleDriveSQLCallを使ったpdf変換含めGooleDriveGet、GoogleDrivePutの使い方、勘所などの参考にもなれば幸いです。

以上です。