検索可能なPDFを作成するためのオープンソースOCR JavaScript API
検索可能なPDFを作成し、OCR(光学文字認識)を実行して画像(PNG、JPEG)とPDFファイルの両方からテキストを抽出する、トップクラスのJavaScript OCRライブラリです。
Scribe.jsとは何ですか?
今日のデジタル社会では、膨大な価値ある情報が画像の中に閉じ込められています――エラーメッセージのスクリーンショット、文書の写真、プレゼンテーションのスライド、あるいは巧妙なテキストが入ったミームなどです。このテキストを手作業で書き起こすのは手間がかかり、ミスも起きやすい作業です。そこで光学文字認識(OCR)技術が活躍し、Scribe.js はウェブプロジェクトに OCR を統合する最も開発者フレンドリーな方法の一つを提供します。Scribe.js はオープンソースの JavaScript ライブラリで、画像と PDF ファイルの両方から OCR を実行しテキストを抽出します。多くの OCR ソリューションがバックエンド処理や外部 API 呼び出しを必要とするのに対し、Scribe.js は完全にクライアント側で動作し、データを完全にコントロールでき、テキスト認識タスクにかかるサーバーコストを排除します。
Scribe.js は、Google Cloud Vision API 用の軽量な JavaScript クライアントです。すべての OCR 処理はユーザーのブラウザまたは Node.js 環境で直接実行され、プライバシーが保護され、サーバーインフラコストが削減されます。ライブラリは、画像の前処理、画像の統一ワークフロー、自動検出、PDF レイヤリング、低信頼度ページの除外、OCR エンジンのキャッシュなど、さまざまな機能をサポートしています。ライブラリは最新の JavaScript ESM(ECMAScript Modules)を使用して構築されており、複雑なビルド設定を必要とせず、現代的なウェブ開発ワークフローに簡単に統合できます。この開発者ファーストのアプローチにより、数行のコードだけでドキュメントからテキスト抽出を開始できます。
Scribe.jsのはじめ方
Scribe.js の推奨インストール方法は npm を使用することです。スムーズなインストールのために、以下のコマンドをご利用ください。
Scribe.js を npm でインストールする
npm install scribe.js-ocr また、手動でインストールすることも可能です。最新のリリースファイルは GitHub リポジトリから直接ダウンロードしてください。
画像からの文字認識
Scribe.js ライブラリの最も基本的なユースケースは、画像ファイルからテキストを抽出することです。ライブラリはさまざまな画像フォーマットに対応し、単一画像と複数画像のバッチを一度に処理できます。以下は、JavaScript アプリ内で画像 URL からテキスト抽出を実演する基本的な例です。スニペットは Scribe.js が提供するシンプルな API を示しています。extractText メソッドは画像 URL の配列を受け取り、認識されたテキストを解決する Promise を返します。
JavaScript ライブラリで画像からテキストを抽出する方法?
import scribe from 'scribe.js-ocr';
// Extract text from a single image
scribe.extractText(['https://example.com/sample-image.png'])
.then((result) => {
console.log('Extracted text:', result);
})
.catch((error) => {
console.error('OCR failed:', error);
});
JavaScriptで検索可能なPDFを作成する
Scribe.js の最も強力な機能の一つは、既存の PDF ファイルに見えないテキストレイヤーを追加できることです。この機能により、画像ベースの PDF を視覚的な外観を変えることなく検索可能なドキュメントに変換できます。PDF にテキストレイヤーが追加されると、ユーザーは文書内の特定の単語やフレーズを検索でき、画像のように見える部分からテキストを選択・コピーでき、スキャンされた文書でスクリーンリーダーやアクセシビリティツールを使用でき、検索エンジンや文書管理システムによるインデックス作成が可能になります。
JavaScript ライブラリで検索可能な PDF ドキュメントを作成する方法?
import scribe from 'scribe.js-ocr';
// Add searchable text layer to an image-based PDF
async function makeSearchablePDF(inputPdfUrl) {
try {
// First, perform OCR on the PDF
const ocrResult = await scribe.extractText([inputPdfUrl]);
// Then create a new PDF with the text layer embedded
const searchablePdf = await scribe.createSearchablePDF(
inputPdfUrl,
ocrResult
);
// The resulting PDF maintains the original appearance
// but now contains selectable, searchable text
return searchablePdf;
} catch (error) {
console.error('Failed to create searchable PDF:', error);
throw error;
}
}
JSによる高度な文書テキスト検出
テキストが密集し、レイアウトが複雑な文書の画像(スキャンした書籍のページや PDF エクスポートなど)に対して、Scribe.js ライブラリは "Document Text Detection" 機能を提供します。この機能は段落、単語、改行検出器など、はるかに豊富な情報を提供し、元の文書の構造を保持するのに役立ちます。フォーム、請求書、または複数列レイアウトの処理など、ソース素材のレイアウトや構造が重要なアプリケーションに非常に有用です。
JavaScript アプリ内で高度なテキスト検出を実行する方法?
const Scribe = require('scribejs');
const serviceAccountKey = require('./path-to-your-key.json');
const scribe = new Scribe(serviceAccountKey);
const documentImageUrl = 'https://example.com/scanned-invoice.png';
// Use the `documentText` method for advanced detection
scribe.documentText(documentImageUrl)
.then(fullTextAnnotation => {
// The fullTextAnnotation object contains detailed data
console.log('Full Document Text:');
console.log(fullTextAnnotation.text); // The plain text of the entire document
// You can also iterate through pages, blocks, paragraphs, and words
fullTextAnnotation.pages.forEach(page => {
page.blocks.forEach(block => {
console.log('\nBlock Confidence:', block.confidence);
block.paragraphs.forEach(paragraph => {
console.log(paragraph.text);
});
});
});
})
.catch(error => {
console.error('Document OCR Error:', error);
});
JavaScriptで複数ファイルをバッチ処理する
実際のアプリケーションでは、ソフトウェアの専門家はしばしば複数の文書を同時に処理する必要があります。Scribe.js はバッチ処理を標準でサポートしており、JavaScript アプリケーション内で単一の操作で複数の画像や PDF からテキストを抽出できます。以下の例は、ソフトウェア開発者が JavaScript コマンドを使用して文書のバッチを処理する方法を示しています。
JavaScript ライブラリを使用してドキュメントのバッチを処理する方法?
import scribe from 'scribe.js-ocr';
// Process multiple documents at once
async function batchProcess(fileUrls) {
try {
// Pass an array of URLs to process multiple files
const results = await scribe.extractText(fileUrls);
// Results are returned in the same order as input
results.forEach((text, index) => {
console.log(`Document ${index + 1} text:`, text);
});
return results;
} catch (error) {
console.error('Batch processing failed:', error);
throw error;
}
}
// Process a batch of documents
const documents = [
'https://example.com/receipt1.jpg',
'https://example.com/receipt2.jpg',
'https://example.com/invoice.pdf'
];
batchProcess(documents)
.then(allText => {
console.log('All documents processed successfully');
});