Compare commits

...
Author SHA1 Message Date
Abimael Martell 512c50c64d napi: add probe-doc.mjs for single-region detect_vector_grid checks
Generalized one-shot probe — calls detectVectorGridInRegion against
a single PDF + region without spinning up the api or running the bench.
Useful for fast pdf-inspector dev loops:

  cargo build --release && cd napi && bun run build:debug
  node probe-doc.mjs <pdf-path> [page] [bbox] [dpi]

Output: cells/rows/cols and timing, or null when the region has no
vector grid. ~5s round-trip vs ~30s for the full bench harness.

Generalizes the existing probe-indent.mjs pattern so it works on
arbitrary PDFs, not just the multi-line indent fixture.
2026-05-07 23:05:42 -07:00
+64
View File
@@ -0,0 +1,64 @@
#!/usr/bin/env node
// Generalized one-shot probe: run detectVectorGridInRegion against a single
// PDF + region without spinning up the api or the bench.
//
// Usage:
// node probe-doc.mjs <pdf-path> [page] [bbox] [dpi]
//
// pdf-path : path to a PDF on disk (required)
// page : 0-indexed page number (default 0)
// bbox : "x0,y0,x1,y1" in PDF points (default = full standard letter)
// dpi : render dpi (default 200)
//
// Examples:
// node probe-doc.mjs ~/Code/opendataloader-bench/pdfs/01030000000127.pdf 0
// node probe-doc.mjs /tmp/foo.pdf 3 "50,100,560,700" 200
// node probe-doc.mjs /tmp/foo.pdf # page 0, full page, dpi 200
//
// Prints: cells / rows / cols / null. Useful for fast pdf-inspector loops:
// cargo build --release && bun run build:debug && node probe-doc.mjs ...
import { readFileSync, existsSync } from "node:fs";
import { createRequire } from "node:module";
const require = createRequire(import.meta.url);
const { detectVectorGridInRegion } = require("./index.js");
const [, , pdfPath, pageArg, bboxArg, dpiArg] = process.argv;
if (!pdfPath) {
console.error("usage: node probe-doc.mjs <pdf-path> [page] [bbox] [dpi]");
process.exit(2);
}
if (!existsSync(pdfPath)) {
console.error(`pdf not found: ${pdfPath}`);
process.exit(2);
}
const page = pageArg !== undefined ? Number(pageArg) : 0;
const bbox = bboxArg
? bboxArg.split(",").map(Number)
: [0, 0, 612, 792]; // standard US letter
const dpi = dpiArg !== undefined ? Number(dpiArg) : 200;
if (bbox.length !== 4 || bbox.some(Number.isNaN)) {
console.error(`invalid bbox "${bboxArg}", expected "x0,y0,x1,y1"`);
process.exit(2);
}
const pdf = readFileSync(pdfPath);
const t0 = Date.now();
const result = detectVectorGridInRegion(pdf, page, bbox, dpi);
const ms = Date.now() - t0;
if (!result) {
console.log(`null (${ms}ms) page=${page} bbox=${bbox.join(",")} dpi=${dpi}`);
process.exit(0);
}
const rows = result.structureTokens.filter((t) => t === "<tr>").length;
const cols = rows > 0 ? result.cellBboxes.length / rows : 0;
console.log(
`cells=${result.cellBboxes.length} rows=${rows} cols=${cols} (${ms}ms) page=${page} bbox=${bbox.join(",")} dpi=${dpi}`,
);