コンテンツにスキップ

レンダリングガイド

このガイドでは、noto-pdf-tsを使用した高度なレンダリングテクニックを説明します。

スケールの理解

scaleオプションは出力解像度を制御します。PDFは通常72 DPIで作成されるため:

スケールDPIユースケース
0.536小さいサムネイル
1.072PDFの元のサイズ
1.5108デフォルト、バランスが良い
2.0144高品質表示
3.0216印刷品質
// 例: サムネイルと高解像度バージョンを生成
const pdf = await openPdf('/path/to/document.pdf');
// サムネイル
for await (const page of pdf.renderPages({ scale: 0.5 })) {
await fs.writeFile(`thumb-${page.pageNumber}.jpg`, page.buffer);
}
// 高解像度
for await (const page of pdf.renderPages({ scale: 2.0, format: 'png' })) {
await fs.writeFile(`hires-${page.pageNumber}.png`, page.buffer);
}
await pdf.close();

メモリ効率

noto-pdf-tsはメモリ効率の良い処理のために非同期ジェネレータを使用します:

// メモリ効率的 - 一度に1ページずつ処理
for await (const page of pdf.renderPages()) {
await processPage(page);
// 前のページのリソースは次のページの前に解放される
}

非常に大きなPDFの場合、バッチ処理も可能です:

const BATCH_SIZE = 10;
for (let i = 1; i <= pdf.pageCount; i += BATCH_SIZE) {
const endPage = Math.min(i + BATCH_SIZE - 1, pdf.pageCount);
for await (const page of pdf.renderPages({
pages: { start: i, end: endPage }
})) {
await processPage(page);
}
// オプション: バッチ間で一時停止
await new Promise(resolve => setTimeout(resolve, 100));
}

並列処理

ページはメモリ効率のために順次レンダリングされますが、出力は並列で処理できます:

const pages: RenderedPage[] = [];
for await (const page of pdf.renderPages()) {
pages.push(page);
}
// すべてのページを並列で処理
await Promise.all(
pages.map(page => fs.writeFile(`page-${page.pageNumber}.jpg`, page.buffer))
);

CJKフォントサポート

noto-pdf-tsはPDFiumを通じて中国語、日本語、韓国語フォントの組み込みサポートを提供します。CJKフォントは追加の設定なしで自動的に処理されます。

単一ページのレンダリング

特定のページをレンダリングするには、renderPage()を使用:

const pdf = await openPdf('/path/to/document.pdf');
// 最初のページだけをレンダリング
const firstPage = await pdf.renderPage(1);
await fs.writeFile('cover.jpg', firstPage.buffer);
// 最後のページをレンダリング
const lastPage = await pdf.renderPage(pdf.pageCount);
await fs.writeFile('back.jpg', lastPage.buffer);
await pdf.close();

出力寸法

レンダリングされたページの寸法は、PDFページサイズとスケールに依存します:

for await (const page of pdf.renderPages({ scale: 2.0 })) {
console.log(`ページ ${page.pageNumber}: ${page.width}x${page.height} ピクセル`);
// A4 PDF(595x842ポイント)の場合、約1190x1684ピクセルになります
}