rag-service/scripts/spike-pdfjs.ts

36 lines
1.4 KiB
TypeScript

import assert from "node:assert/strict";
import { readFile } from "node:fs/promises";
import pdf from "pdf-parse";
interface PdfPageData {
getTextContent(options: { normalizeWhitespace: boolean; disableCombineTextItems: boolean }): Promise<{
items: Array<{ str?: string }>;
}>;
}
const fixtureUrl = new URL("../tests/fixtures/ocr/native-three-pages.pdf", import.meta.url);
const input = process.argv[2] ? new URL(`file://${process.argv[2]}`) : fixtureUrl;
const nodeMajor = Number.parseInt(process.versions.node.split(".")[0] ?? "0", 10);
assert.ok(nodeMajor >= 22, `Node 22 or newer is required; received ${process.versions.node}`);
const pages: Array<{ page: number; text: string }> = [];
const bytes = Uint8Array.from(await readFile(input));
const result = await pdf(bytes as Buffer, {
version: "v2.0.550",
pagerender: async (pageData: PdfPageData) => {
const textContent = await pageData.getTextContent({ normalizeWhitespace: false, disableCombineTextItems: false });
const text = textContent.items.flatMap((item) => item.str ?? []).join(" ").trim();
pages.push({ page: pages.length + 1, text });
return text;
}
});
assert.equal(result.numpages, pages.length);
assert.deepEqual(pages, [
{ page: 1, text: "Native page one." },
{ page: 2, text: "" },
{ page: 3, text: "Native page three." }
]);
console.log(JSON.stringify({ node: process.versions.node, parser: `pdf-parse/pdfjs-${result.version}`, pages }));