概要
2020年春のElectron ver9より、標準で組み込まれる形で、Chromeと同じ「PDFium」プラグインを使ったPDF操作(表示、印刷等)ができるようになりました。リリース直後は印刷しようとしたらアプリごと落ちる等、「これで実装したとアピールするのはちょっと……😵」という感じでしたが、現在は安定して使えています。
問題
さて使ってみたはいいものの、Electronには戻るボタンが無いという問題に直面するかと思います。
例えばaタグ等で直接PDFファイルへ飛ばすと、普通のブラウザと同じようにウィンドウ内全体にPDFiumによるPDFが表示される……のはいいんですが、元のページに戻れません。ChromiumもPDFiumも悪くなく、Electron固有の事情による相性問題となるため、状況がすぐに改善されるとは考えづらく、自前で解決する必要があります。
さて、色々検討しましたが一番簡単な対処法は
- ブラウザのページ遷移イベント(色々調べましたが"will-navigate"が妥当?)にメインプロセスからフック
- 遷移先がPDFファイルならブラウザのページ遷移イベントを停止
- 別画面を生成してそちらで表示 or PDFファイルに関連付けられているソフトに丸投げする
という形になるかと思います。「他所のソフトに丸投げするんだったら、Electronに実装された意味ないじゃん😞」というツッコミポイントはありますが、これが現実です。
以下、上記プログラムを組み込んだBrowserWindow生成周りのコードになります。
//メインプロセス
const window = 【メイン用BrowserWindow生成ルーチン】
const showPdf = (event: Electron.Event, path: string): void => {
if (path.endsWith('.pdf') === false) { return }
event.preventDefault()
//PDF用ウィンドウを表示する
const window = 【PDF用BrowserWindow生成ルーチン】
window.loadURL(path)
// PDFに紐づけられたソフトを起動したい場合はこちら
// shell.openPath(path)
}
window.webContents.on('will-navigate', showPdf)