npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

ndlkotenocr-lite-worker

v1.0.1

Published

NDLKotenOCR Web版のWeb Worker対応版

Downloads

15

Readme

NDLKotenOCR-Lite Worker

Web Worker を使用した NDL 古典籍 OCR のブラウザライブラリ

NDL(国立国会図書館)古典籍 OCR を Web Worker として実装したライブラリです。バックグラウンドで OCR 処理を実行し、メイン UI をブロックしません。

インストール

npm install ndlkotenocr-lite-worker

基本的な使用方法

方法 1: getWorkerUrl() を使用した直接的な WebWorker 利用

import { getWorkerUrl } from 'ndlkotenocr-lite-worker';

// WebWorkerを作成
const worker = new Worker(getWorkerUrl(), {
  type: 'module',
});

// OCR処理の実行
const processImage = async (imageFile) => {
  // 画像をImageDataに変換
  const canvas = document.createElement('canvas');
  const ctx = canvas.getContext('2d');
  const img = new Image();

  return new Promise((resolve, reject) => {
    img.onload = () => {
      canvas.width = img.width;
      canvas.height = img.height;
      ctx.drawImage(img, 0, 0);
      const imageData = ctx.getImageData(
        0,
        0,
        canvas.width,
        canvas.height
      );

      // OCR処理開始
      worker.postMessage({
        type: 'OCR_PROCESS',
        id: Date.now().toString(),
        imageData: imageData,
        config: {
          outputFormats: ['txt', 'json', 'xml'],
        },
      });
    };

    // 結果受信
    worker.onmessage = (event) => {
      const { type, ...data } = event.data;

      switch (type) {
        case 'OCR_PROGRESS':
          console.log(
            `進捗: ${Math.round(data.progress * 100)}% - ${
              data.message
            }`
          );
          break;

        case 'OCR_COMPLETE':
          console.log('OCR完了:', data);
          resolve(data);
          break;

        case 'OCR_ERROR':
          reject(new Error(data.error));
          break;
      }
    };

    img.src = URL.createObjectURL(imageFile);
  });
};

// 初期化
worker.postMessage({ type: 'INITIALIZE' });

方法 2: 高レベル API クラスを使用(推奨)

import NDLKotenOCR from 'ndlkotenocr-lite-worker';

const ocr = new NDLKotenOCR();

// OCR処理の実行
const processImage = async (imageFile) => {
  try {
    const result = await ocr.processImage(imageFile, {
      outputFormats: ['txt', 'json', 'xml'],
      onProgress: (progress) => {
        console.log(
          `進捗: ${Math.round(
            progress.progress * 100
          )}% - ${progress.message}`
        );
      },
    });

    console.log('テキスト結果:', result.txt);
    console.log('JSON結果:', result.json);
    console.log('XML結果:', result.xml);

    return result;
  } catch (error) {
    console.error('OCR処理エラー:', error);
  }
};

// 使用後はリソースを解放
// ocr.terminate();

方法 3: 既存のヘルパー関数を使用

import {
  workerMessageHandler,
  FileHandler,
  ResultDisplay,
} from 'ndlkotenocr-lite-worker';

// Worker初期化
await workerMessageHandler.initializeWorker();

// ファイルハンドラーと結果表示の初期化
const fileHandler = new FileHandler();
const resultDisplay = new ResultDisplay();

// OCR処理
const result = await workerMessageHandler.processOCR(
  imageData,
  {
    outputFormats: ['txt', 'json', 'xml'],
  }
);

// 結果表示
resultDisplay.displayResults(result);

API リファレンス

getWorkerUrl()

WebWorker の URL を取得する関数です。

import { getWorkerUrl } from 'ndlkotenocr-lite-worker';

const workerUrl = getWorkerUrl();
const worker = new Worker(workerUrl, { type: 'module' });

NDLKotenOCR クラス

高レベルな OCR 処理 API を提供するクラスです。

コンストラクタ

const ocr = new NDLKotenOCR();

メソッド

initialize(): WebWorker を初期化

await ocr.initialize();

processImage(imageInput, options): OCR 処理を実行

  • imageInput: ImageData、HTMLImageElement、または File オブジェクト
  • options: 処理オプション
    • outputFormats: 出力形式の配列 ['txt', 'json', 'xml']
    • onProgress: 進捗コールバック関数
const result = await ocr.processImage(file, {
  outputFormats: ['txt', 'json'],
  onProgress: (progress) => console.log(progress),
});

terminate(): WebWorker を終了

ocr.terminate();

WebWorker メッセージ API

送信メッセージ

初期化

worker.postMessage({ type: 'INITIALIZE' });

OCR 処理

worker.postMessage({
  type: 'OCR_PROCESS',
  id: 'unique-id',
  imageData: imageData,
  config: {
    outputFormats: ['txt', 'json', 'xml'],
  },
});

受信メッセージ

進捗通知

{
  type: 'OCR_PROGRESS',
  id: 'unique-id',
  stage: 'layout_detection',
  progress: 0.5,
  message: 'レイアウト検出中...'
}

完了通知

{
  type: 'OCR_COMPLETE',
  id: 'unique-id',
  txt: 'OCR結果テキスト',
  json: { /* JSON結果 */ },
  xml: '<xml>XML結果</xml>',
  textBlocks: [ /* 構造化データ */ ]
}

エラー通知

{
  type: 'OCR_ERROR',
  id: 'unique-id',
  error: 'エラーメッセージ',
  stage: 'layout_detection'
}

設定とカスタマイズ

モデルファイルの設定

OCR 処理に使用するモデルの URL は設定ファイルで変更できます。 プロジェクトに config/ndl.yaml ファイルを配置してください。

# config/ndl.yaml
models:
  # レイアウト検出モデル
  layout: 'https://honkoku.org/models/rtmdet-s-1280x1280.onnx'

  # 文字認識モデル
  recognition: 'https://honkoku.org/models/parseq-ndl-32x384-tiny-10.onnx'

デフォルト設定

設定ファイルが存在しない場合、以下のデフォルト URL が使用されます:

  • レイアウト検出: https://honkoku.org/models/rtmdet-s-1280x1280.onnx
  • 文字認識: https://honkoku.org/models/parseq-ndl-32x384-tiny-10.onnx

モデルサイズとキャッシュ

  • レイアウト検出モデル: 約 80MB
  • テキスト認識モデル: 約 30MB
  • 合計: 約 110MB

モデルは初回ダウンロード時に IndexedDB にキャッシュされ、2 回目以降は高速に読み込まれます。

Vue.js での使用例

<template>
  <div>
    <input
      type="file"
      @change="handleFileSelect"
      accept="image/*"
    />
    <div v-if="processing">
      進捗: {{ Math.round(progress * 100) }}% -
      {{ progressMessage }}
    </div>
    <div v-if="result">
      <h3>OCR結果</h3>
      <pre>{{ result.txt }}</pre>
    </div>
  </div>
</template>

<script>
import NDLKotenOCR from 'ndlkotenocr-lite-worker';

export default {
  data() {
    return {
      ocr: new NDLKotenOCR(),
      processing: false,
      progress: 0,
      progressMessage: '',
      result: null,
    };
  },
  methods: {
    async handleFileSelect(event) {
      const file = event.target.files[0];
      if (!file) return;

      this.processing = true;
      this.result = null;

      try {
        this.result = await this.ocr.processImage(file, {
          outputFormats: ['txt', 'json'],
          onProgress: (progress) => {
            this.progress = progress.progress;
            this.progressMessage = progress.message;
          },
        });
      } catch (error) {
        console.error('OCR処理エラー:', error);
      } finally {
        this.processing = false;
      }
    },
  },
  beforeUnmount() {
    this.ocr.terminate();
  },
};
</script>

React での使用例

import React, { useState, useRef, useEffect } from 'react';
import NDLKotenOCR from 'ndlkotenocr-lite-worker';

function OCRComponent() {
  const [processing, setProcessing] = useState(false);
  const [progress, setProgress] = useState(0);
  const [progressMessage, setProgressMessage] =
    useState('');
  const [result, setResult] = useState(null);
  const ocrRef = useRef(new NDLKotenOCR());

  useEffect(() => {
    return () => {
      ocrRef.current.terminate();
    };
  }, []);

  const handleFileSelect = async (event) => {
    const file = event.target.files[0];
    if (!file) return;

    setProcessing(true);
    setResult(null);

    try {
      const ocrResult = await ocrRef.current.processImage(
        file,
        {
          outputFormats: ['txt', 'json'],
          onProgress: (progress) => {
            setProgress(progress.progress);
            setProgressMessage(progress.message);
          },
        }
      );
      setResult(ocrResult);
    } catch (error) {
      console.error('OCR処理エラー:', error);
    } finally {
      setProcessing(false);
    }
  };

  return (
    <div>
      <input
        type='file'
        onChange={handleFileSelect}
        accept='image/*'
      />
      {processing && (
        <div>
          進捗: {Math.round(progress * 100)}% -{' '}
          {progressMessage}
        </div>
      )}
      {result && (
        <div>
          <h3>OCR結果</h3>
          <pre>{result.txt}</pre>
        </div>
      )}
    </div>
  );
}

export default OCRComponent;

特徴

  • Web Worker 対応: OCR 処理をバックグラウンドで実行
  • モデルキャッシュ: IndexedDB を使用して ONNX モデルをローカルキャッシュ
  • 古典籍対応: 縦書き・右から左の読み順に対応
  • 複数出力形式: テキスト、JSON、XML 形式での結果出力
  • リアルタイム進捗: 処理進捗をリアルタイムで表示
  • TypeScript 対応: 型定義ファイルを提供(予定)

技術スタック

  • ONNX Runtime Web: モデル推論エンジン
  • Web Workers: バックグラウンド処理
  • IndexedDB: モデルキャッシュ
  • Canvas API: 画像処理

対応ファイル形式

  • JPEG (.jpg, .jpeg)
  • PNG (.png)
  • GIF (.gif)
  • BMP (.bmp)

最大ファイルサイズ: 50MB

ブラウザ対応

  • Chrome 80+
  • Firefox 72+
  • Safari 13.1+
  • Edge 80+

Web Workers、WebAssembly、IndexedDB をサポートするモダンブラウザが必要です。

トラブルシューティング

モデルダウンロードが失敗する

  • ネットワーク接続を確認
  • 設定ファイル内のモデル URL が正しいことを確認
  • CORS の設定を確認(外部サーバーからダウンロードする場合)

OCR 処理が開始されない

  • Web Worker がサポートされているか確認
  • WebAssembly がサポートされているか確認
  • ブラウザのコンソールでエラーを確認

認識精度が低い

  • 画像の解像度を上げる
  • 画像のコントラストを調整
  • ノイズを除去

開発

このライブラリを開発・カスタマイズする場合:

git clone https://github.com/yuta1984/ndlkotenocr-lite-worker.git
cd ndlkotenocr-lite-worker
npm install
npm run dev

ライセンス

CC-BY-4.0

謝辞

このプロジェクトは国立国会図書館の ndlkotenocr-lite を基にしています。