６３０ページのＰＤＦをササッと「流し読み（＝力を抜いて軽く読むさま by Weblio辞書）」する《法令.app》

誰でも楽しく法律が読める[《法令.app》](https://jplaws.app)というWebアプリを作っています。

https://jplaws.app

今回は「図表」の扱いについてです。「民法」、「健康保険法」といった主だった法律を読むと、「テキストのみ」で構成されているように見えます。一方で、各省庁が作る「省令・施行規則」では、細かな現場での運用を定めていることから、多くの表や画像が載っています。ＰＤＦファイルが添付されていることもあります。

多くの「六法アプリ」では図表が省略されていました。法律は「本則」→「附則」→「別表（など）」の順で書かれていますが、ほとんどのユーザーは「本則の条文」を読みたくて使っているので、開発の優先順位としてはどうしても下になるんだと思います。

 [E-Gov法令検索](https://elaws.e-gov.go.jp/) での「表」の表示
<img width=400px src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801207/f9e974ea-12c4-5ae2-e580-6cd7a2b80564.png">

[《法令.app》](https://jplaws.app) 表示の工夫は特にしていません。「表」を含む「別表セクション」には、まだバグが多く、手をつけられていません（このシンプルな表でも、１行目の「第六条関係」がアプリに反映されてません）
<img width=400px src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801207/bf0398e5-e7d4-50b8-36f1-d1c3e33a198b.png">


個人的に「別表」は、図が多くて面白い法令が多いと思います。また紹介したいと思います。

## :chart_with_upwards_trend: 最大の「表」は、どの法令にある？

記事を書くにあたって「ネタ不足」がいなめないため、今回もスクリプトを書いてみました。世の中のあらゆることを文書に落とし込んでいる法令は、捉える角度は違っても「百科事典」の一種と言えるかもしれません。改めて調べると、その規模に圧倒されました。

<details>
<summary>各ファイルの table タグ、tdタグをカウントするスクリプト</summary>

```python:count_tables.py
# cli 引数１：table個数の上限、引数２：td個数の下限
# > python count_tables.py 3 3000
import glob
import re
glob_q = '# データフォルダ #/*-a.html'

th_l = [int(sys.argv[1]), int(sys.argv[2])]

pat_table = re.compile('<table')
pat_td = re.compile('<td')
global c0
c0= 0
def count( m ):
  global c0
  c0 += 1

file_count = 0
for path in glob.glob(glob_q):
  c0 = 0
  res = []
  with open(path) as f:
    txt = f.read()
    pat_table.sub(count, txt)
    res.append(c0)
    pat_td.sub(count, txt)
    res.append(c0)
    if( 
      (th_l[0] < 0 or res[0] <= th_l[0])
      and
      (th_l[1] < 1 or res[1] >= th_l[1]) ):
      file_count += 1
      print(f'\n{path}\n{res}')

print('files: ', file_count)
```
</details>

:crown: １つの表で「表の要素数」が一番多いのは、
[商標法施行規則《別表など》](https://jplaws.app/d/335M50000400013-a.html) の **3,011個** でした。

:crown:  大きな表がたくさん入った法令は
[獣医療法施行規則《別表など》](https://jplaws.app/d/404M50000200044-a.html) の「表の数」５つの中に **13,539** の要素でした。

:crown: 要素数のトップは、
[関税定率法《別表など》](https://jplaws.app/d/143AC0000000054-a.html) の表の数 **224** の中に **33,395** の要素がありました。どの程度実務で使うのか分かりませんが、税金関係を扱う通関士さんや税理士さんは大変ですね。。


空の要素もあるので、全てにデータが入っているわけではありませんが、１万というオーダーがぞろぞろあります。全てが巨大すぎて感覚がマヒします。「ＤＸ」は必至だな、とつくづく思います。「データベース」で扱うオーダーで、テキストで追える量ではないですね。

:red_car: [道路標識、区画線及び道路標示に関する命令《別表など》](https://jplaws.app/d/335M50004002003-a.html)

<img width=300px src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801207/b8c88a93-2530-de1f-d822-9c0fea7162a5.png">


圧倒されて少しげんなりする一方で、図表の多い法律は読んでいて楽しいです。道路標識の寸法・設計などを決めた法律です。


## :scroll: お役所のサイトの「PDFのリンクだけある」問題

役所のホームページでは、何かとPDFを置きがちです。印刷することを考えると、ダウンロードしてすぐに原本のそのままに印刷できる、すばらしい仕様なのですが、ネット上で見るのは毎度ため息が出ます。スマホだと５ページでも少し大変です。

何より、「謎のファイル名」の大きなファイルがダウンロードフォルダに溜まっていくのが地味にストレスです。私のフォルダを見ると「40_41.pdf」という、名前に何のヒントもないファイルが何ヶ月も前から残っています。

例に漏れず、国の [E-Gov法令検索](https://elaws.e-gov.go.jp/) では、PDFを多用しています。「図」メインであれば画像ファイルが表示されて見やすいのですが、「文書」となっているものは１ページであってもPDFになるので、ずらっとアイコンリンクが並ぶことになります。

```bash
> find ../../data/pict/ -name '*--1_*' -print | awk -F'_' '{print $1}' | sort | uniq -c | sort -rn | head
```

せっかくなので、たくさんのリンクが延々と続く、一番「壮観」なPDFリンクの行列をお見せしたい。linuxのコマンドでＰＤＦの添付数が多い順に並べてみました。

    328 ../data/pict/336M50000100001
    282 ../data/pict/329M50000002023
    192 ../data/pict/407M50000400077
    172 ../data/pict/356M50000010054

１つの法律にＰＤＦが **328個** 添付されている法律を、まず「E-Gov法令検索」で開いてみましょう。
 
[医薬品、医療機器等の品質、有効性及び安全性の確保等に関する法律施行規則](https://elaws.e-gov.go.jp/document?lawid=336M50000100001)

![many-pdf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801207/94e7bece-120f-adcf-868d-d131fbc805c3.png)

これは後からスクリーンショットをツギハギしたものです。元はリンクが「縦に一列で」並んでいました。赤いファイルのアイコンが「ドミノ倒し」のドミノに見えてきます。この画像の分だけで「１２ページ」スクロールする必要があります。実は残り８ページありますが、さすがに嫌になりましたので止めました。

中身がなんなのか、開いたＰＤＦに何ページあるのか、サイズは大きいのか、事前には何も分からない。「何条関係」とだけ書いてあるのを見てクリックできる人は「E-Gov法令検索」ユーザーの適正があります。が、日常生活ではマルウェアのリンクをいっぱい踏んでいる気がします。これは偏見です。

<img width=300px src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801207/07ee7737-a856-74b5-ed5f-591397503879.png">

:point_up:は、同じ条文を[《法令.app》](https://jplaws.app)で表示したものです。ＰＤＦはWebp画像に変換し、「内容」がすぐに見れます。ただし、軽快に表示したいので画質は最低限にしています。余白も詰め気味にトリミングしてあり見切れてしまっているファイルもあります。

ここはやや攻めすぎましたが、最小のファイルサイズで、内容がだいたいつかめる画像ファイルを求めて試しているところです（今はAvifというのがWebpより小さくできるというので、次回の処理では乗り換える予定です）。

## :books: ６３０ページのＰＤＦをササッと「流し読み（＝力を抜いて軽く読むさま by Weblio辞書）」する

さて、次は「最大のPDFファイル」を探してみましょう。（findコマンドで正規表現が使えると知ってやってみました。なぜか数字の '\d' が効かないので '\w'にしてます。ファイル名はアプリ固有なので意味はないです。あしからず）
```bash
> find ../../data/pict/ -type f -regex '.*--1_[8-9]\w--.*' | wc
```
10ページ以上のPDFファイルは529個、50ページは21、80ページ以上は3つありました。そして、100ページ以上は、1つ。この１つだけ別格の「630ページ！」:scream: 

さっきまで「何千行」とか「何万要素」というオーダーを見てきたので、数百では驚かなくなりましたが、ＰＤＦで100ページを超えたらなかなか厳しい。

こうなるとＰＤＦリンクは、何が出てくるか分からないし「開かないのが正解」となってしまいますが、[《法令.app》](https://jplaws.app)の趣旨としては「とりあえず読める」ことが目標なので、なんとかしたい。

例えば、図書館の本棚から分厚い本を取り出して、ちゃんと理解できないまでも、ざっとどんなことが書いてあるか知りたい時にどうするか？頭からめくっていくと、後半まで持たずに全体像はつかめない。本文に入る前に力尽きることもある。ひとつのやり方としては：

1. 頭から最後まで、飛ばし飛ばしページを開いて、何が書いてあるか「ざっと見る」
2. 気になるページがあれば、手を止めて「じっくり読む」
2. 後で使うために、書き写したりコピーをする

これをアプリでの行動に置き換えてみます

1. PDFの最初から最後まで、均等な間隔で抜き出したページを、１画面で収まる枚数並べる
1. よく見てみてみたい１枚を選択すると、いわゆる「ライトボックス」がポップアップする（サクサク見れる代わりに「画質」は最低限になっている）
1. プリントして使いたい場合は、[E-Gov法令検索](https://elaws.e-gov.go.jp)を訪れて、該当するPDFファイルをダウンロードする

 アプリでは、先程の６３０ページのＰＤＦをこう見せています。

[飼料及び飼料添加物の成分規格等に関する省令《別表など》](https://jplaws.app/d/351M50010000035-a.html)

![Peek 2024-06-05 00-35.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801207/9927768c-6649-64f0-8ed4-9a5e7cf32639.gif)

全ページ数を１２等分して、１２枚のページを抜き出し、「次へ」ボタンを押すと１６枚が１ページづつずれて行きます。詳しく見たいページは、クリックすると大きく表示されます。

<img width=500px src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3801207/71ed3ccf-5b70-bcb4-18f4-3a674a01b727.gif">

最後は、E-Gov法令検索のデータに丸投げしていて、少しズルいのですが、堅牢な「アーカイブ」としての国のサービスと、身軽に「多様な表現」ができる民間が、長所を補い合って全体のサービスを上げていく「役割分担」と思ってます。

「役割」としての義務は、最新の元データと齟齬のないように適切にデータをアップデートしておくことだと思ってます。


ひばりソフト（ひばり）