はじめに
noto-pdf-ts は、Node.js向けの軽量なPDF→画像変換ライブラリです。
特徴
- シンプルなAPI - わずか数個の関数でPDFページを画像に変換
- メモリ効率 - 非同期ジェネレータを使用して1ページずつ処理
- CJKサポート - PDFium による中国語、日本語、韓国語フォントの完全サポート
- TypeScript - TypeScriptで書かれており、完全な型定義を提供
- モダン - ES2024の
await usingによる自動リソースクリーンアップをサポート - ネイティブ依存なし - レンダリングに PDFium WebAssembly を使用
PDFフォントの基礎知識
フォント形式
PDFは複数のフォント形式をサポートしています:
| 形式 | 説明 |
|---|---|
| TrueType (.ttf) | Apple/Microsoftによる一般的な形式、広く使用されている |
| OpenType (.otf/.ttf) | TrueTypeの拡張版、高度なタイポグラフィ機能を持つ |
| Type 1 | Adobeの旧式PostScript形式 |
| CIDフォント | 大規模文字セット(CJK)向けに設計 |
埋め込みフォント vs 参照フォント
PDFはフォントを根本的に異なる2つの方法で扱います:
埋め込みフォントは、実際のフォントデータをPDFファイル内に格納します。これにより、どのシステムでも一貫したレンダリングが保証されますが、ファイルサイズが大きくなります。
参照フォントは、フォント名のみを格納し、表示するシステムがフォントを提供することに依存します。ファイルサイズは小さくなりますが、フォントが利用できない場合に表示の問題が発生する可能性があります。
「豆腐」問題
参照されたフォントが利用できず、適切な代替フォントも存在しない場合、テキストは空の四角形として表示されることがあります:□□□
これらの四角形は「豆腐(Tofu)」と呼ばれています(豆腐のブロックに似ているため)。これは特にCJK(中国語、日本語、韓国語)文字で一般的で、すべてのシステムにインストールされているとは限らない専用フォントを必要とします。
noto-pdf-tsのフォント処理
noto-pdf-tsはフォント処理に対して堅牢なアプローチを取っています:
- PDFiumベースのレンダリング - GoogleのPDFiumライブラリ(ChromeのPDFビューアと同じエンジン)をWebAssemblyにコンパイルし、信頼性の高い高品質なレンダリングを実現
- Noto CJKフォントのバンドル - Noto Sans CJKフォントを同梱しているため、PDFに埋め込みフォントがなくてもCJKテキストの豆腐化を防止
- カスタムフォント登録 - 特殊なユースケース向けに追加フォントの登録が可能
- 欠落グリフの検出 - レンダリングできなかった文字を報告し、問題のあるPDFを特定するのに役立つ
このアプローチにより、プラットフォーム間で一貫したレンダリングを実現し、CJKサポートもデフォルトで優れた品質を提供します。
インストール
npm install noto-pdf-tsクイック例
import { openPdf } from 'noto-pdf-ts';import fs from 'node:fs/promises';
// PDFファイルを開くconst pdf = await openPdf('/path/to/document.pdf');
// すべてのページをレンダリングfor await (const page of pdf.renderPages()) { await fs.writeFile(`page-${page.pageNumber}.jpg`, page.buffer);}
// 閉じることを忘れずにawait pdf.close();要件
- Node.js 20以降