コンテンツにスキップ

月案の印刷・Excel出力

2026-09-27。ユーザーが印刷・Excel出力の操作見本を「よさそう」と確認したため本実装した。 状態:実装・検証済み。ユーザーの依頼により2026-09-27 13:14 JSTに本番へ反映した。 配備結果と最新の稼働版は 本番反映記録 を参照。 13:36 JSTの追加更新で0〜5歳全様式に「主任印」を設けた。 13:54 JSTに画面へ古いJSが届く配信キャッシュの不具合を修正した。 最新の稼働版は 配信キャッシュの修正記録 を参照。 対象は印刷・Excel出力。検索の表記ゆれと園内共有文例の見本は今回の変更に混ぜていない。

実装した動作

  • 編集画面の「印刷用PDF」「Excel出力」と、保存済み文書の「印刷」に対応。
  • 0〜2歳の個人別、3〜5歳の集団様式をA4横へ出力。全園児・全項目と長文の続きページを含める。
  • 印刷確認画面とPDFは共通の固定グリッドを使う。確認画面はSVGで描画し、同梱のNoto Sans JPを使う。 PDFには日本語フォントを埋め込む。操作欄・候補・履歴は帳票に含めない。
  • Excelは1ページ1シートの編集可能なセル。罫線・セル結合・A4横・印刷範囲を設定。 表示用改行を含め、先頭の = やURLも数式・リンクに変換しない。
  • 編集画面は出力ボタンを押した時点の入力、閲覧画面は保存済みの本文・名簿を使う。 出力ではDBの保存・承認・版更新をしない。出力ファイルや一時URL用キャッシュをサーバーに残さない。
  • 園児の氏名・生年月日・名簿・クラス名はサーバーで解決する。 未保存の本文を送信できるのは編集可能な職員だけ。対象文書の状態と版も確認する。
  • 出力にはログイン・園・クラスの権限とCSRF検証を適用。園やクラスが異なる出力、存在しない園児・欄を拒否する。
  • JSON APIは /plans/monthly-library/export、画面の出力は /plans/monthly-library/export-file へのPOST。 ネイティブHTMLフォームによる応答で印刷画面とファイルを返し、ブラウザー内のblob URLに依存しない。 失敗時は出力側のタブに理由を表示し、元の編集内容を保持する。
  • 1回300人・本文合計50万文字・100ページ以内、プロセス内同時生成1件に制限する。 生成中の追加要求は429で再試行を案内する。ブラウザーの出力要求後は入力を続けられる。
  • PDFのダウンロード時は、保持した本文のスナップショットで再生成し、権限・文書の版を再確認する。 他の職員が保存・承認した場合は再出力を案内する。最新の名簿が変わった場合はその名簿を使う。

検証

  • 出力の12テストが成功。未保存本文、別園児の本文、保存済み名簿、閲覧専用職員、 別園・別クラス・CSRF・不正な欄・版競合・承認待ち・生成失敗・同時出力を確認。
  • 0〜5歳の通常と長文、20人、園児なしについて、全本文の連結一致、枠の重なり、用紙内の収まりを確認。 通常の個人別6人と集団は各1ページ、大量の長文例は10ページ。上限超過時はエラー。
  • 月案・AI・バックアップ復元・見本データの既存35テストも成功。合計47テスト。 既存の2テストはWindowsの既定一時ディレクトリへのアクセス制限で初回のセットアップが失敗し、 ワークスペース内の新しい一時ディレクトリを指定して成功した。
  • RuffとJavaScript構文チェックが成功。
  • PDFとExcelの個人別・集団サンプルを描画し、罫線・折り返し・全文表示を目視した。
  • ブラウザーではHTTP印刷確認画面、フォントの読み込み、PDFとExcelの実ファイル取得・内容を確認。
  • 検証データはすべて架空。出力前後のDBダンプと原文コーパスのバイト不変を確認した。

依存と配備時の留意点

  • Python依存にReportLab 4.4.9とXlsxWriter 3.2.9を追加。
  • Noto Sans JPの静的Regular TTF(約5.8MB)とSIL OFLライセンスを static/fonts/ に同梱。 入手先・変換方法・SHA256は同ディレクトリのREADMEに記載。Windows専用フォントやPopplerは不要。
  • PDF/印刷は同梱フォント、ExcelはMeiryoを指定する。Excel側で文章を増やした後は行高・改ページの再調整が必要な場合がある。
  • 実機Linuxで112テスト、PDF・Excel生成、既存機能・バックアップ互換性を確認し、本番へ配備した。 実プリンターとデスクトップExcelでの最終確認は未実施。
  • 実装基準の月案サービス・ルーター・JS・CSS・requirementsは本番579e683と一致することを確認してから編集した。 開発ツリー全体を本番へ置き換えず、最新配備記録と本番差分を照合して必要なファイル・依存だけを反映すること。 既存の本番用作業コピーと配備済みイメージは変更していない。

再確認

venv/Scripts/python.exe -m pytest test_monthly_export.py -q -p no:cacheprovider
$env:MONTHLY_FIXTURE_PORT = '8900'
venv/Scripts/python.exe -m tools.monthly_library_browser_fixture

本実装の架空データ検証画面:http://127.0.0.1:8900/plans/monthly-library?document_id=3。 生成物・描画の証跡は .local-dev/monthly-export-implementation-20260927/。