WebアプリケーションでPDFを作成するより良い方法を見つけました!(外注納品書)
Posted date at 2024-11-24PDFの生成について、こちらの記事で紹介し、制服アプリに導入したReactPDFよりも良い方法がありましたので、共有いたします。サンプルアプリも掲載しています。
ChatGPTo1-previewによるとこちらの方法はWeb開発会社でも採用されているようです。
🚀2024.11.26更新(外注納品書対応)
外注納品書に記事のライブラリを導入し開発を行いましたので、記録を残します。
〇デモンストレーション
〇追加要望の対応(製番・全件の出力切替)
〇仕様
〇UI/UX(フロントエンド)
・月、社員番号の変更により、日報データを取得し、出力用データに変換する。
・月の初期値は、表示期間のFrom(日付)が属する月とする。
・社員番号の初期値は選択社員番号とする。
・社員番号未指定の場合はPDF作成、CSV出力ボタンが押せないようにする。
・PDFを作成したら、自動で別タブで開くようにする。
・PDFを作成したら、画面上にリンクを生成してダウンロードできるようにする。
〇アウトプット(外注納品書PDF・作業明細CSV)
・制作番号毎で改ページする(外注納品書PDF)
・出勤、退勤時刻は日報の作業開始時刻、作業終了時刻とする
・定時は8時間とする
・合計作業時間から定時を引いた時間を残業時間とする
・休日は、日曜祝日とする
・休日の場合は定時は0とし、合計作業時間を残業時間とする
〇説明資料
🚀これまで試した実装との比較
今回Puppeteerというライブラリを使用しました。Node.jsから実行でき、バックエンドでPDFの生成ができます。一番の利点としては、html+CSSで帳票レイアウトが組めるという点です。
〇これまで試した実装との比較
1.スプレッドシートで帳票を作成し、フロントエンドから呼びだす。
良い点:スプレッドシートで帳票が作成できる。
悪い点:動作が遅すぎる(ユーザがレスポンスが欲しい(結果のPDFをすぐ見たい))場合に使えない。
2.ReactPDFを使用する。
良い点:PDFをデータベースに保存しなければフロントエンドのみの開発で済む。
悪い点:パフォーマンスがユーザの環境に依存する。html+CSSとは少し違う構文である。
3.Puppeteerを使用する。
良い点:html+CSSで帳票レイアウトが作成できる。
悪い点:フルスタック開発になる。デプロイ先に実行環境用のモジュールをインストールする必要がある。
🚀サンプルアプリ
ボタンクリックによりPDFが生成され、別タブに表示されます。
🚀Puppeteerとは
Puppeteer(パペティア)は、Node.js環境で動作するライブラリで、Googleが開発したもので、ヘッドレスブラウザ(主にChromium)を制御するためのツールです。簡単に言えば、コードを使ってブラウザを自動操作するためのライブラリです。スクレイピングやアプリケーションのテストに使用されます。 PDFの生成においては、ヘッドレスブラウザ上にhtmlをレンダリングし、PDF化するということをしています。これにより、html+CSSのスタイルをそのままPDF化することができます。
🚀ハマったこと
CloudRunへのデプロイがうまくいかず苦労しました。CloudRun上でchromiumと日本語フォント(今回はGoogleフォントのNotsansJP)を使用するには、CloudRun上にパッケージとフォントのインストールが必要で、アプリの実装よりも時間がかかってしまいました。2024.11.24時点で動作している設定を記載します。
FROM node:18-slim # 必要なシステムパッケージと日本語フォントをインストール RUN apt-get update && \ apt-get install -y --no-install-recommends \ libgtk-3-dev \ libnotify-dev \ libgconf-2-4 \ libnss3 \ libxss1 \ libasound2 \ fonts-ipafont-gothic \ fonts-ipafont-mincho \ fonts-noto-cjk \ fonts-noto-cjk-extra \ fonts-noto \ fonts-freefont-ttf \ && apt-get clean && rm -rf /var/lib/apt/lists/* # 作業ディレクトリを作成 WORKDIR /usr/src/app # アプリケーションの依存関係をコピー COPY package*.json ./ # 依存関係をインストール RUN npm install --only=production # アプリケーションコードをコピー COPY . . # コンテナ起動時に実行されるコマンド CMD [ "npm", "start" ]
🚀まとめ
今回、ようやくバックエンド(サーバー側)でPDFを生成するということをしました。現場日報の外注納品書作成対応から導入します。
←ホームに戻る