Sign inSign up

earce9000/document-manager-pdf-converter

By earce9000

•Updated about 13 hours ago

HTML / draw.io to PDF converter for Document Manager (headless Chromium, no network access).

Image
Content management system
0

398

earce9000/document-manager-pdf-converter repository overview

⁠Document Manager PDF Converter

HTML-to-PDF conversion service for Document Manager⁠. Renders HTML / Markdown / MHTML documents with headless Chromium into a single long PDF page that looks like the on-screen preview, and draw.io diagrams into one PDF page per diagram page. Used for "Download as PDF" and for exporting documents to Miro boards. Document scripts are never executed and nothing but the document itself is loaded. Documentation below is in Japanese.

⁠これは何か

Document Manager⁠ の「PDFでダウンロード」のための 変換サービスです。HTML・Markdown・MHTML の文書を、プレビューで見たままの1枚の長いPDFにします。 draw.io の図(.drawio)は、図の1ページを紙1枚にしたPDFにします。 HTML をメールに添付すると相手の環境では文字の羅列として出てしまうことがあるため、人に渡すための形として 用意しています。

Miro への書き出しでも使います。 Document Manager から Miro のボードへ資料を書き出すとき、 HTML・Markdown・MHTML・draw.io の文書は、このサービスで PDF にしてから出します。 このサービスが無い環境では、それらの文書は Miro に書き出せません(PDF・画像はそのまま出せます。 Office 文書は、もう一つの変換サービス earce9000/document-manager-converter で作った PDF を出します)。

単体で使うものではありません。 Document Manager 本体から、内部ネットワーク経由で呼び出します。 認証を持たないので、ポートを外へ公開しないでください。

⁠どういうPDFになるか

  • 1枚の長いページ(A4 には区切りません。区切ると表や図がページの途中で切れるため)
  • 横に長い表・1行が長いコードは、切れないようにページを右へ広げます
  • スクロールさせている枠は、開いて中身を全部出します
  • 文字は文字として入ります(検索・コピーできます)
  • 200インチ(A4 でおよそ17枚分)を超える長さの文書だけ、複数ページに分かれます

フォントは BIZ UDゴシック / BIZ UD明朝で描きます(文書が指定する游ゴシック・メイリオ等は再配布できない ため入っていません)。字幅が少し違うので、行の折り返し位置が画面とずれることがあります。 外部に置かれた画像・フォント・CSS は入りません(変換時に外部へ接続しないため)。

draw.io の図は、Document Manager の画面と同じ版の draw.io 公式ビューア(このイメージに同梱)で描きます。 紙の大きさはページごとに図の大きさに合わせ、回路図の記号などの拡張図形も描けます。

⁠使い方

Document Manager の HTML_PDF_URL に、このサービスのURLを渡します。

services:
  app:
    image: earce9000/document-manager:latest
    environment:
      HTML_PDF_URL: "http://pdf-converter:3000"
      # (ほかの設定は Document Manager の説明を参照)
    networks:
      - default
      - pdf

  pdf-converter:
    image: earce9000/document-manager-pdf-converter:latest
    restart: always
    read_only: true
    tmpfs:
      - /tmp:rw,size=512m
    security_opt:
      - no-new-privileges:true
    mem_limit: 1g
    networks:
      - pdf

networks:
  pdf:
    internal: true
環境変数既定値説明
CONVERT_MAX_BYTES52428800 (50MB)受け付けるHTMLの上限
CONVERT_TIMEOUT_SECONDS601件あたりの打ち切り(通常は1秒かかりません)
PDF_VIEWPORT_WIDTH1280画面として描く幅(px)
LISTEN_PORT3000待ち受けるポート
DRAWIO_DISABLED(未設定)1 で draw.io の変換を止めます(下の「安全面」)

⁠安全面

他人が作ったHTMLをブラウザのエンジンで開くので、何重にも閉じてあります。

  • 文書のスクリプトを動かしません(draw.io は例外。下記)
  • 文書そのもの以外は読み込みません(外部の画像・CSS、コンテナ内のファイル、内部の宛先)
  • 変換1件ごとに Chromium を起動して捨てます(前の文書の状態を持ち越しません)
  • 非root で動き、読み取り専用のファイルシステムで動かせます

そのうえで、上の例のように外へ出られないネットワーク(internal: true)に置いてください。

Chromium 自身のサンドボックスは切っています。 権限を絞ったコンテナの中では立ち上げられないためです。 スクリプトを動かさず通信も断っているので攻撃の入口は狭いですが、描画そのものの欠陥に対する守りは コンテナの隔離だけになります。そのためイメージを毎週作り直しています(Chromium のセキュリティ修正を 取り込むため)。定期的に取得し直してください。

draw.io の図では、スクリプトを動かします。 図を描くのに draw.io のビューア(JavaScript)が要るためです。 動くのはイメージに同梱したビューアだけで、図に仕込まれたスクリプトは CSP(script-src 'self')で止め、 通信の遮断も HTML と同じです。それでも守りは HTML より一段弱くなるので、「スクリプトは一切動かさない」 構成にしたい場合は DRAWIO_DISABLED=1 で draw.io の変換だけを止めてください。

⁠タグ

  • latest: 最新
  • YYYYMMDD.HHMM: ビルドした日時(JST)。直近3世代を残しています

amd64 のみです。

⁠詳細

仕組み・実測値・テストは GitHub の pdf-converter/README.md⁠ にあります。ライセンスは MIT です。

Tag summary

Content type

Image

Digest

sha256:00daf181c…

Size

399.9 MB

Last updated

about 13 hours ago

docker pull earce9000/document-manager-pdf-converter