0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Web ページを PDF にする 3 つの道 — 実測で分かれ目が見えた話

0
Posted at

同じ Web ページを 3 回 PDF にしたら、同じページとは思えない 3 つのファイルが出てきました。1 つ目は 2 ページで表のフォントが 6.74pt。2 つ目は 1 ページで 9.75pt。3 つ目は 2 つ目とほぼ同じ見た目なのに、文字が 1 文字も選択できず、容量は 6.4 倍。ページ側は何も触っていません。変えたのは「どの道を通したか」だけです。

先に言葉を 3 つ。ページ送り(改ページ)とは、いくらでも下にスクロールできる Web ページという一枚の布を、決まったサイズの紙の束に裁断する工程のこと。pt はその紙の上の単位で、A4 は 595×842pt、Letter は 612×792pt。px は画面側の単位で、ページの文字サイズはこちらで書かれています。2 つの単位は噛み合わないので必ず換算が入り、事故はたいていそこで起きます。もう 1 つ、選択できる文字とは、PDF 上でドラッグして反転でき、Ctrl+F で検索でき、コピーして取り出せる文字のこと。すべての PDF にあるわけではありません。

測ったもの

サンプルは自作で、中身は全部架空です。存在しない越境倉庫の配送明細、46 行の表、SKU も倉庫名も金額も作り物。実在の企業や実データは一切使っていません。通した 3 つの道は、ブラウザの印刷、図映 ImgIng(https://imging.ai/ )の「ページの実寸に合わせる」書き出し、そして自分でスクリプトを組んだ「ページ全体をスクリーンショットして PDF に貼る」方式。出来上がった PDF は見た目で判断せず、ページ数・ページサイズ・本文の中央値フォントサイズ・抽出できる文字数をスクリプトで読みました。

1 本目:既定の用紙は思っているものとは限らない

ブラウザ印刷の既定は A4 だと思い込んでいました。この環境では違って、Letter の 612×792pt でした。用紙が決まってしまうと、1180px 幅のレポートを 816px 幅の版面に収めるしかなく、全体が一段縮みます。13px の表の文字は 6.74pt に落ち、ページ数は 2。文字が小さいのは画面のせいではなく、先に紙があって、内容がそこへ押し込まれたからです。

2 本目:紙を先に置かない

2 本目は前提そのものを外します。ページがレンダリングされた寸法が、そのまま PDF のページ寸法になる。同じレポートが 1 ページ、1080×1536pt、表の文字は 9.75pt。文字は選択でき、検索でき、本文中のリンクもそのまま押せました。

誤読される前に釘を刺しておくと、9.75 が 6.74 より大きいことは「こちらの方が鮮明に描けている」という意味ではありません。同じ dpi で並べても、字形の鮮明さに測定できる差は見つけられませんでした。違うのは「紙に収めるために縮める必要があったかどうか」で、これはページサイズの方針であって描画品質ではありません。

同じ 46 行のレポートの表部分の比較:上がブラウザ印刷で 2 ページ Letter・6.74pt、下が実寸に合わせた 1 ページ 1080x1536pt・9.75pt

3 本目:見た目は同じ、失うものが大きい

スクリーンショット方式は、オンラインの変換ツールが実際によく採っている作りです。同じページで、選択できる文字は 0、容量は 995,232 バイト。2 本目は 2,996 文字が選択でき 156,370 バイトでした。6.4 倍という数字より痛いのは受け取る側で、検索も引用もできず、そこから何かに流し込むこともできません。

同じ図版ページを 900 dpi 相当まで拡大した比較:ブラウザ描画側は 2,996 文字が選択でき 156,370 バイト、ページ全体のスクリーンショット方式は 0 文字・995,232 バイト

どちらの道でも避けられない 2 つ

ここで結論が出たと思ったのですが、2 つの発見に半分ひっくり返されました。

1 つはスクロールコンテナです。管理画面の表は高さを固定して内側にスクロールバーを持たせる書き方が定番ですが、書き出すとコンテナ内で見えていた一画面分しか出てきません。46 行の明細が、どちらの道でも 8 行だけ。残り 38 行は PDF に存在せず、画面には警告も出ません。両方が同じように落とすので、どちらかの優位点にはなりません。ツール側の回避策は今のところ見つかっておらず、書き出す前に表をコンテナから出して高さを伸ばしておく、という運用で凌いでいます。

もう 1 つの方が示唆的でした。同じ長い表に、印刷時だけ効くスタイルを足してみます。用紙は A4、ヘッダーは毎ページ繰り返す、行をページ境界で分断しない。すると 2 本の道の結果が完全に一致しました。どちらも 7 ページの A4、ヘッダーは 7 回繰り返し、項目ごとに一致。つまりページ送りはページ自身の CSS がほぼ決めていて、ツールはそれを実行しているだけ。ページに印刷用スタイルが 1 行もないときに限って、ツール側に「紙に裁つか、実寸で通すか」の選択肢が生まれます。

ブラウザのタブで動くものは全部ローカル、と思われがちなので、そこも書いておきます。図映自身の説明によれば、読み込み、フォルダの読み取り、リソースのマッピング、即時プレビュー、そして PDF を受け取った後の可逆的な最小化は、すべてブラウザ内のローカルで完結し、この区間の送信はゼロ。変換ボタンを押した後にはじめて、スクリプトを取り除きリソースをすべてインライン化した自己完結 HTML スナップショットを、1 回の POST で同一オリジンのエンドポイントへ送り、サーバー側の Chromium / Skia が本物の PDF を返します。これが同社のドキュメント機能で唯一サーバーを経由する部分です。ネットワークパネルを開いて確かめたところ、押す前は非 GET リクエストが 0 件、押した後はちょうど 1 回の POST でした。機密性のあるページなら、まずこの一点を判断してからだと思います。

いまの使い分けはかなり短くなりました。ページに印刷用スタイルがあるなら 2 本の道は一致するので、手近な方でいい。ないうえに表が横に広いなら、実寸で通す方がフォントサイズを守れる。そのどちらを選ぶ前にも、表がスクロールコンテナに閉じ込められていないかを確認する。確認方法は 1 つで足ります。書き出した PDF で、最後の数行にしか出てこない語を検索してみる。見つからなければ、行は落ちています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?