見出し画像

Firebase Cloud Functions で PDF を画像化しようとして Cloud Run にたどり着いた 前編

概要

Firebase Cloud Functions でなんとか PDF を画像に変換できないか
色々試したことと、最終的に Cloud Run を利用した話です。

長くなってしまったので前後編で2つに分けました。
前編では Cloud Run に行き着くまでに試したことを紹介しています。

PDF を画像にしたい

PDF というファイルは便利で、サービス上で PDF を扱うことは結構あると思います。

Firebase を使っている場合 Storage に PDF を保存、アクセス可能な URL を生成してクライアントから読み込んだりするのがメジャーな使い方な気がします。

そんな PDF ですが、Firebase Cloud Functions 上のある処理の過程で PDF を画像にしたいというケースに遭遇しました。

以下は試した結果ダメだったものですが、同じ過ちを繰り返さないように残しておきます。

試したこと: pdf2pic を使用する

TypeScript でコードを書いていたので、とりあえず PDF を画像に変換できるパッケージはないか探してみました。

すると pdf2pic というパッケージがヒットして、良さげだったので使ってみました。

型定義ファイルも入っているし最高じゃん... とか思って使っていましたが、エラーが出て使うことができませんでした。

なぜ使えなかったのか
README.md にも書いてありますが、graphicsmagick と ghostscript がインストールされていないと使えません。( ghostscript はもしかしたらインストールされているかも )
インストールしようにも Firebase Cloud Functions ではランタイム環境をいじることはできないので断念しました。

試したこと: imagemagick を使用する

Firebase Cloud Functions には imagemagick がインストールされています。
これを使えば PDF を画像にすることもできるのでは?と調べてみると
convert コマンドを使えばいけそうでした。

convert test.pdf test.png

このコマンドを exec に渡して実行すればいけるでしょ... と思っていましたが、エラーが出てダメでした。

なぜエラーが出たのか
imagemagick が依存している ghostscript に脆弱性が発見され、その影響でエラーになってしまうみたいです。
一応 imagemagick の policy.xml を編集して、制限を解除する方法とかがあるみたいですが、Firebase Cloud Functions ではできない気がしたので断念しました。

試したこと: puppeteer でスクショをとる

PDF の全ページを画像にしたかったわけではなく
最悪最初のページだけ画像にできればよかったので、何かないかと探していたところ puppeteer を発見しました。

puppeteer は Headless Chrome を使う際に使用するパッケージですが
これを使ってブラウザで PDF を開き、スクリーンショットを取ればいけるのでは?と思っていましたが、そもそも PDF を開ませんでした。

なぜ開なかったのか
puppeteer がファイルのダウンロードに対応していないのと
PDF のビューワーが入ってないのが原因っぽいです。

試したこと: 外部APIを使用する

最終手段ということで既存の PDF を画像に変換するサービスがないか調べてみました。

いくつか見つかりましたが、
ConvertAPI というサービスがいろんな拡張子に対応していて良さげでした。

一度試しに PDF を PNG の画像に変換してみたところ
画質も良くて申し分ないくらいでしたが、結局採用することはできませんでした。

なぜ採用できなかったのか
無料だと1500秒までしか使うことができなかったからです。
大体一回の処理に5秒くらいかかっていたと思います。

最後に

以上が試したことになります。
後編ではこの問題を Cloud Run を使って、どのように解決したのかを書こうと思っています。

この記事が気に入ったらサポートをしてみませんか?