ホーム 記事一覧 ブック DH週間トピックス 検索 このサイトについて
English
Leaflet-IIIFでのアノテーション座標変換の完全ガイド

Leaflet-IIIFでのアノテーション座標変換の完全ガイド

概要 IIIF (International Image Interoperability Framework) Presentation API v3のマニフェストに含まれるアノテーション座標(xywh形式)を、Leaflet-IIIFを使用したマップビューアー上で正確に表示する方法について解説します。 この問題は一見シンプルに見えますが、Leaflet-IIIFの内部動作を理解しないと正確な座標変換ができません。 問題の背景 IIIFマニフェストのアノテーション形式 IIIF Presentation API v3では、アノテーションの対象領域は以下のようなxywh形式で指定されます: { "id": "https://example.org/iiif/canvas/1/annotation/1", "type": "Annotation", "motivation": "commenting", "body": { "type": "TextualBody", "value": "雅屯河", "language": "ja" }, "target": "https://example.org/iiif/canvas/1#xywh=41012,81,115,49" } このxywh=41012,81,115,49は: x: 41012(左端のピクセル位置) y: 81(上端のピクセル位置) w: 115(幅) h: 49(高さ) を意味します。これらは元画像のピクセル座標 です。 Leaflet-IIIFの座標系 Leaflet-IIIFは、IIIF Image APIで提供される高解像度画像をタイル形式で表示するLeafletプラグインです。内部的には: CRS.Simple座標参照系を使用 画像を複数のズームレベルで縮小して管理 ズームレベルごとに異なる座標スケールを使用 この複雑な座標系のため、単純にmap.unproject()やpointToLatLng()を使っても正しい位置に配置できません。 試行錯誤の過程 失敗した試み1: map.unproject()の直接使用 // ❌ これは動かない const point = L.point(x, y); const latLng = map.unproject(point, 3); // ズームレベル3を指定 問題点 : unproject()は現在のマップの座標系を前提としており、Leaflet-IIIFが内部で使用している座標系とは異なります。 失敗した試み2: マップ境界からの比例計算 // ❌ これも不正確 const bounds = map.getBounds(); const normX = imgX / imageWidth; const normY = imgY / imageHeight; const lng = bounds.getWest() + (normX * (bounds.getEast() - bounds.getWest())); const lat = bounds.getNorth() - (normY * (bounds.getNorth() - bounds.getSouth())); 問題点 : Leaflet-IIIFは画像のアスペクト比を保持するため、マップ境界と実際の画像境界は異なります。 ...

Miradorの表示方向を外部から制御する方法

Miradorの表示方向を外部から制御する方法

概要 Mirador viewerの表示方向(viewingDirection)をURLパラメータから動的に指定する実装について解説します。この機能により、同じマニフェストを左から右(left-to-right)または右から左(right-to-left)で表示することができます。 実装方法 1. URLパラメータの取得 URLからviewingDirectionパラメータを取得し、デフォルト値を設定します: // URLパラメータから表示方向を取得 const urlParams = new URLSearchParams(window.location.search); const viewingDirection = urlParams.get('viewingDirection') || 'right-to-left'; この実装では、パラメータが指定されていない場合は'right-to-left'(右から左)がデフォルトとして使用されます。 2. Mirador設定への適用 取得したviewingDirectionをMiradorの初期設定に組み込みます: const miradorConfig = { id: "viewer", windows: [{ id: 'known-window-id', loadedManifest: manifestUrl, viewingDirection: viewingDirection, // URLパラメータの値を使用 }], window: { allowClose: false, allowMaximize: false, allowFullscreen: false, hideWindowTitle: true, }, workspaceControlPanel: { enabled: false, }, }; 3. 使用例 右から左表示(デフォルト) https://example.com/viewer.xml または https://example.com/viewer.xml?viewingDirection=right-to-left 左から右表示 https://example.com/viewer.xml?viewingDirection=left-to-right XSLTでの実装 XSLTテンプレート内でこの機能を実装する場合、以下のコードをスクリプトセクションに追加します(mirador.xsl:222-230): <!-- URLパラメータから表示方向を取得 --> const viewingDirection = urlParams.get('viewingDirection') || 'right-to-left'; // Miradorの初期設定 const miradorConfig = { id: "viewer", windows: [{ id: 'known-window-id', loadedManifest: manifestUrl, viewingDirection: viewingDirection, }], // ... その他の設定 }; 利用可能な値 MiradorのviewingDirectionには以下の値が使用できます: left-to-right - 左から右へページをめくる(欧文書籍など) right-to-left - 右から左へページをめくる(和書、アラビア語書籍など) top-to-bottom - 上から下へ(巻物など) bottom-to-top - 下から上へ 注意点 マニフェストファイル内でviewingDirectionが指定されている場合、マニフェストの設定が優先されます。この方法は主にマニフェストファイル内で表示方向が指定されていない場合に有効です この設定はwindow単位で適用されます URLパラメータはページ読み込み時にのみ評価されます ユーザーがMirador UI上で表示方向を変更した場合、URLパラメータの値は上書きされます 関連ファイル xsl/mirador.xsl - XSLT変換テンプレート(実装箇所)

画像コレクション管理ツール 技術アーキテクチャ解説

画像コレクション管理ツール 技術アーキテクチャ解説

概要 以下の記事で、IIIFの機能を簡単に試すことを目的とした「画像コレクション管理」ツールについて紹介しました。 https://zenn.dev/nakamura196/articles/7d6bb4cdc414c4 今回は、このツールの裏側で使われている技術について紹介します。 はじめに 画像コレクション管理ツールは、画像コレクションを国際標準規格であるIIIF(International Image Interoperability Framework)形式で管理・公開するためのWebアプリケーションです。本記事では、このツールの技術的な実装について、特にIIIF仕様の実装と地理空間情報の扱いに焦点を当てて解説します。 技術スタック フロントエンド : Next.js 14 (App Router), React, TypeScript バックエンド : Next.js API Routes データストレージ : AWS S3互換オブジェクトストレージ(Cloudflare R2) 認証 : NextAuth.js 地図表示 : Leaflet, MapLibre GL JS IIIF ビューア : Mirador 3, OpenSeadragon IIIF実装の詳細 1. IIIF Presentation API v2/v3の両方をサポート 本ツールは、IIIF Presentation APIのバージョン2とバージョン3の両方に対応しています。これにより、様々なIIIFビューアとの互換性を確保しています。 v2とv3の主な違い // IIIF v2の構造 { "@context": "http://iiif.io/api/presentation/2/context.json", "@id": "https://example.com/manifest", "@type": "sc:Manifest", "label": "タイトル", "sequences": [{ "@type": "sc:Sequence", "canvases": [...] }] } // IIIF v3の構造 { "@context": "http://iiif.io/api/presentation/3/context.json", "id": "https://example.com/manifest", "type": "Manifest", "label": { "ja": ["タイトル"] }, "items": [...] // canvasの配列 } 2. マルチ言語対応 v3では、ラベルや説明文を言語別に管理できます: ...

「画像コレクション管理」ツールの使い方ガイド

「画像コレクション管理」ツールの使い方ガイド

概要 IIIFの機能を簡単に試すことを目的とした、「画像コレクション管理」ツールを作成しました。 https://pocket.webcatplus.jp https://pocket.webcatplus.jp/ 本ツールの使い方について紹介します。 コレクション管理 コレクションの作成 ダッシュボードで「新規コレクション」ボタンをクリック 必要情報を入力: コレクション名 (必須): わかりやすい名前を付ける 説明 (任意): コレクションの内容を説明 公開設定 : 公開/非公開を選択 「作成」をクリック コレクションの編集 コレクション一覧から編集したいコレクションの「⋮」メニューをクリック 「編集」を選択 情報を更新して「保存」 コレクションの削除 コレクション一覧から削除したいコレクションの「⋮」メニューをクリック 「削除」を選択 確認ダイアログで「削除」をクリック ⚠️ 注意 : コレクションを削除すると、含まれるすべてのアイテムも削除されます アイテム(画像)管理 アイテムの追加 方法1: ドラッグ&ドロップ コレクションページを開く 「新規アイテム」ボタンをクリック 画像ファイルをドラッグ&ドロップエリアにドロップ タイトルと説明を入力 「作成して編集」をクリック 方法2: ファイル選択 「ファイルを選択」ボタンをクリック アップロードしたい画像を選択(複数選択可) タイトルと説明を入力 「作成して編集」をクリック 方法3: URLから追加 「URLから追加」タブを選択 画像のURLを入力 「追加」をクリック 方法4: IIIF画像の追加 「info.jsonから追加」タブを選択 IIIF info.jsonのURLを入力 「追加」をクリック アイテムの編集 アイテム一覧から編集したいアイテムをクリック 編集画面で以下の情報を更新: 基本情報 : タイトル、説明、公開設定 位置情報 : 緯度、経度、場所の名前 詳細情報 : 帰属表示、権利情報 追加情報 : カスタムフィールド(作成年、作者など) 「保存」をクリック ...

IIIF Georeference ViewerのMapLibre GL移行と機能改善

IIIF Georeference ViewerのMapLibre GL移行と機能改善

本記事はAIが作成し、人間が追記しました。 概要 IIIF Georeference ViewerにおけるマップコンポーネントをLeafletからMapLibre GLへ移行し、複数の機能改善を実施しました。本記事では、実装した主要な機能とその技術的詳細について説明します。 https://nakamura196.github.io/iiif_geo/ 主要な改善点 1. 画像の自動回転機能 IIIF画像を地図上に正しい向きで表示するため、コントロールポイント(対応点)から自動的に回転角度を計算する機能を実装しました。 機能概要 画像座標と地理座標の対応点から、画像を北が上になるように回転させる角度を自動計算 2点間または3点以上の分布パターンから最適な回転角度を決定 URLパラメータによる回転角度の保存と復元 実装のポイント // utils/calculateImageRotation.ts export function calculateImageRotation(features: Feature[]): RotationCalculationResult | null { // 最も離れた2点を見つける(より正確な角度計算のため) const validFeatures = features.filter((f) => f.properties?.resourceCoords && f.geometry?.coordinates ); // 画像座標系でのベクトルと地理座標系でのベクトルから回転角度を計算 const imgVector = { x: img2.x - img1.x, y: img2.y - img1.y }; const geoVector = { x: geo2.lng - geo1.lng, y: geo2.lat - geo1.lat }; // 北を基準とした角度の差を計算 const rotationDeg = geoAngleFromNorthDeg - imgAngleDeg; return normalizeAngle(rotationDeg); } UI実装 自動回転ボタン(🔧アイコン)をOSDビューアーに配置 rotationパラメータが未指定の場合は自動的に回転角度を計算 手動での角度調整用スライダーも提供 2. LeafletからMapLibre GLへの移行 移行の背景 パフォーマンス向上 : MapLibre GLはWebGLベースのレンダリングにより、大量のマーカー表示時のパフォーマンスが向上 スムーズなアニメーション : 地図の移動やズーム時のアニメーションがより滑らかに ベクタータイルのサポート : ラスタータイルに加えてベクタータイルの表示が可能 実装のポイント import { Map, NavigationControl, Marker, Popup } from "maplibre-gl"; import "maplibre-gl/dist/maplibre-gl.css"; const mapInstance = ref<Map | null>(null); // MapLibre GL初期化 mapInstance.value = new Map({ container: mapContainer.value!, style: mapStyles.value[0].style, center: initialCenter, zoom: zoom_.value, attributionControl: false }); 3. 現在地表示機能 ブラウザのGeolocation APIを使用して、ユーザーの現在地を地図上に表示する機能を実装しました。 ...

Cantaloupeでdelegate scriptを使ってAzure Storage上のファイルパスを動的に変換する方法

Cantaloupeでdelegate scriptを使ってAzure Storage上のファイルパスを動的に変換する方法

はじめに IIIFサーバーのCantaloupeでAzure Storageを使用している際、IIIF URLのidentifierと実際のAzure Storage上のファイルパスが異なる場合があります。本記事では、この問題をdelegate scriptを使って解決する方法を詳しく解説します。 課題 以下のようなファイル構造で画像を管理しているとします: Azure Storage Container: mycontainer ├── images/ │ ├── collection1/ │ │ ├── item001/ │ │ │ └── item001_001.jpg │ │ └── item002/ │ │ └── item002_001.jpg │ └── collection2/ │ └── ... しかし、IIIF URLでは以下のようにアクセスしたい: https://example.com/iiif/3/collection1/item001/item001_001.jpg/info.json この場合、IIIF URLのidentifier (collection1/item001/item001_001.jpg) と実際のAzure Storageのパス (images/collection1/item001/item001_001.jpg) が異なります。 AzureStorageSourceには、S3SourceのようなPATH_PREFIX設定が存在しないため、この問題を解決するためにはdelegate scriptを使用する必要があります。 解決方法 1. Docker Compose設定 services: cantaloupe: image: islandora/cantaloupe:main environment: CANTALOUPE_SOURCE_STATIC: AzureStorageSource CANTALOUPE_AZURESTORAGESOURCE_ACCOUNT_NAME: ${AZURE_STORAGE_ACCOUNT_NAME} CANTALOUPE_AZURESTORAGESOURCE_ACCOUNT_KEY: ${AZURE_STORAGE_ACCOUNT_KEY} CANTALOUPE_AZURESTORAGESOURCE_CONTAINER_NAME: ${AZURE_STORAGE_CONTAINER_NAME} CANTALOUPE_AZURESTORAGESOURCE_LOOKUP_STRATEGY: ScriptLookupStrategy # 重要 CANTALOUPE_DELEGATE_SCRIPT_ENABLED: "true" CANTALOUPE_DELEGATE_SCRIPT_PATHNAME: "/opt/cantaloupe/delegates.rb" volumes: - "./delegates.rb:/opt/cantaloupe/delegates.rb:ro" labels: - "traefik.enable=true" - "traefik.http.routers.cantaloupe.rule=Host(`example.com`)" - "traefik.http.routers.cantaloupe.entrypoints=websecure" - "traefik.http.routers.cantaloupe.tls=true" - "traefik.http.services.cantaloupe.loadbalancer.server.port=8182" restart: always 2. Delegate Script (delegates.rb) 開発・デバッグ版 最初はデバッグ出力を含む版で動作確認を行います: ...

Omeka S Docker の紹介:デジタルコレクションのための最新かつセキュアなソリューション

Omeka S Docker の紹介:デジタルコレクションのための最新かつセキュアなソリューション

! 本記事はAIが作成しました。 Omeka S Docker へようこそ!このプロジェクトは、大学、ギャラリー、図書館、アーカイブ、博物館向けの Web パブリケーションシステムである Omeka S の本番環境対応 Docker セットアップを提供します。 📦 GitHub リポジトリ : https://github.com/nakamura196/omeka-s-docker なぜ Omeka S Docker なのか? デジタルコレクションの管理は複雑である必要はありません。そのため、Omeka S のデプロイと管理を簡素化する Docker ベースのソリューションを作成しました。 主な機能 🚀 クイックセットアップ : シングルコマンドで数分以内に Omeka S を稼働 🔒 セキュリティファースト : 非 root コンテナとセキュアなデフォルト設定を含むセキュリティベストプラクティスで構築 📦 モジュール管理 : 人気の Omeka S モジュールの自動インストールとアップデート 🔄 簡単なアップグレード : データの永続性を保ちながらシームレスなバージョンアップグレード 🐳 本番環境対応 : 開発環境と本番環境の両方に最適化 🌐 Traefik 統合 : リバースプロキシと SSL 終端のビルトインサポート はじめに 前提条件 Docker と Docker Compose がインストールされていること コマンドラインの基本的な知識 (オプション)SSL 付き本番環境デプロイ用のドメイン名 セットアップオプションの理解 この Docker セットアップは2つのデプロイモードを提供します: ...

IIIF 3D Viewerを試作しました。

IIIF 3D Viewerを試作しました。

! 本記事はAIが作成しました。 はじめに デジタルヒューマニティーズの分野において、文化財や歴史的資料の3Dデジタル化が急速に進んでいます。しかし、3Dモデルを単に閲覧するだけでなく、学術的な分析や教育に活用するためには、適切なツールが必要です。本記事では、IIIF(International Image Interoperability Framework)規格に準拠した3Dモデルビューア「IIIF 3D Viewer」について紹介します。 IIIF 3D Viewerとは IIIF 3D Viewerは、IIIF Manifestフォーマットに基づいて3Dモデルを表示し、アノテーション機能を提供するウェブアプリケーションです。 主な特徴 標準規格への準拠 IIIF Presentation API 3.0に準拠 既存のIIIFエコシステムとの親和性 インタラクティブな3D表示 GLB/GLTFフォーマットのサポート マウスやタッチ操作による直感的な操作 WebGLを活用した高速レンダリング アノテーション機能 3Dモデル上の任意の点にアノテーションを追加 3DSelectorタイプによる空間座標の記録 学術的な注釈や解説の付与が可能 多言語対応 日本語・英語のインターフェース 国際的な研究プロジェクトでの利用を想定 静的サイト生成 Next.jsの静的エクスポート機能を活用 GitHub PagesやNetlifyなどで簡単にホスティング可能 技術的な実装 アーキテクチャ 本アプリケーションは、以下の技術スタックで構築されています: フロントエンドフレームワーク : Next.js 15(App Router) 3Dレンダリング : React Three Fiber + Three.js 国際化 : next-intl スタイリング : Tailwind CSS 型安全性 : TypeScript IIIF Manifestの構造 3Dモデルを含むIIIF Manifestの例: { "@context": "http://iiif.io/api/presentation/3/context.json", "id": "https://example.com/manifest.json", "type": "Manifest", "label": { "ja": ["石淵家地球儀"] }, "items": [ { "id": "https://example.com/canvas/1", "type": "Canvas", "items": [ { "id": "https://example.com/annotationpage/1", "type": "AnnotationPage", "items": [ { "id": "https://example.com/annotation/1", "type": "Annotation", "motivation": "painting", "body": { "id": "https://example.com/model.glb", "type": "Model", "format": "model/gltf-binary" }, "target": "https://example.com/canvas/1" } ] } ] } ] } アノテーションの実装 3D空間におけるアノテーションは、以下のような構造で表現されます: ...

IIIF認証API 2.0の動作確認

IIIF認証API 2.0の動作確認

概要 以下のIIIF認証API 2.0の動作確認を行う機会がありましたので、備忘録です。 https://iiif.io/api/auth/2.0/ 以下のようなデモサイトを作成しました。 https://iiif-auth-nextjs.vercel.app/ja リポジトリは以下です。 https://github.com/nakamura196/iiif-auth-nextjs 以下、AIによる説明です。なお、Miradorではうまく動作させることができなかったため、今後の課題です。 概要 本記事では、IIIF Authentication API 2.0 の認証フローを、実際のHTTPリクエスト/レスポンスのレベルで詳細に解説します。各ステップでどのようなリクエストが送信され、どのようなレスポンスが返されるのかを追跡していきます。 アーキテクチャ概要 ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ Client │────▶│ IIIF Server │────▶│Auth Service │ │ (Browser) │◀────│ │◀────│ │ └─────────────┘ └─────────────┘ └─────────────┘ 認証フローの詳細 Step 1: 初回の画像情報リクエスト(未認証) リクエスト: GET /api/iiif/image/sample/info.json HTTP/1.1 Host: localhost:3001 Accept: application/json 処理フロー(サーバー側): // app/api/iiif/image/[id]/info.json/route.ts export async function GET(request: NextRequest) { // 1. Authorizationヘッダーを確認 const authHeader = request.headers.get('authorization'); let token = authHeader?.replace('Bearer ', ''); // 2. クエリパラメータもチェック(フォールバック) if (!token) { token = request.nextUrl.searchParams.get('token') || ''; } // 3. トークンの検証 const isValid = token ? await verifyToken(token) : null; // 4. 未認証の場合は401を返す if (!isValid) { return NextResponse.json({ error: 'Authentication required', service: [{ "@context": "http://iiif.io/api/auth/2/context.json", "id": `${request.nextUrl.origin}/api/iiif/probe`, "type": "AuthProbeService2" }] }, { status: 401 }); } } レスポンス: ...

Recogitoを用いたテキストアノテーションを試す

Recogitoを用いたテキストアノテーションを試す

概要 Recogitoを用いたテキストアノテーションを試す機会がありましたので、備忘録です。 Recogitoは以下です。 https://recogito.pelagios.org/ 以下のように説明されています。 Semantic Annotation without the pointy brackets. Recogito is an annotation tool for texts and images - not just for Digital Humanities scholars. (機械翻訳)タグを使わないセマンティックアノテーション。デジタル人文学の研究者だけでなく、誰でも使えるテキストと画像のアノテーションツール サンプルデータ 国立国会図書館が公開する以下を例とします。 https://dl.ndl.go.jp/pid/2585164/1/1 使い方 Recogitoにアクセスし、画面右上の「ログイン」ボタンからログインします。 ログイン後、画面左部の「New」ボタンを押し、「From IIIF manifest」を選択します。 今回、サンプルデータとして使用する以下のマニフェストファイルを入力します。 https://dl.ndl.go.jp/api/iiif/2585164/manifest.json 以下のように、編集画面に遷移します。 その後、矩形を作成し、「Transcribe…」の箇所にテキストを入力します。 ダウンロード 画面上部のダウンロードアイコンから、各種フォーマットでエクスポートすることができます。 JSON-LDフォーマットでダウンロードした結果は以下です。Open Annotationに形式でエクスポートされました。 [ { "@context": "http://www.w3.org/ns/anno.jsonld", "id": "https://recogito.pelagios.org/annotation/82be9a93-332b-4731-a9a4-5df8359eb197", "type": "Annotation", "generator": { "id": "https://recogito.pelagios.org/", "type": "Software", "name": "Recogito", "homepage": "https://recogito.pelagios.org/" }, "generated": "2025-07-23T06:23:59+00:00", "body": [ { "type": "TextualBody", "value": "御座候処貴地御揃奉仕請覚重候時御座候", "creator": "https://recogito.pelagios.org/satoru196", "modified": "2025-07-23T06:15:01+00:00", "purpose": "transcribing" } ], "target": { "source": "https://dl.ndl.go.jp/api/iiif/2585164/R0000005", "type": "Image", "label": "5", "selector": [ { "type": "FragmentSelector", "conformsTo": "http://www.w3.org/TR/media-frags/", "value": "xywh=pixel:4103,883,341,2385" } ] } }, { "@context": "http://www.w3.org/ns/anno.jsonld", "id": "https://recogito.pelagios.org/annotation/caaa671f-79da-4a19-bc93-42a5502b4efa", "type": "Annotation", "generator": { "id": "https://recogito.pelagios.org/", "type": "Software", "name": "Recogito", "homepage": "https://recogito.pelagios.org/" }, "generated": "2025-07-23T06:23:59+00:00", "body": [ { "type": "TextualBody", "value": "一筆啓上仕候寒湿不順之気儘ニ", "creator": "https://recogito.pelagios.org/satoru196", "modified": "2025-07-23T06:12:45+00:00", "purpose": "transcribing" } ], "target": { "source": "https://dl.ndl.go.jp/api/iiif/2585164/R0000005", "type": "Image", "label": "5", "selector": [ { "type": "FragmentSelector", "conformsTo": "http://www.w3.org/TR/media-frags/", "value": "xywh=pixel:4319,901,360,2377" } ] } } ] まとめ Recogitoを用いたテキストアノテーションにあたり、参考になりましたら幸いです。 ...

Transkuribusを試す

Transkuribusを試す

概要 Transkuribusを用いたテキストアノテーションを試す機会がありましたので、備忘録です。 Transkuribusは以下です。 https://www.transkribus.org/ 以下のように説明されています。 Transkribus enables you to automatically recognise text easily, edit seamlessly, collaborate effortlessly, and even train your custom AI for digitizing and interpreting historical documents of any form. (機械翻訳)あらゆる形式の歴史的文書をデジタル化・解釈するために、テキストの自動認識、シームレスな編集、効率的なコラボレーション、さらにカスタムAIのトレーニングまでを可能にするツール 参考 Transkuribusの日本語による説明として、以下が大変参考になりました。 https://connectivity.aa-ken.jp/ja/newsletter/588/index.html 一方、上記のページでご紹介いただいているデスクトップ版である「Transkribus eXpert」は、deprecatedになっていました。 https://help.transkribus.org/downloading-and-installing-transkribus-expert-deprecated Please note that Transkribus eXpert (desktop software) is no longer being updated, and all new features will be exclusively available on the Transkribus web app. サンプルデータ Recogitoについても、以下の使い方の記事を作成しました。 ...

NDL古典籍OCR-Liteを用いて、IIIFマニフェストファイルからTEI/XMLファイルを作成する

NDL古典籍OCR-Liteを用いて、IIIFマニフェストファイルからTEI/XMLファイルを作成する

概要 NDL古典籍OCR-Liteを用いて、IIIFマニフェストファイルからTEI/XMLファイルを作成するGradioアプリの紹介です。 以下のURLからアクセスできます。 https://nakamura196-ndlkotenocr-lite-iiif.hf.space/ 背景 以下の記事の続きです。 これまでは、2つのアプリを使用する必要がありましたが、今回の改修により、単独のGradioアプリで変換作業が完結するようにしました。 また画像のコマ数が多いマニフェストファイルを処理する場合、進捗がわかりにくいことや、処理結果をコピーできない、といった不具合があったので、これらを修正しています。 画面の例 以下のように、「ページ 111/129 を処理中… - 79.7%」といった進捗を表示するように修正しました。 実装にあたっては、Progressを使用しています。 https://www.gradio.app/docs/gradio/progress またOCR完了後は、TEI/XMLファイルをダウンロードするためのリンクが表示されるようにしました。 まとめ Hugging Faceの無料で利用可能なCPUの制約上、OCRに時間がかかることがありますが、参考になりましたら幸いです。

その2:NDL古典籍OCR-Liteを用いたアノテーション付きIIIFマニフェストファイルとTEI/XMLファイルの作成

その2:NDL古典籍OCR-Liteを用いたアノテーション付きIIIFマニフェストファイルとTEI/XMLファイルの作成

概要 以下の記事で、NDL古典籍OCR-Liteを用いたアノテーション付きIIIFマニフェストファイルとTEI/XMLファイルの作成について紹介しました。 上記について、説明が不十分な点が多かったため、改めて使い方を紹介いたします。 補足 今回の記事執筆に合わせて、以下の改修を加えました。 プロセス1: IIIFマニフェストファイルの作成 IIIF Presentation API v3に対応しました。 プロセス2: TEI/XMLファイルの作成 プロセス1との接続を考慮して、文字列を入力とするフォームを追加 使い方 プロセス1: IIIFマニフェストファイルの作成 以下にアクセスします。 https://nakamura196-ndlkotenocr-lite-iiif.hf.space/ 今回は、IIIF Presentation API v3でマニフェストファイルが公開されている「東北大学総合知デジタルアーカイブ」を対象とします。以下の「源氏物語湖月抄 本居宣長自筆付箋及書入」を対象とします。 https://touda.tohoku.ac.jp/portal/item/10010030012489 IIIFマニフェストファイルのURLは以下です。 https://touda.tohoku.ac.jp/collection/iiif/0/metadata/10010030012489/manifest.json 以下のように入力します。注意点として、「Image Width」を-1に設定してください。これにより、最大ピクセルの画像をダウンロードするようになります。(デフォルト値である1200ピクセルではエラーとなります。) 結果、OCRテキストをアノテーションとして持つIIIFマニフェストファイルのJSON文字列が画面右側に表示されます。以下の赤字で示すコピーボタンを押して、文字列をコピーしておきます。 プロセス2: TEI/XMLファイルの作成 以下にアクセスします。 https://iiif-tei-monorepo-web.vercel.app/ コピーしたJSON文字列を「Paste Manifest JSON」というフォームに貼り付け、Convert to TEI XMLボタンを押します。 結果、TEIに変換され、XMLファイルをダウンロードできます。 Oxygen XML EditorのAuthorモードで表示した例が以下です。 まとめ 使いにくい点も多いかと思いますが、OCRとIIIF・TEIの応用にあたり、参考になりましたら幸いです。

Omeka SのIIIF Serverモジュールを使用した階層構造を持つ目次の記述

Omeka SのIIIF Serverモジュールを使用した階層構造を持つ目次の記述

概要 Omeka SのIIIF Serverモジュールを使用し、階層構造を持つ目次の記述方法について紹介します。 マニュアル やや複雑な記述になっていますが、以下に説明があります。 https://github.com/Daniel-KM/Omeka-S-module-IiifServer?tab=readme-ov-file#input-format-of-the-property-for-structures-table-of-contents 単純な目次 「Toyo Bunko Media Repository」で公開されている以下を例とします。 https://app.toyobunko-lab.jp/s/main/document/9f9d95c2-d33d-7402-742b-47db12748688 以下のように、{RangeのID},{Rangeの名前},{Canvasのインデックス}を指定します。 r1,延享、寛延、宝暦,1 r2,明和,25 r3,安永一,55 r4,安永二,79 r5,天明一,110 r6,天明二,142 r7,寛政一,177 r8,寛政二,218 r9,享和,255 r10,文化一,279 r11,文化、文政、二,313 これにより、以下のように目次が表示されます。 階層構造を持つ目次 以下を例とします。 https://app.toyobunko-lab.jp/s/main/document/4797b8ca-530f-8aae-f252-7911ad64039b 階層構造を持つ目次を記述する場合には、以下のように4列でデータを用意します。 r0, 全体,-, r1;r2;r29;r55;r73 r1, 目次, 4-8, - r2, 第一、 蒙疆政府ノ司法制度…一頁, -, r3;r4;r9;r14;r15 r3, 一、 司法制度ノ沿革…一, 8-10, - r4, 二、 司法關係機關…四, -, r5;r6;r7;r8 r5, (一) 司法部…四, 10, - r6, (二) 法院…四, 10-11, - r7, (三) 縣旗司法機關…六, 11, - r8, (四) 行刑機關…七, 11-12, - r9, 三、 司法事務…八, -, r10;r11;r12;r13 r10, (一) 刑事事件…八, 12, - r11, (二) 民事事件…九, 12, - r12, (三) 行刑事務…九, 12-14, - r13, (四) 登記…一二, 14-15, - r14, 四、 司法經費…一四, 15-16, - 4列目に子要素となるRangeのIDを指定します。インデントを含めると、以下のような形になります。 ...

IIIF Presentation API v2のIIIFコレクションで、ページネーションを使う

IIIF Presentation API v2のIIIFコレクションで、ページネーションを使う

概要 IIIF Presentation API v2のIIIFコレクションで、ページネーションを使う機会がありましたので、備忘録です。 背景 IIIFコレクションでは、以下のように、複数のマニフェストファイル(およびコレクション)の一覧を提供することができます。 https://iiif.io/api/presentation/2.1/#collection { "@context": "http://iiif.io/api/presentation/2/context.json", "@id": "http://example.org/iiif/collection/top", "@type": "sc:Collection", "label": "Top Level Collection for Example Organization", "viewingHint": "top", "description": "Description of Collection", "attribution": "Provided by Example Organization", "manifests": [ { "@id": "http://example.org/iiif/book1/manifest", "@type": "sc:Manifest", "label": "Book 1" } ] } この時、対象とするマニフェストファイルが多数になった場合、一つのIIIFコレクションでは配信が難しくなりました。 これに対して、以下でページネーションに関する仕様がありましたので、こちらを使ってみます。 https://iiif.io/api/presentation/2.1/#paging ページネーション 上記のページでは、以下のような例が紹介されていました。 { "@context": "http://iiif.io/api/presentation/2/context.json", "@id": "http://example.org/iiif/collection/top", "@type": "sc:Collection", "label": "Example Big Collection", "total": 9316290, "first": "http://example.org/iiif/collection/c1" } { "@context": "http://iiif.io/api/presentation/2/context.json", "@id": "http://example.org/iiif/collection/c1", "@type": "sc:Collection", "within": "http://example.org/iiif/collection/top", "startIndex": 0, "next": "http://example.org/iiif/collection/c2", "manifests": [ // Manifests live here ... ] } まず、一つの目のJSONでコレクション全体のマニフェストファイル数totalを示し、さらにはじめの部分マニフェストファイル群へのリンクをfirstで提示します。 ...

NDL古典籍OCR-Liteを用いたアノテーション付きIIIFマニフェストファイルとTEI/XMLファイルの作成

NDL古典籍OCR-Liteを用いたアノテーション付きIIIFマニフェストファイルとTEI/XMLファイルの作成

お知らせ 本記事で紹介する流れをわかりやすくした記事を作成しました。以下も参考にしてください。 概要 NDL古典籍OCR-Liteを用いたアノテーション付きIIIFマニフェストファイルとTEI/XMLファイルの作成を行うツールを試作したので紹介します。 アノテーション付きIIIFマニフェストファイルの作成 まず、NDL古典籍OCR-Liteを用いて、IIIFマニフェストファイルを入力として、アノテーション付きIIIFマニフェストファイルを出力するGradioアプリを作成しました。Hugging FaceのSpaceを用いて公開しています。 https://nakamura196-ndlkotenocr-lite-iiif.hf.space/ 出力結果として、以下のようなアノテーション付きIIIFマニフェストファイルが得られます。 { "@context": "http://iiif.io/api/presentation/3/context.json", "id": "https://dl.ndl.go.jp/api/iiif/3437686/manifest.json", "type": "Manifest", "label": { "none": [ "校異源氏物語. 巻一" ] }, "items": [ { "id": "https://dl.ndl.go.jp/api/iiif/3437686/canvas/1", "type": "Canvas", "width": 6890, "height": 4706, "label": { "none": [ "1" ] }, "items": [ { "id": "https://dl.ndl.go.jp/api/iiif/3437686/canvas/1/page", "type": "AnnotationPage", "items": [ { "id": "https://dl.ndl.go.jp/api/iiif/3437686/canvas/1/page/imageanno", "type": "Annotation", "motivation": "sc:painting", "target": "https://dl.ndl.go.jp/api/iiif/3437686/canvas/1", "body": { "id": "https://dl.ndl.go.jp/api/iiif/3437686/R0000001/full/full/0/default.jpg", "type": "Image", "format": "image/jpeg", "width": 6890, "height": 4706, "service": [ { "id": "https://dl.ndl.go.jp/api/iiif/3437686/R0000001", "type": "ImageService2", "profile": "level2" } ] } } ] } ], "annotations": [ { "id": "https://dl.ndl.go.jp/api/iiif/3437686/canvas/1/annos", "type": "AnnotationPage", "items": [ { "id": "https://dl.ndl.go.jp/api/iiif/3437686/canvas/1/annos/0", "type": "Annotation", "motivation": "commenting", "target": "https://dl.ndl.go.jp/api/iiif/3437686/canvas/1#xywh=5270,275,114,935", "body": { "type": "TextualBody", "value": "一・〇・・・・・・一一一一・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・" } }, { "id": "https://dl.ndl.go.jp/api/iiif/3437686/canvas/1/annos/1", "type": "Annotation", "motivation": "commenting", "target": "https://dl.ndl.go.jp/api/iiif/3437686/canvas/1#xywh=5293,2009,218,424", "body": { "type": "TextualBody", "value": "○〇" } }, { "id": "https://dl.ndl.go.jp/api/iiif/3437686/canvas/1/annos/2", "type": "Annotation", "motivation": "commenting", "target": "https://dl.ndl.go.jp/api/iiif/3437686/canvas/1#xywh=5092,3272,63,80", "body": { "type": "TextualBody", "value": "一一" } }, { "id": "https://dl.ndl.go.jp/api/iiif/3437686/canvas/1/annos/3", "type": "Annotation", "motivation": "commenting", "target": "https://dl.ndl.go.jp/api/iiif/3437686/canvas/1#xywh=4375,304,103,1475", "body": { "type": "TextualBody", "value": "ス〇〇〇六〇〇〇一〇〇〇〇〇〇〇一一一〇〇〇一一一一〇〇〇〇〇〇〇〇〇〇一一・〇〇・・・・・・・の〇〇・・・・一・・・" } }, { "id": "https://dl.ndl.go.jp/api/iiif/3437686/canvas/1/annos/4", "type": "Annotation", "motivation": "commenting", "target": "https://dl.ndl.go.jp/api/iiif/3437686/canvas/1#xywh=4375,2853,45,522", "body": { "type": "TextualBody", "value": "□琉球□□□□□□□□□□□□□□□□□" } }, { "id": "https://dl.ndl.go.jp/api/iiif/3437686/canvas/1/annos/5", "type": "Annotation", "motivation": "commenting", "target": "https://dl.ndl.go.jp/api/iiif/3437686/canvas/1#xywh=4283,2756,63,252", "body": { "type": "TextualBody", "value": "〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇〇一〇〇一〇〇〇" } }, { "id": "https://dl.ndl.go.jp/api/iiif/3437686/canvas/1/annos/6", "type": "Annotation", "motivation": "commenting", "target": "https://dl.ndl.go.jp/api/iiif/3437686/canvas/1#xywh=694,499,310,2991", "body": { "type": "TextualBody", "value": "同校異源氏物巻一" } } ] } ] }, { "id": "https://dl.ndl.go.jp/api/iiif/3437686/canvas/2", "type": "Canvas", "width": 6890, "height": 4706, "label": { "none": [ "2" ] }, "items": [ { "id": "https://dl.ndl.go.jp/api/iiif/3437686/canvas/2/page", "type": "AnnotationPage", "items": [ { "id": "https://dl.ndl.go.jp/api/iiif/3437686/canvas/2/page/imageanno", "type": "Annotation", "motivation": "sc:painting", "target": "https://dl.ndl.go.jp/api/iiif/3437686/canvas/2", "body": { "id": "https://dl.ndl.go.jp/api/iiif/3437686/R0000002/full/full/0/default.jpg", "type": "Image", "format": "image/jpeg", "width": 6890, "height": 4706, "service": [ { "id": "https://dl.ndl.go.jp/api/iiif/3437686/R0000002", "type": "ImageService2", "profile": "level2" } ] } } ] } ], "annotations": [ { "id": "https://dl.ndl.go.jp/api/iiif/3437686/canvas/2/annos", "type": "AnnotationPage", "items": [] } ] } ] } TEI/XMLファイルの作成 上記で得られたアノテーション付きIIIFマニフェストファイルを入力として、TEI/XMLファイルを作成するライブラリを作成しました。 ...

IIIFマニフェストファイルから画像URLの一覧を含むCSVファイルを作成する

IIIFマニフェストファイルから画像URLの一覧を含むCSVファイルを作成する

概要 IIIFマニフェストファイルから画像URLの一覧を含むCSVファイルを作成するアプリを作成したので備忘録です。 以下からアクセスいただけます。 https://iiif-demo-next.vercel.app/csv-converter 使い方 国立国会図書館所蔵の「校異源氏物語. 巻一」を対象とします。 https://dl.ndl.go.jp/api/iiif/3437686/manifest.json 以下のフォームにマニフェストファイルのURLを入力し、「CSVをダウンロード」ボタンを押します。 結果、以下のように、URLやサイズの情報を含むCSVファイルがダウンロードされます。 url,width,height,canvas https://dl.ndl.go.jp/api/iiif/3437686/R0000001/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/1 https://dl.ndl.go.jp/api/iiif/3437686/R0000002/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/2 https://dl.ndl.go.jp/api/iiif/3437686/R0000003/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/3 https://dl.ndl.go.jp/api/iiif/3437686/R0000004/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/4 https://dl.ndl.go.jp/api/iiif/3437686/R0000005/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/5 https://dl.ndl.go.jp/api/iiif/3437686/R0000006/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/6 https://dl.ndl.go.jp/api/iiif/3437686/R0000007/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/7 https://dl.ndl.go.jp/api/iiif/3437686/R0000008/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/8 https://dl.ndl.go.jp/api/iiif/3437686/R0000009/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/9 https://dl.ndl.go.jp/api/iiif/3437686/R0000010/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/10 https://dl.ndl.go.jp/api/iiif/3437686/R0000011/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/11 https://dl.ndl.go.jp/api/iiif/3437686/R0000012/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/12 https://dl.ndl.go.jp/api/iiif/3437686/R0000013/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/13 https://dl.ndl.go.jp/api/iiif/3437686/R0000014/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/14 https://dl.ndl.go.jp/api/iiif/3437686/R0000015/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/15 https://dl.ndl.go.jp/api/iiif/3437686/R0000016/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/16 https://dl.ndl.go.jp/api/iiif/3437686/R0000017/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/17 https://dl.ndl.go.jp/api/iiif/3437686/R0000018/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/18 https://dl.ndl.go.jp/api/iiif/3437686/R0000019/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/19 https://dl.ndl.go.jp/api/iiif/3437686/R0000020/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/20 https://dl.ndl.go.jp/api/iiif/3437686/R0000021/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/21 https://dl.ndl.go.jp/api/iiif/3437686/R0000022/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/22 https://dl.ndl.go.jp/api/iiif/3437686/R0000023/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/23 https://dl.ndl.go.jp/api/iiif/3437686/R0000024/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/24 https://dl.ndl.go.jp/api/iiif/3437686/R0000025/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/25 https://dl.ndl.go.jp/api/iiif/3437686/R0000026/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/26 https://dl.ndl.go.jp/api/iiif/3437686/R0000027/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/27 https://dl.ndl.go.jp/api/iiif/3437686/R0000028/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/28 https://dl.ndl.go.jp/api/iiif/3437686/R0000029/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/29 https://dl.ndl.go.jp/api/iiif/3437686/R0000030/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/30 https://dl.ndl.go.jp/api/iiif/3437686/R0000031/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/31 https://dl.ndl.go.jp/api/iiif/3437686/R0000032/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/32 https://dl.ndl.go.jp/api/iiif/3437686/R0000033/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/33 https://dl.ndl.go.jp/api/iiif/3437686/R0000034/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/34 https://dl.ndl.go.jp/api/iiif/3437686/R0000035/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/35 https://dl.ndl.go.jp/api/iiif/3437686/R0000036/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/36 https://dl.ndl.go.jp/api/iiif/3437686/R0000037/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/37 https://dl.ndl.go.jp/api/iiif/3437686/R0000038/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/38 https://dl.ndl.go.jp/api/iiif/3437686/R0000039/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/39 https://dl.ndl.go.jp/api/iiif/3437686/R0000040/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/40 https://dl.ndl.go.jp/api/iiif/3437686/R0000041/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/41 https://dl.ndl.go.jp/api/iiif/3437686/R0000042/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/42 https://dl.ndl.go.jp/api/iiif/3437686/R0000043/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/43 https://dl.ndl.go.jp/api/iiif/3437686/R0000044/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/44 https://dl.ndl.go.jp/api/iiif/3437686/R0000045/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/45 https://dl.ndl.go.jp/api/iiif/3437686/R0000046/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/46 https://dl.ndl.go.jp/api/iiif/3437686/R0000047/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/47 https://dl.ndl.go.jp/api/iiif/3437686/R0000048/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/48 https://dl.ndl.go.jp/api/iiif/3437686/R0000049/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/49 https://dl.ndl.go.jp/api/iiif/3437686/R0000050/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/50 https://dl.ndl.go.jp/api/iiif/3437686/R0000051/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/51 https://dl.ndl.go.jp/api/iiif/3437686/R0000052/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/52 https://dl.ndl.go.jp/api/iiif/3437686/R0000053/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/53 https://dl.ndl.go.jp/api/iiif/3437686/R0000054/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/54 https://dl.ndl.go.jp/api/iiif/3437686/R0000055/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/55 https://dl.ndl.go.jp/api/iiif/3437686/R0000056/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/56 https://dl.ndl.go.jp/api/iiif/3437686/R0000057/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/57 https://dl.ndl.go.jp/api/iiif/3437686/R0000058/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/58 https://dl.ndl.go.jp/api/iiif/3437686/R0000059/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/59 https://dl.ndl.go.jp/api/iiif/3437686/R0000060/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/60 https://dl.ndl.go.jp/api/iiif/3437686/R0000061/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/61 https://dl.ndl.go.jp/api/iiif/3437686/R0000062/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/62 https://dl.ndl.go.jp/api/iiif/3437686/R0000063/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/63 https://dl.ndl.go.jp/api/iiif/3437686/R0000064/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/64 https://dl.ndl.go.jp/api/iiif/3437686/R0000065/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/65 https://dl.ndl.go.jp/api/iiif/3437686/R0000066/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/66 https://dl.ndl.go.jp/api/iiif/3437686/R0000067/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/67 https://dl.ndl.go.jp/api/iiif/3437686/R0000068/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/68 https://dl.ndl.go.jp/api/iiif/3437686/R0000069/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/69 https://dl.ndl.go.jp/api/iiif/3437686/R0000070/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/70 https://dl.ndl.go.jp/api/iiif/3437686/R0000071/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/71 https://dl.ndl.go.jp/api/iiif/3437686/R0000072/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/72 https://dl.ndl.go.jp/api/iiif/3437686/R0000073/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/73 https://dl.ndl.go.jp/api/iiif/3437686/R0000074/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/74 https://dl.ndl.go.jp/api/iiif/3437686/R0000075/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/75 https://dl.ndl.go.jp/api/iiif/3437686/R0000076/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/76 https://dl.ndl.go.jp/api/iiif/3437686/R0000077/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/77 https://dl.ndl.go.jp/api/iiif/3437686/R0000078/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/78 https://dl.ndl.go.jp/api/iiif/3437686/R0000079/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/79 https://dl.ndl.go.jp/api/iiif/3437686/R0000080/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/80 https://dl.ndl.go.jp/api/iiif/3437686/R0000081/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/81 https://dl.ndl.go.jp/api/iiif/3437686/R0000082/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/82 https://dl.ndl.go.jp/api/iiif/3437686/R0000083/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/83 https://dl.ndl.go.jp/api/iiif/3437686/R0000084/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/84 https://dl.ndl.go.jp/api/iiif/3437686/R0000085/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/85 https://dl.ndl.go.jp/api/iiif/3437686/R0000086/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/86 https://dl.ndl.go.jp/api/iiif/3437686/R0000087/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/87 https://dl.ndl.go.jp/api/iiif/3437686/R0000088/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/88 https://dl.ndl.go.jp/api/iiif/3437686/R0000089/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/89 https://dl.ndl.go.jp/api/iiif/3437686/R0000090/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/90 https://dl.ndl.go.jp/api/iiif/3437686/R0000091/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/91 https://dl.ndl.go.jp/api/iiif/3437686/R0000092/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/92 https://dl.ndl.go.jp/api/iiif/3437686/R0000093/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/93 https://dl.ndl.go.jp/api/iiif/3437686/R0000094/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/94 https://dl.ndl.go.jp/api/iiif/3437686/R0000095/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/95 https://dl.ndl.go.jp/api/iiif/3437686/R0000096/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/96 https://dl.ndl.go.jp/api/iiif/3437686/R0000097/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/97 https://dl.ndl.go.jp/api/iiif/3437686/R0000098/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/98 https://dl.ndl.go.jp/api/iiif/3437686/R0000099/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/99 https://dl.ndl.go.jp/api/iiif/3437686/R0000100/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/100 https://dl.ndl.go.jp/api/iiif/3437686/R0000101/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/101 https://dl.ndl.go.jp/api/iiif/3437686/R0000102/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/102 https://dl.ndl.go.jp/api/iiif/3437686/R0000103/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/103 https://dl.ndl.go.jp/api/iiif/3437686/R0000104/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/104 https://dl.ndl.go.jp/api/iiif/3437686/R0000105/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/105 https://dl.ndl.go.jp/api/iiif/3437686/R0000106/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/106 https://dl.ndl.go.jp/api/iiif/3437686/R0000107/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/107 https://dl.ndl.go.jp/api/iiif/3437686/R0000108/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/108 https://dl.ndl.go.jp/api/iiif/3437686/R0000109/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/109 https://dl.ndl.go.jp/api/iiif/3437686/R0000110/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/110 https://dl.ndl.go.jp/api/iiif/3437686/R0000111/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/111 https://dl.ndl.go.jp/api/iiif/3437686/R0000112/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/112 https://dl.ndl.go.jp/api/iiif/3437686/R0000113/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/113 https://dl.ndl.go.jp/api/iiif/3437686/R0000114/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/114 https://dl.ndl.go.jp/api/iiif/3437686/R0000115/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/115 https://dl.ndl.go.jp/api/iiif/3437686/R0000116/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/116 https://dl.ndl.go.jp/api/iiif/3437686/R0000117/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/117 https://dl.ndl.go.jp/api/iiif/3437686/R0000118/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/118 https://dl.ndl.go.jp/api/iiif/3437686/R0000119/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/119 https://dl.ndl.go.jp/api/iiif/3437686/R0000120/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/120 https://dl.ndl.go.jp/api/iiif/3437686/R0000121/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/121 https://dl.ndl.go.jp/api/iiif/3437686/R0000122/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/122 https://dl.ndl.go.jp/api/iiif/3437686/R0000123/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/123 https://dl.ndl.go.jp/api/iiif/3437686/R0000124/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/124 https://dl.ndl.go.jp/api/iiif/3437686/R0000125/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/125 https://dl.ndl.go.jp/api/iiif/3437686/R0000126/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/126 https://dl.ndl.go.jp/api/iiif/3437686/R0000127/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/127 https://dl.ndl.go.jp/api/iiif/3437686/R0000128/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/128 https://dl.ndl.go.jp/api/iiif/3437686/R0000129/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/129 https://dl.ndl.go.jp/api/iiif/3437686/R0000130/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/130 https://dl.ndl.go.jp/api/iiif/3437686/R0000131/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/131 https://dl.ndl.go.jp/api/iiif/3437686/R0000132/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/132 https://dl.ndl.go.jp/api/iiif/3437686/R0000133/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/133 https://dl.ndl.go.jp/api/iiif/3437686/R0000134/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/134 https://dl.ndl.go.jp/api/iiif/3437686/R0000135/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/135 https://dl.ndl.go.jp/api/iiif/3437686/R0000136/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/136 https://dl.ndl.go.jp/api/iiif/3437686/R0000137/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/137 https://dl.ndl.go.jp/api/iiif/3437686/R0000138/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/138 https://dl.ndl.go.jp/api/iiif/3437686/R0000139/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/139 https://dl.ndl.go.jp/api/iiif/3437686/R0000140/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/140 https://dl.ndl.go.jp/api/iiif/3437686/R0000141/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/141 https://dl.ndl.go.jp/api/iiif/3437686/R0000142/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/142 https://dl.ndl.go.jp/api/iiif/3437686/R0000143/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/143 https://dl.ndl.go.jp/api/iiif/3437686/R0000144/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/144 https://dl.ndl.go.jp/api/iiif/3437686/R0000145/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/145 https://dl.ndl.go.jp/api/iiif/3437686/R0000146/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/146 https://dl.ndl.go.jp/api/iiif/3437686/R0000147/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/147 https://dl.ndl.go.jp/api/iiif/3437686/R0000148/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/148 https://dl.ndl.go.jp/api/iiif/3437686/R0000149/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/149 https://dl.ndl.go.jp/api/iiif/3437686/R0000150/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/150 https://dl.ndl.go.jp/api/iiif/3437686/R0000151/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/151 https://dl.ndl.go.jp/api/iiif/3437686/R0000152/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/152 https://dl.ndl.go.jp/api/iiif/3437686/R0000153/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/153 https://dl.ndl.go.jp/api/iiif/3437686/R0000154/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/154 https://dl.ndl.go.jp/api/iiif/3437686/R0000155/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/155 https://dl.ndl.go.jp/api/iiif/3437686/R0000156/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/156 https://dl.ndl.go.jp/api/iiif/3437686/R0000157/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/157 https://dl.ndl.go.jp/api/iiif/3437686/R0000158/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/158 https://dl.ndl.go.jp/api/iiif/3437686/R0000159/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/159 https://dl.ndl.go.jp/api/iiif/3437686/R0000160/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/160 https://dl.ndl.go.jp/api/iiif/3437686/R0000161/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/161 https://dl.ndl.go.jp/api/iiif/3437686/R0000162/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/162 https://dl.ndl.go.jp/api/iiif/3437686/R0000163/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/163 https://dl.ndl.go.jp/api/iiif/3437686/R0000164/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/164 https://dl.ndl.go.jp/api/iiif/3437686/R0000165/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/165 https://dl.ndl.go.jp/api/iiif/3437686/R0000166/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/166 https://dl.ndl.go.jp/api/iiif/3437686/R0000167/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/167 https://dl.ndl.go.jp/api/iiif/3437686/R0000168/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/168 https://dl.ndl.go.jp/api/iiif/3437686/R0000169/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/169 https://dl.ndl.go.jp/api/iiif/3437686/R0000170/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/170 https://dl.ndl.go.jp/api/iiif/3437686/R0000171/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/171 https://dl.ndl.go.jp/api/iiif/3437686/R0000172/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/172 https://dl.ndl.go.jp/api/iiif/3437686/R0000173/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/173 https://dl.ndl.go.jp/api/iiif/3437686/R0000174/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/174 https://dl.ndl.go.jp/api/iiif/3437686/R0000175/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/175 https://dl.ndl.go.jp/api/iiif/3437686/R0000176/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/176 https://dl.ndl.go.jp/api/iiif/3437686/R0000177/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/177 https://dl.ndl.go.jp/api/iiif/3437686/R0000178/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/178 https://dl.ndl.go.jp/api/iiif/3437686/R0000179/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/179 https://dl.ndl.go.jp/api/iiif/3437686/R0000180/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/180 https://dl.ndl.go.jp/api/iiif/3437686/R0000181/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/181 https://dl.ndl.go.jp/api/iiif/3437686/R0000182/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/182 https://dl.ndl.go.jp/api/iiif/3437686/R0000183/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/183 https://dl.ndl.go.jp/api/iiif/3437686/R0000184/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/184 https://dl.ndl.go.jp/api/iiif/3437686/R0000185/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/185 https://dl.ndl.go.jp/api/iiif/3437686/R0000186/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/186 https://dl.ndl.go.jp/api/iiif/3437686/R0000187/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/187 https://dl.ndl.go.jp/api/iiif/3437686/R0000188/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/188 https://dl.ndl.go.jp/api/iiif/3437686/R0000189/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/189 https://dl.ndl.go.jp/api/iiif/3437686/R0000190/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/190 https://dl.ndl.go.jp/api/iiif/3437686/R0000191/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/191 https://dl.ndl.go.jp/api/iiif/3437686/R0000192/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/192 https://dl.ndl.go.jp/api/iiif/3437686/R0000193/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/193 https://dl.ndl.go.jp/api/iiif/3437686/R0000194/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/194 https://dl.ndl.go.jp/api/iiif/3437686/R0000195/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/195 https://dl.ndl.go.jp/api/iiif/3437686/R0000196/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/196 https://dl.ndl.go.jp/api/iiif/3437686/R0000197/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/197 https://dl.ndl.go.jp/api/iiif/3437686/R0000198/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/198 https://dl.ndl.go.jp/api/iiif/3437686/R0000199/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/199 https://dl.ndl.go.jp/api/iiif/3437686/R0000200/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/200 https://dl.ndl.go.jp/api/iiif/3437686/R0000201/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/201 https://dl.ndl.go.jp/api/iiif/3437686/R0000202/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/202 https://dl.ndl.go.jp/api/iiif/3437686/R0000203/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/203 https://dl.ndl.go.jp/api/iiif/3437686/R0000204/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/204 https://dl.ndl.go.jp/api/iiif/3437686/R0000205/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/205 https://dl.ndl.go.jp/api/iiif/3437686/R0000206/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/206 https://dl.ndl.go.jp/api/iiif/3437686/R0000207/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/207 https://dl.ndl.go.jp/api/iiif/3437686/R0000208/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/208 https://dl.ndl.go.jp/api/iiif/3437686/R0000209/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/209 https://dl.ndl.go.jp/api/iiif/3437686/R0000210/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/210 https://dl.ndl.go.jp/api/iiif/3437686/R0000211/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/211 https://dl.ndl.go.jp/api/iiif/3437686/R0000212/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/212 https://dl.ndl.go.jp/api/iiif/3437686/R0000213/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/213 https://dl.ndl.go.jp/api/iiif/3437686/R0000214/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/214 https://dl.ndl.go.jp/api/iiif/3437686/R0000215/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/215 https://dl.ndl.go.jp/api/iiif/3437686/R0000216/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/216 https://dl.ndl.go.jp/api/iiif/3437686/R0000217/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/217 https://dl.ndl.go.jp/api/iiif/3437686/R0000218/info.json,6890,4706,https://dl.ndl.go.jp/api/iiif/3437686/canvas/218 メモ 以下の記事で、@iiif/parserというnpmモジュールを紹介しました。 ...

IIIF画像に対する多角形アノテーション支援ツールの改修

IIIF画像に対する多角形アノテーション支援ツールの改修

概要 IIIF画像に対する多角形アノテーション支援ツール「IIIF Annotator」の改修を行いました。具体的には、以下の2点に取り組みました。 Image Server未使用のマニフェストファイルへの対応 アノテーション付きIIIFマニフェストファイルのエクスポート機能 TEI/XMLファイルのエクスポート機能 以下、これらの改修について説明します。 背景 以下の記事で、アノテーション付与ツールを新規に作成した理由等を説明しました。 今回追加した機能は他のツールでも提供されている機能群になりますが、利便性向上のため追加実装しました。 Image Server未使用のマニフェストファイルへの対応 以下の記事で紹介しているように、IIIFマニフェストファイルにおいて、Image API(Image Server)を使用しないオプションを取ることができます。デメリットもありますが、Cantaloupe Image Serverなどのソフトウェアを導入せずに使用できる点に利点があります。 IIIF Annotatorについて、これまではImage Serverの使用を前提として実装していましたが、今回の改修により、Image Server未使用のマニフェストファイルも読み込めるようにしました。 具体的には以下のように、serviceの有無に応じて、OpenSeadragonに渡すtileSourcesを調整しました。 const tileSources = canvases .map((canvas: Canvas) => { const annotationPage = canvas.items?.[0]; const annotation = annotationPage?.items?.[0]; if (!annotation) return null; const body = annotation.body as { id: string; service?: { "@id": string }[]; }; if (body.service && body.service.length > 0) { return body.service[0]["@id"] + "/info.json"; } else { return { type: "image", url: body.id, }; } }) .filter( (tileSource: string | { type: string; url: string } | null) => tileSource !== null ); エクスポート機能 アノテーション付きIIIFマニフェストファイル、およびTEI/XMLファイルとしてエクスポートする機能を追加しました。エクスポートボタンを押すと、以下のような選択肢が表示されます。 アノテーション付きIIIFマニフェストファイルの用途としては、ダウンロードしたファイルをMirador等に読み込ませることで、アノテーション結果を確認することができます。 またTEI/XMLファイルについては、Oxygen XML Editorの作者モード等を使って、アノテーション結果を確認することができます。 まとめ IIIFのアノテーション結果の活用にあたり、参考になりましたら幸いです。

IIIFの多角形アノテーションをTEI/XMLで表現する一例

IIIFの多角形アノテーションをTEI/XMLで表現する一例

概要 IIIFの多角形アノテーションをTEI/XMLで表現する一例について紹介します。 方法 TEI/XMLでは、zoneタグとpoints属性を使用して、多角形のアノテーションを表現することができます。 https://www.tei-c.org/release/doc/tei-p5-doc/en/html/ref-teidata.point.html 例 動作確認のため、以下の記事で紹介したアノテーションツールに、TEI/XML形式でのエクスポート機能を追加しました。 具体的には、以下のようなダウンロード時のオプションを追加しました。 ダウンロード結果として得られるTEI/XMLの例は以下です。ulx, uly, lrx, lryで矩形を記述しつつ、pointsで多角形の情報を記述しています。 <?xml version="1.0" encoding="utf-8"?> <?xml-model href="http://www.tei-c.org/release/xml/tei/custom/schema/relaxng/tei_all.rng" type="application/xml" schematypens="http://relaxng.org/ns/structure/1.0"?> <?xml-model href="http://www.tei-c.org/release/xml/tei/custom/schema/relaxng/tei_all.rng" type="application/xml" schematypens="http://purl.oclc.org/dsdl/schematron"?> <TEI xmlns="http://www.tei-c.org/ns/1.0"> <teiHeader> <fileDesc> <titleStmt> <title> Title </title> </titleStmt> <publicationStmt> <p> Publication Information </p> </publicationStmt> <sourceDesc> <p> Information about the source </p> </sourceDesc> </fileDesc> </teiHeader> <text> <body> <p> Some text here. </p> </body> </text> <facsimile sameAs="https://dl.ndl.go.jp/api/iiif/3437686/manifest.json"> <surface sameAs="https://dl.ndl.go.jp/api/iiif/3437686/canvas/1"> <graphic url="https://dl.ndl.go.jp/api/iiif/3437686/R0000001/full/full/0/default.jpg" sameAs="https://dl.ndl.go.jp/api/iiif/3437686/R0000001"/> <zone ulx="5314" uly="1983" lrx="5509" lry="2189" ana="Cを変更" points="5314,2087 5412,1984 5510,2087 5412,2190 5314,2087 5314,2087"/> <zone ulx="478" uly="307" lrx="1226" lry="3731" ana="校異源氏物語" points="478,3732 478,308 1227,308 1227,3732 478,3732"/> </surface> <surface sameAs="https://dl.ndl.go.jp/api/iiif/3437686/canvas/3"> <graphic url="https://dl.ndl.go.jp/api/iiif/3437686/R0000003/full/full/0/default.jpg" sameAs="https://dl.ndl.go.jp/api/iiif/3437686/R0000003"/> <zone ulx="2197" uly="3044" lrx="2731" lry="3573" ana="サンプル" points="2209,3045 2198,3551 2729,3575 2732,3062 2209,3045"/> <zone ulx="993" uly="3701" lrx="2849" lry="4095" ana="中央公論社蔵版" points="993,4096 993,3702 2849,3702 2849,4096 993,4096"/> </surface> </facsimile> </TEI> 以下は、Oxygen XML Editorで表示した例です。 ...

IIIF画像に対して、多角形のアノテーションを付与するツールを作成しました。

IIIF画像に対して、多角形のアノテーションを付与するツールを作成しました。

概要 IIIF画像に対して、多角形のアノテーションを付与するツールを作成しました。 https://next-fb-anno.vercel.app/ 本記事では、このツールについて説明します。 使い方 以下がトップ画面です。IIIFマニフェストファイルのURLを入力します。「入力例を使用」からもお試しいただけます。『百鬼夜行図』(東京大学総合図書館所蔵)を使用しています。 以下のようなアノテーション登録画面が表示されます。 画面右上のログインボタンからログインできます。 アノテーション付与の方法は、以下の動画を参考にしてください。 https://youtu.be/9RMqaXTaOzE 開発した背景 以下の記事で説明したように、Mirador 3の mirador-annotations プラグイン向けに、Firestore用のアダプタを開発しました。 このmirador-annotations プラグインについて、多角形のアノテーション付与を行いづらいという意見がありました。 そこで、主に多角形のアノテーション付与を支援するために、本ツールを開発しました。また、アノテーション付与を実装するためのライブラリであるAnnotoriousについて、Reactライブラリが公開されていたので、この調査も兼ねて実装しました。 https://annotorious.dev/react/openseadragon-iiif/ さらに、上記の記事で紹介したmirador-annotations プラグインのFirestore用のアダプタを流用することで、同じFirebaseのサービス(AuthenticationとFirestore)を使用するようにしました。 そのため、本ツールの右上のボタンに、Miradorへのリンクを付与しました。 これにより、本ツールで編集を行い、IIIFマニフェストファイルのメタデータを含む、情報の表示にはMiradorを使用する、といった使い方が可能になるかと思います。 多角形のアノテーションを付与するための既存ツール IIIF画像に対してアノテーションを付与する機能を持つ既存ツールは数多く存在します。ここでは、IIIF画像に対して多角形のアノテーションを付与する機能を有するツールと、本ツールとの差分を紹介します。 ここでは、国立国会図書館で公開されている「和泉国絵図」を例とします。 Omeka Classic + IIIF Toolkit 以下の記事でセットアップ方法や使い方を紹介しています。 https://zenn.dev/nakamura196/books/2a0aa162dcd0eb IIIF Toolkitでは、Mirador 2が使用されており、ポリゴンアノテーションが提供されています。 今回にニーズに対しては、多角形アノテーションではなくポリゴンアノテーションである点と、Omeka Classicのセットアップ(サーバの準備や維持)が必要になる点が課題として挙げられます。 Recogito Recogitoでは傾斜したボックス形式のアノテーションを付与することはできましたが、多角形のアノテーション付与はできないようでした。 また、以下のように、pctを用いてIIIF画像にアクセスするようで、画像が表示できないケースが多くありました。 Glycerine: Image Annotation Workbench 本ツールが最も今回のニーズに合致していました。 https://glycerine.io/ おそらく本ツールと同じ「Annotorious(のver.2)」が使用されており、多角形によるアノテーションのほか、複数人による共同作業も可能でした。 唯一の課題として、登録したアノテーションの一括登録機能が提供されていませんでした。この点に対して、今回開発したツールでは、読み込んだIIIFマニフェストファイルに対して、ログインユーザが登録したユーザが付与したアノテーションを一括エクスポートする機能を設けました。 これにより、本ツールで付与したアノテーションを一括エクスポートし、他の可視化ツールで使用する、といった使い方が容易になります。 なお、以下の記事で紹介したように、Mirador 3の mirador-annotations プラグインにも付与したアノテーションをダウンロードする機能が提供されています。しかい、この機能はCanvasごとにダウンロードする仕様となっており、複数ページから構成される場合には、ページごとにダウンロードする必要がありました。 工夫点および開発メモ 本ツールの開発にあたり、工夫した点などを紹介します。 入力するIIIFマニフェストのv2およびv3対応 入力するIIIFマニフェストファイルはv2とv3、どちらでも対応できるようにしました。この実現にあたり、以下の記事で紹介した@iiif/parserを使用しました。 ...