Skip to content
PrivacyBrowserPDFSecurity

ブラウザ完結型Markdown to PDF:端末内に留まるデータと通信

クライアント側変換の仕組み、md2pdfが行う通信、機密・社内MarkdownをPDF出力する前に確認すべき点について詳しく解説します。

「ブラウザ上で動作する」という表現は利便性を示しますが、完全なプライバシーステートメントではありません。ブラウザはファイルをアップロードせずに読み込めますが、プレビュー時に外部画像を複数取得することもあります。

md2pdfはバックエンドを持たない静的サイトです。Markdownの構文解析、サニタイズ、目次生成、プレビュー、印刷、PDFレイアウトはすべて端末上で実行されます。これにより外部サーバーへの文書アップロードを完全に排除していますが、あらゆる通信が遮断されるわけではありません。

基本的な変換手順についてはGitHubのREADMEをPDFに変換する方法、複数章の製本は複数ファイルのMarkdownブック作成をご覧ください。

ここでの「ブラウザ完結」が意味すること

md2pdfにおいてブラウザ完結とは、サーバー側レンダラーが存在しないことを意味します。サイトは静的なHTML、CSS、JavaScriptで構成されています。Markdownを貼り付けた場合、テキストはタブのメモリ内に留まります。ファイルをアップロードした場合、File APIを通じてローカルで読み取られ、外部へ送信されません。

これは完全なオフラインを意味するわけではありません。初期ロードでサイトアセットを取得し、GitHubインポートでは公開APIへのリクエストが発生します。

約束する内容は極めて明確です。あなたのMarkdownはLadeStackへアップロードされず、変換用のアカウントやサーバー上の文書保存領域も存在しません。

処理パイプラインの全体像

単一のドキュメントは以下の段階を経て処理されます:

source  ->  parse  ->  resolve  ->  render  ->  sanitize  ->  preview  ->  print
  1. 入力。 貼り付けられたテキスト、ローカルファイル、またはGitHub上のREADMEを読み込みます。
  2. 構文解析。 markdown-itが表、タスクリスト、コードブロックなどのGFMを解析します。
  3. 解決。 リポジトリ取得の場合、相対画像パスをraw.githubusercontent.comへ書き換えます。
  4. 描画。 解析されたトークンをHTMLへ変換します。
  5. 無害化。 DOMPurifyが危険な要素(スクリプト、iframeなど)を除去します。
  6. プレビュー。 見出しIDや任意の目次とともにHTMLが画面へ挿入されます。
  7. 出力。 ブラウザ標準の印刷ダイアログまたはpdf-libによる製本出力を実行します。

読み込み以降の全工程はローカル環境で安全に実行されます。

ブラウザから外部へ送信されるもの

ローカルファイルや貼り付けたテキストについて、md2pdf自体が文書内容を外部へ送信することはありません。受信用のAPIエンドポイントが存在しないためです。

通常の利用で発生する通信は以下の通りです:

  • サイトアセット。 画面表示に必要なHTML、CSS、フォント、スクリプトの取得。
  • GitHub公開インポート。 指定された公開リポジトリのREADMEや画像を取得する匿名リクエスト。
  • 文書内のリモートアセット。 Markdown内に外部ホストの画像リンクが含まれている場合、ブラウザがプレビュー表示のために取得を試みます。

例えば文書内に![dashboard](https://internal.example.test/chart.png)が含まれている場合、本文はローカルにあっても画像リクエストは外部サーバーへ送信されます。

通常のリンクはクリックされるまで通信しませんが、埋め込み画像は描画時に自動的にリクエストされます。

ローカルファイルと貼り付けたMarkdown

ローカルでの作業は最も安全に管理できます:

  • 貼り付け。 外部画像リンクがない限り、テキストがタブ外へ出ることはありません。
  • ファイル読込。 2MBの上限内でローカルメモリに読み取られ、サーバーへ送信されません。
  • サンプル読込。 サイトに内包されている静的サンプルを使用するため追加通信は不要です。

ローカルファイルの相対画像パスはリポジトリの基準がないため解決できません。絶対URLを指定するか代替表示を受け入れてください。

完全なオフライン出力を求める場合は、事前にリモート画像を除去してください。

リモート画像やリンクは依然としてネットワーク要求である

ブラウザ完結の処理は文書本文を保護しますが、文書が参照しているリソースまでは自動的に遮断しません。

以下の例をご覧ください:

![Architecture](./docs/architecture.png)

See the [operations guide](https://example.test/ops).

GitHubインポートでは画像パスがGitHubのRawホストへ書き換えられます。貼り付けモードでは絶対URLが外部サーバーへ直接要求されます。

機密文書を出力する前に以下の要素を確認してください:

  • http:// や https:// で始まる画像URL
  • HTMLの <img> タグ
  • 外部スタイルシートやフォントへのリンク
  • 通信を伴わないデータURI形式の画像

DOMPurifyは不正なスクリプトを除去しますが、正当な画像表示はドキュメントの一部として維持されます。

GitHub取得の制限とエラーハンドリング

GitHubインポートは認証トークンを使用しない公開読み取り処理です。安全なタイムアウトが設定されています:

  • APIリクエストの15秒タイムアウト
  • 章コンテンツ取得の20秒タイムアウト
  • リポジトリ探索の25秒上限
  • レート制限時のRawコンテンツ直接フォールバック
  • 欠損画像による全体処理中断の防止

実践的なプライバシー確認リスト

社内資料や機密ドキュメントをPDF化する際は以下を確認してください:

  • 意図しない社内限定URLへの画像参照が含まれていないか。
  • 公開リポジトリのURLが正しいか。
  • トークンや認証情報が本文に記載されていないか。
  • 印刷プレビューで内容の整合性を確認したか。
  • 外部変換サービスに依存せずローカルで完了しているか。

各テーマのスタイルについては印刷テーマの選び方もあわせてご参照ください。

自分だけのREADME PDFを作る

無料、ログイン不要、そしてすべてクライアントサイド。

コンバーターを開く