pkgsrc/print/py-pdfを使って、PDFファイル中のハイパーリンクを抽出する

とある自治体が法令に基づいて公開しているPDFファイル一式を入手したかったのだが、そのPDFファイルへのリンク先が1つのPDFファイル中のハイパーリンクという形でしか提供されていなかった。 と言うことで、pkgsrc/textproc/py-pdfからpy314-pdf-6.7.0をインストールして抽出することにした。

と言うことで、以下のようなスクリプトを書いてみた。

$ cat extract-hyperlinks.py
#!/usr/pkg/bin/python3.14
#
# Usage:
# $ cd /usr/pkgsrc/textproc/py-pdf
# $ make install
# $ ./extract-hyperlinks.py target.pdf > links.txt
# $ wget -i links.txt

import sys
from pypdf import PdfReader

pdfpath = sys.argv[1]

reader = PdfReader(pdfpath)

for page in reader.pages:
  if '/Annots' in page:
    for annot in page['/Annots']:
      annotation = annot.get_object()
      if "/A" in annotation and "/URI" in annotation["/A"]:
        uri = annotation["/A"]["/URI"]

        print(f"{uri}")

以下のように利用すれば良い。

$ python3.14 extract-hyperlinks.py ../hyperlinks.pdf > links.txt

Metabaseでlog4jを使ってログを出力する

pkgsrc/www/metabaseを最新にアップデートするのは怠けているのだが、手元ではほぼ常に最新版を使っている。 pkgsrc/www/metabaseのインストールするrcスクリプトには、log4jによりログを出力する設定が含まれている。 また、そのrcスクリプトが利用するlog4j2.xmlという設定ファイルの雛形も含まれている。 なので、pkgsrcからMetabaseをインストールすれば、/var/log/metabase/metabase.logに、設定されたようにログが出力される。

log4jによりログを出力するのは、私の用途では重要なのだが、少なくとも私がMetabaseを使い始めた時にはあまり情報がなかったように思う。 もうずいぶんと前の話なので、今は十分に説明するウェブページが世間にはあるようだ。

Grafanaには、BASIC認証を設定できない

Grafanaを簡単にどういうものか説明できるほど良く理解していないが、私の使い方で言えば、時系列データを保存しているデータベースがあって、その内容を折れ線グラフでプロットして、その値によってアラートを出すように設定できるダッシュボードのウェブページである。 ビジネス・インテリジェンス・システムのようなものであるような気もする。

私は、少し古いがpkgsrc/www/grafanaから11.0.0をインストールし、データベースは、pkgsrc/databases/influxdbを手元でアップデートしてInfluxDB 1.8.10をインストールして使っている。 ウェブサーバーがないと使えない訳ではないと思うが、Apache httpdをリバースプロキシーとして利用している。

Grafanaには、もちろんログイン機能があって、ログインしなければダッシュボードを見ることはできない。 そもそもやりたかったのは、そもそもGrafanaのログイン画面へ行くこともできないようにすることだった。 そうだとすると、一番簡単なのは、BASIC認証を設定することであるように思えた。

しかし、BASIC認証は使えない。 と言うのは、ユーザー追加をする際に、Grafana自体が自身のAPIを利用する場合にBASIC認証を利用しているからであるようである。 Apache httpdでBASIC認証した上で、ユーザー追加をすると、追加したユーザーでしかログインできなくなるばかりか、そのユーザーからログアウトすることもできなくなってしまう。

おとなしく、Grafana備え付けのログイン画面を使っておくのが一番良さそうである。

pkgsrc/print/py-pdfを使って、PDFファイル中のハイパーリンクを抽出する

とある自治体が法令に基づいて公開しているPDFファイル一式を入手したかったのだが、そのPDFファイルへのリンク先が1つのPDFファイル中のハイパーリンクという形でしか提供されていなかった。 と言うことで、pkgsrc/textproc/py-pdfからpy314-pdf...