Ccmmutty logo
Commutty IT
7 min read

君に決めた!Laravel Snappyの代替PDFライブラリ

https://cdn.magicode.io/media/notebox/blob_q4C36Dy
明けましておめでとうございます。
今年もよろしくお願いいたします。
エンジニアとして全然レベルアップできていない。というかレベルアップの仕方がわからず迷走中ですが 今年1年は今の会社に勤めて3年目を迎えるというのもあるので、少しでもスキルアップできるようなそんな1年にしたいなと思っています。( ´∀` ) (抱負というよりは目標に近いですかね。)
ということでPDFライブラリ & サービス調査が進展しましたので、それについて書いていこうかなと思います。

君に決めた!

と、いうことでどのPDFライブラリ & サービスを使うかについて個人的にも決まり会社からもゴーサインが出たということで何に決めたかをお伝えしつつ経緯や長所短所、注意点などを簡単に書けたらいいなと思います。
とりあえず何を使うかというところですが、結論から言うとDocRaptorを利用することにしました。
では、これに決めた理由やそもそもこのサービスはなにか?と言うことを以降で説明しますね。

DocRaptorに決めた経緯について

このサービスの説明をする前に簡単にここまでの経緯をまとめさせていただきます。
ことの発端はlaravel snappyに使われている技術であるwkhtmltopdfがGithubプロジェクトにて既にpublic archiveになってしまったことで、今後snappyの継続的なメンテナンスが保証されなくなる可能性が高くなったことが原因でした。
初めは、無料で行うことはできないか?ということで以下のようなサービスたちを検討・検証を進めていました。
  • mPDF
  • domPDF
  • Headless Chrome(Browsershot & Puppeteer)
  • Seleniumコンテナ環境
  • TCPDF
  • FPDI
しかし、mPDFやdomPDFのように導入は簡単だけどWebページ全体のデザインを全て反映することができなかったり、日本語化するのに手間がかかったりなど問題もあり、Headless系は環境構築はできても実際利用することができなかったりと無料枠のほとんどが会社のサービスには利用することができませんでした。
そこで、無料ライブラリだけで運用するのは諦めてなるべくローコストできるような有料サービスを利用することを検討することにしました。
そして、その中で候補に上がったのは以下の3つでした。
  • PDFShift
  • DocRaptor
  • API2PDF
前回の記事では個人的にPDFShiftがサイトを見る限り好印象で検証してみよう!みたいな感じだったんですが、今回実際にこの3つのサービスを検証していき、結果DocRaptorにしたという運びになります。
一旦振り返りが長くなってしまったのですが...
ではなぜ?PDFShiftではなくDocRaptorになったのかということですが、 ざっくりとまとめると
  1. 導入がとても簡単
  2. メジャーで候補に挙げた有料サービスより利用者が多い
  3. とにかくPDF生成が簡単で自社のWebサービスのデザイン通りに生成できる。
  4. JSなども利用できるためtwemojiも利用できる。
  5. 日本語が綺麗に見える(確か明朝体だったはずです...)
  6. ドキュメントが充実している。
と言ったところでしょうか
正直PDFShiftも導入自体は簡単で生成はさっとでき、料金もDocRaptorより安い印象がありました。
しかし、如何せん日本語が文字化けっぽく見えてしまい読みづらかったのもあってDocRaptorにしたという感じです。
次はそのDocRaptorについてもう少し掘り下げていきたいと思います。

DocRaptorについて

上の段落でもお伝えした通り現在はDocRaptorを利用してPDF生成機能の実装を行なっています。その中での使用感や注意点などそう言ったことを語っていけたらなと思います。
一度改めてDocRaptorの公式サイトを貼り付けておきますので先に試したい方は是非利用してみてください。
DocRaptor公式
では説明をしていきます。 DocRaptor自体は無料でアカウント登録することができます。 ただ、DocRaptorの欠点の一つですが、とにかくぱっと見で料金表が見当たらない & 見づらいというのがあります。(ちなみに料金の説明表はPricing & Free Signupのところに記載されています。)
Pricing & Free Signup
これを見てみるとFreeというのがありますのでそれを選んで登録すればOKです! Signup時にクレジットカードなどの入力を要求されることはありませんのでとりあえずアカウントを作ってみて、Freeプランの枠内で利用してみるというのがいいかもしれませんね!
ただし、Freeプランだと月5件までしか生成できませんので注意が必要です。 ですが、テストモードなどもありますのでテストで行う際はこの枠を使わずに検証ができます。また、次の月になれば枠が復活するのでそこで作ると言う感じですね。
ただ、ここでも注意点です! 透かし(Watermark)に関してはテストモードで確認することができません。 テストモードの場合はDocRaptorの透かしによってオーバーライド(上書き)されてしまいます。なので、検証をするときは一度テストモードのオプションをfalseにしてから確認するようにしてください。 ただ、その場合通常の生成になりますのでもちろん月の枠を利用してしまうので気を付けてください。
ただ、これらについてもドキュメントに記載されていますし、テストモードのtrue/falseも簡単にオプションで指定できたりするので直接ドキュメントを確認していただけたらと思います。
また、各言語に対応した導入方法なども書いてあり、私はlaravel sailを利用しておりますのでphpのやり方を見ながら導入することができました。 以下導入のドキュメントを貼っておくので自分のプロジェクトで利用されている言語がある場合は導入を検討してみてはいかがでしょうか?(ᓀ‸ᓂ)
ドキュメント
現時点でこのサービスを利用していてよかったなぁというところはCSSやHTMLで結構自由にデザインを設定できたり、透かしの導入が簡単なことですかね。
特に透かしに関してはページが複数あってその各ページのコンテンツの背景に透かしを入れるのは本当に難しくどのサービスでもできませんでした。(snappyでもできないです。)
ですが、それが本当に簡単にできるのがとても好印象でした。それについてもドキュメントがあるので是非確認してみてください。
また、フッターやヘッダーにページ数を導入したりなどなど結構PDFをカスタマイズできるのが大きいですね!また、これらの確認は透かしと違ってテストモードで確認ができますので、是非活用してみてくださいね^^

ただし完璧ではない...

あまりメリットというか伝えられなかった感はありますが、最後にいくつか気になるなぁーというところを書いておきますね。
これらを含めて自身のプロジェクトに導入するかどうかを検討してみてください。

料金が高い?

料金表を見ていただけたら分かると思いますが、なかなか料金はかかってしまう印象です。
例えば、MaxプランからBronzeプランであれば
  • Maxプラン
    • 月5,000件
    • 月$149
  • Bronzeプラン
    • 月15,000件
    • 月$399
となっており一気に跳ね上がります。
ただ、月の枠を使い切ったからと言って生成が止まったりするわけではありませんので、切れたからすぐに上のプランにしなきゃとは思わなくても大丈夫です。
ただし、オーバーした場合1件につき料金が追加発生してくるのでそこは確認しておきましょうプランが上がるごとに料金は安くなっていってたはずなので要確認です。
ですので、オーバーした時の従量課金の方がプランを上に変更するよりも安く済む場合もあると思うのでお財布と相談という感じになるかと思います。(また勝手にプランが変わったりすると言ったことはありません。)
そのため、どれぐらいPDFが生成されるのか?というのはチェックした方がいいと思います。また、先ほども言った通り透かしに関してはテストモードでは確認できません。 そのため枠を使うことになりますので、そこも考慮しておくといいかなと思います。

画像が見切れる

次に画像が見切れてしまうということです。snappyを利用している方なら分かると思いますが、snappyの場合画像が次のページに差し掛かったときは画像も分割されて次のページで表示されるようになっています。 しかし、DocRaptorは分割されないため下の方が見えなくなってしまったりすると言うことがあります。(実際それで今解決策を探しています。)
とりあえず、対策としては、画像のサイズを小さくするなどを対応しています。これで普通にみることはできますので、デザイン変更で対応できるよという場合はそこまで気にしなくてもいいかもしれません。

まとめ

DocRaptorは料金が高めではあるものの、PDFが1,000ページとかなるものでも一様生成できます。(ただし!処理できるリクエストや容量などもあったり、同期処理と非同期によっても設定されているタイムアウトの時間が異なりますのでその点は注意してください。)
なので基本的な機能に対して耐性が高いのでは?思います。
あーあとこれは言い忘れてたんですが... どのPDFサービスにも言える話ですがCSSなどのパスはローカルに置いていたらエラーになってしまうので必ずリモートに置くか、もしそれが嫌な場合はトンネル化するようなサービスを利用することにしてください。
ドキュメント:"File System Access is Not Allowed" Error Message https://docraptor.com/documentation/article/2154806-file-system-access-is-not-allowed-error-message
まぁこういったことはありますがそれでも今までに比べれば格段とPDFが作りやすくなると思うので是非検討してみてください。

おわり

あらためてここまで読んでくださりありがとうございます。
正直このタスクに終わりが見えてきていることに少しホッとしています。 (ほんと透かし対応とか別件でやってたけどあまりにできずに、PDFとは何か?みたいなところまで行き着いていたのでほんとよかったです...PostScriptらしいですよ...(≖ω≖))
Rustなどの勉強などもしていきたいのでそういったライブラリとかPDFを生成できるようなライブラリ作りもしてみようかなぁと思っています。
次回はちょっとコードというか実装部分などのお話を簡単にできたらいいなぁーと思っていますのでもしよかったらまた覗いてみてください。
この記事が少しでも検証などのお役にたれればいいなと思いつつ、間違ったらとか大丈夫かなぁと思いつつもたくさんの失敗をするつもりでいろんな記事を書いていけたらいいなぁと思います。
それでは。

Discussion

コメントにはログインが必要です。