Autonomous Database：S3バケットにある複数のPDFファイルをテキストに変換してOCI Object Storageに格納する

# はじめに

AWS S3内に貯まっているPDFファイルをAutonomous DatabaseのSELECT AI RAGで使用するためにテキスト化したいとのお話があったので、AWS S3のバケット内にある複数のPDFファイルを一括でテキストに変換し、変換後のテキストファイルをOCI Object Storageに保存するPL/SQLプロシージャを作成してみました。

※こちらの内容はあくまで個人が検証した内容であり、他の環境で正しく動作することを保証するものではありません。また、こちらの記事を元にしたOracleサポートへの問い合わせはご遠慮ください。

# 1. 事前準備
OCI Object Storage、AWS S3にアクセスするためのクレデンシャルを予め作成しておきます。
今回は、OCI Object StorageへのアクセスにはAutonomous Databaseのリソース・プリンシパルを使用し、AWS S3へのアクセスには、アクセスキーとシークレットアクセスキーを使用してDBMS_CLOUD.CREATE_CREDENTIALプロシージャで作成したクレデンシャルS3_CREDを使用しました。

# 2. PL/SQLプロシージャの作成
今回は、以下の4つのパラメータを渡して実行すると、ソースとなるPDFファイルが格納されているS3バケット内にあるPDFファイルをテキストに変換して、OCI Object Storageに格納するPL/SQLプロシージャ「s3_pdf_to_ocios_txt」を作成しました。
各パラメータは以下の通りです。
**・aws_region：ソースとなるPDFファイルが格納されているS3バケットがあるAWSリージョンの識別子
・aws_bucket：ソースとなるPDFファイルが格納されているS3バケット名
・oci_region：テキストに変換されたファイルを格納するObject StorageバケットがあるOCIリージョンの識別子
・oci_bucket：テキストに変換されたファイルを格納するObject Storageバケット名**

こちらのプロシージャでは、ソースとなるS3バケット内の拡張子が「.pdf」のファイルを変換対象としてテキストに変換して、ターゲットとなるObject Storageバケット内に拡張子を「.txt」として保存します。

```sql:s3_pdf_to_ocios_txtプロシージャ
CREATE OR REPLACE PROCEDURE s3_pdf_to_ocios_txt (aws_region IN VARCHAR2, aws_bucket IN VARCHAR2, oci_region IN VARCHAR2, oci_bucket IN VARCHAR2)
IS
    resp_get_namespace   DBMS_CLOUD_OCI_OBS_OBJECT_STORAGE_GET_NAMESPACE_RESPONSE_T;
    adb_compartment_ocid VARCHAR2(100);
    namespace            VARCHAR2(100);
    os_uri_prefix        VARCHAR2(256);
	s3_uri_prefix        VARCHAR2(256);
    my_lob_data          CLOB;

BEGIN
    resp_get_namespace := DBMS_CLOUD_OCI_OBS_OBJECT_STORAGE.GET_NAMESPACE(
                              region          => oci_region,
                              credential_name => 'OCI$RESOURCE_PRINCIPAL'
	                      );
    namespace := REPLACE(resp_get_namespace.response_body, '"', '');

	s3_uri_prefix := 'https://'||aws_bucket||'.s3.'||aws_region||'.amazonaws.com/';
	os_uri_prefix := 'https://objectstorage.'||oci_region||'.oraclecloud.com/n/'||namespace||'/b/'||oci_bucket||'/o/';

    FOR rec IN (
        SELECT object_name FROM DBMS_CLOUD.LIST_OBJECTS('S3_CRED', s3_uri_prefix)
    )
    LOOP
        SELECT DBMS_VECTOR_CHAIN.UTL_TO_TEXT(
                   DBMS_CLOUD.GET_OBJECT(
                       credential_name => 'S3_CRED',
                       object_uri      => s3_uri_prefix||rec.object_name
                   ),
                   JSON('{
                             "plaintext": "TRUE",
                             "charset"  : "UTF8" 
                         }'
                   )
	           ) INTO my_lob_data;

        DBMS_CLOUD.PUT_OBJECT(
            credential_name => 'OCI$RESOURCE_PRINCIPAL',
            object_uri      => os_uri_prefix||REPLACE(rec.object_name,'.pdf','.txt'),
            contents        => apex_util.clob_to_blob(my_lob_data,'UTF8')
        ); 
    END LOOP;
END;
/
```

# 3. 動作確認（PL/SQLプロシージャの実行）
PL/SQLプロシージャs3_pdf_to_ocios_txtが作成できたので、実行してみます。

AWS 東京リージョン（ap-northeast-1）あるS3バケットpdf-bucket-s3には、2つのPDFファイル（001_012.pdf、rocket.pdf）が格納されています。
![スクリーンショット 2024-12-23 17.08.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/069f096b-9582-9c42-9d74-979ca7a55410.png)
なお、rocket.pdfは以下のようになっており、架空のロケットエンジンの説明が含まれています。

また、OCI東京リージョン（ap-tokyo-1）にあるObject Storageバケットには、まだファイルがありません。
![スクリーンショット 2024-12-23 17.08.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/c1f27fc6-7942-e1ed-0621-cdb59033e3fc.png)

この状態で、パラメータとして
aws_region：ap-northeast-1
aws_bucket：pdf-bucket-s3
oci_region：ap-tokyo-1
oci_bucket：txt-bucket-oci
を指定して、PL/SQLプロシージャs3_pdf_to_ocios_txtを実行してみます。

```sql:
SQL> BEGIN
  2      s3_pdf_to_ocios_txt(
  3          aws_region => 'ap-northeast-1',
  4          aws_bucket => 'pdf-bucket-s3',
  5          oci_region => 'ap-tokyo-1',
  6          oci_bucket => 'txt-bucket-oci'
  7      );
  8  END;
  9  /

PL/SQL procedure successfully completed.

SQL>
```
PL/SQLプロシージャs3_pdf_to_ocios_txtが正常に実行されました。

Object Storageバケットtxt-bucket-ociの内容を確認してみます。

![スクリーンショット 2024-12-23 17.20.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/ad3facbf-45dc-a1e2-7f54-b098da749434.png)

001_012.txt、rocket.txtの2つのテキストファイルが作成されています。

rocket.txtをダウンロードして、内容を確認してみます。

![スクリーンショット 2024-12-23 17.25.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784824/db540ed0-f84e-7268-4350-3be5461ff73e.png)

S3バケットに格納されていたrocket.pdfの内容がテキスト化されて、rocket.txtとして保存されていることが確認できました。

あとはこちらのバケットtxt-bucket-ociをソースとしてDBMS_CLOUD_AI.CREATE_VECTOR_INDEXプロシージャを実行することで、元々S3バケット内にPDFファイルとして格納されていた情報をSELECT AI RAGの対象として使用することができるようになります。

めでたし、めでたし。