2024年9月13日金曜日

PPTXjsおよびmammoth.jsを使ってPowerPointとWordのファイルをブラウザ上で表示する

PPTXjsmammoth.jsを使って、データベースのBLOBに保存されたMicrosoft PowerPoint(.pptx)とWord(.docx)をブラウザ上に表示してみます。

PPTXjsの場合は、読みやすく表示されるPowerPointもあれば、


背景色やフォントの色が適切に変換されず、まったく読めないスライドもあります。


日本語でのPPTXjsの利用実績を見つけることはできませんでした。これをそのままで使うのは難しいと思います。また、slideModeはdivs2slidesjsおよびrevealjsともに動作しませんでした。PPTXjsのデモのページでも動作していないため、APEXへの組み込み方に問題があるわけでも無さそうです。

とはいえ、PowerPointをブラウザ上でHTMLに変換して表示するJavaScriptライブラリは、ほとんど無いようです。どのようなものか、動作を確認してみる価値はあります。

mammoth.jsを使ったWordの変換では、大体は読める形式でHTMLに変換してくれる感じです。ただし、追加の実装をしないと埋め込まれた画像は表示されません。


以下より、APEXアプリケーションの作り方を紹介します。

PowerPointやWordのドキュメントをBLOBとして保存する表を作成します。

クイックSQLの以下のモデルから、表EBAJ_DOCV_DOCUMENTSを作成します。
# prefix: ebaj_docv
documents
    title vc80 /nn
    document file
レビューおよび実行をクリックします。


次のページでスクリプト名を入力し実行をクリックし、表示された確認画面で即時実行をクリックします。

EBAJ_DOCV_DOCUMENTSが作成されます。

続けて、アプリケーションの作成をクリックします。確認画面が表示されるので、再度アプリケーションの作成をクリックします。


アプリケーション作成ウィザードが起動します。表EBAJ_DOCV_DOCUMENTSソースとしたフォーム付き対話モード・レポートのページはあらかじめ追加されています。

ページの追加をクリックし、空白のページとしてWord ViewerPowerPoint Viewerさらにdownloadを追加します。

以上で、アプリケーションの作成を実行します。


アプリケーションが作成されたら、ファイルのアップロードとダウンロードの機能を調整します。ソースとなる表にBLOB列が含まれていると、アプリケーション作成ウィザードおよびページ作成ウィザードは、ファイルをBLOBにアップロードする機能と、BLOBをファイルとしてダウンロードする機能を自動的に作成してくれます。しかし、ファイル名列MIMEタイプ列は自動では設定されません。

ページ・デザイナで、ページ番号の対話モード・レポートのページを開きます。

DOCUMENTを選択し、BLOB属性MIMEタイプ列DOCUMENT_MIMETYPEファイル名列DOCUMENT_FILENAME最終更新列DOCUMENT_LASTUPD文字セット列DOCUMENT_CHARSETを設定します。

以上で変更を保存します。


ページ・デザイナで、ページ番号のフォームのページを開きます。

ページ・アイテムP3_DOCUMENTを選択し、ストレージMIMEタイプ列DOCUMENT_MIMETYPEファイル名列DOCUMENT_FILENAME文字セット列DOCUMENT_CHARSET、BLOB最終更新列DOCUMENT_LASTUPDを設定します。


以上で変更を保存します。

この時点でAPEXアプリケーションを実行し、確認に使用するPowerPointとWordのファイルをアップロードします。

表EBAJ_DOCV_DOCUMENTSの対話モード・レポートのページを開き、作成をクリックします。


ドロワーが開くので、適当にタイトルをつけてPowerPointやWordのファイルをアップロードします。


動作確認に使用するファイルを複数アップロードします。


続いて、JavaScriptのコード中よりURLを指定して、BLOBのデータを取り出せるようにします。

ページ・デザイナdownloadのページを開きます。

空白ページdownloadに、表EBAJ_DOCV_DOCUMENTSの主キーIDの値を渡して、BLOBをファイルとして返す機能を実装します。

ダウンロードするBLOBのIDを受け付けるページ・アイテムP6_IDを作成します。タイプ非表示セッション・ステートストレージリクエストごと(メモリーのみ)とします。


ページ・アイテムP6_IDに渡されたIDのBLOBを、ファイルとしてダウンロードするプロセスを作成します。識別タイプとしてAPEX 24.1で新設されたダウンロードを選択します。

設定ファイルの表示形式として添付を選択し、ソースSQL問合せとして、以下を記述します。

select document, document_filename from ebaj_docv_documents where id = :P6_ID


以上の設定を行うことにより、BLOBをファイルとして取得するURLをAPEX_PAGE.GET_URLにより生成できるようになりました。以下のように呼び出します。
declare
    l_url varchar2(400);
begin
    l_url := apex_page.get_url(
        p_application => :APP_ID
        ,p_page => 'download'
        ,p_items => 'P6_ID'
        ,p_values => :P4_ID -- assume select list on page 4
    );
    :P4_DOCUMENT_URL := l_url;
end;

最初にWord Viewerのページに、mammoth.jsを使ったWordビューワーを実装します。

ページ・デザイナWord Viewerのページを開きます。

ページ・プロパティHTMLヘッダーに、mammoth.jsをロードするためにimportmapを設定します。
<script type="importmap">
    {
        "imports": {
            "mammoth": "https://cdn.jsdelivr.net/npm/mammoth@1.8.0/+esm"
        }
    }
</script>

プレビューするドキュメントを選択するページ・アイテムとしてP4_IDを作成します。タイプ選択リストです。LOVタイプとしてSQL問合せSQL問合せとして以下を記述します。

select title d, id r from ebaj_docv_documents

追加値の表示オフNULL値の表示オンNULL表示値として- Select Document -を設定します。

以前の値を記憶するように、セッション・ステートストレージセッションごと(永続)とします。


ページを送信して選択したドキュメントをプレビューするボタンを作成します。

識別ボタン名VIEWラベルView動作アクションページの送信です。外観ホットオンテンプレート・オプションWidthStretchに設定します。


BLOBの取り出しに指定するURLを保持するページ・アイテムP4_DOCUMENT_URLを作成します。本来であればタイプ非表示とすべきですが、値を確認できるようにタイプテキスト・フィールドとします。セッション・ステートストレージセッションごと(永続)を選びます。


ボタンViewをクリックしたときに実行されるプロセスを作成します。

以下のPL/SQLコードを実行し、BLOBを取り出すURLをページ・アイテムP4_DOCUMENT_URLに設定します。
declare
    l_url varchar2(400);
begin
    l_url := apex_page.get_url(
        p_application => :APP_ID
        ,p_page => 'download'
        ,p_items => 'P6_ID'
        ,p_values => :P4_ID -- assume select list on page 4
    );
    :P4_DOCUMENT_URL := l_url;
end;
サーバー側の条件ボタン押下時VIEWです。


mammoth.jpを呼び出し、Wordドキュメントから生成したHTMLを表示します。

静的コンテンツのリージョンを作成し、以下のコードをソースHTMLコードに記述します。



以上で、Word Viewerは完成です。

アプリケーションは以下のGIF動画のように動作します。


次にPPTXjsを組み込んだPowerPoint Viewerを実装します。

GitHubのReleasesのページを開き、最新バージョンのv1.21.1(といっても2年以上前)のSource code (zip)をダウンロードします。PPTXjs-1.21.1.zipがダウンロードされます。

ダウンロードされたPPTXjs-1.21.1.zipを展開します。ディレクトリPPTXjs-1.21.1が作成され、その下にPowerPointをHTMLに変換するために必要なファイルが含まれます。

ディレクトリPPTXjs-1.21.1へ移動し、必要なファイルをpptxjs.zipにまとめます。

cd PPTXjs-1.21.1
zip -r pptxjs.zip js/d3.min.js js/dingbat.js js/divs2slides.js js/divs2slides.min.js js/filereader.js js/jszip.min.js js/nv.d3.min.js js/pptxjs.js js/pptxjs.min.js css/pptxjs.css css/nv.d3.min.css

% cd PPTXjs-1.21.1

 PPTXjs-1.21.1 % zip -r pptxjs.zip js/d3.min.js js/dingbat.js js/divs2slides.js js/divs2slides.min.js js/filereader.js js/jszip.min.js js/nv.d3.min.js js/pptxjs.js js/pptxjs.min.js css/pptxjs.css css/nv.d3.min.css

  adding: js/d3.min.js (deflated 65%)

  adding: js/dingbat.js (deflated 90%)

  adding: js/divs2slides.js (deflated 65%)

  adding: js/divs2slides.min.js (deflated 53%)

  adding: js/filereader.js (deflated 75%)

  adding: js/jszip.min.js (deflated 69%)

  adding: js/nv.d3.min.js (deflated 80%)

  adding: js/pptxjs.js (deflated 87%)

  adding: js/pptxjs.min.js (deflated 80%)

  adding: css/pptxjs.css (deflated 74%)

  adding: css/nv.d3.min.css (deflated 77%)

 PPTXjs-1.21.1 % 


共有コンポーネント静的アプリケーション・ファイルを開き、ファイルの作成をクリックします。


コンテンツに先ほど作成したpptxjs.zipを選択し、ファイルの解凍オンにします。

作成をクリックします。


ファイルが作成されたことを確認するため、静的アプリケーション・ファイルを開きます。


pptxjs.zipに固めたファイルが、静的アプリケーション・ファイルの一覧に含まれていれば準備は完了です。


ページ・デザイナPowerPoint Viewerのページを開きます。

ページ・アイテムP5_ID、ボタンVIEW、ページ・アイテムP5_DOCUMENT_URL、それと、プロセスGet Document URLは、Word Viewerと同様に作成します。ページ番号が5になっているため、その部分は変更します。

静的コンテンツのリージョンDocument ViewerHTMLコードは以下になります。

<div id="container" class="h600"></div>


ページ・プロパティJavaScriptファイルURLに以下を記述します。
#APP_FILES#js/jszip.min.js
#APP_FILES#js/filereader.js
#APP_FILES#js/d3.min.js
#APP_FILES#js/nv.d3.min.js
#APP_FILES#js/dingbat.js
#APP_FILES#js/pptxjs.min.js
#APP_FILES#js/divs2slides.min.js
CSSファイルURLに以下を記述します。
#APP_FILES#css/pptxjs.css
#APP_FILES#css/nv.d3.min.css
JavaScriptページ・ロード時に実行に以下を記述します。
$("#container").pptxToHtml({
    pptxFileUrl: apex.item("P5_DOCUMENT_URL").getValue(),
    slideMode: false,
    keyBoardShortCut: false
});

以上でPowerPoint Viewerは完成です。

アプリケーションは以下のGIF動画のように動作します。


今回の記事は以上です。

今回作成したAPEXアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/sample-document-viewer.zip

Oracle APEXのアプリケーション作成の参考になれば幸いです。