nx_lib_pdf_diag.nx source
↩ module page · 51 lines · 2225 B
1// nx_lib_pdf_diag.nx -- diagnose PDF text extraction quality on the saved
2// PMC (Apache FOP) PDF: read file -> extract -> save text -> report printable
3// ratio + samples, so the font-decode failure class is clear.
4import "nx_syscalls.nx"
5import "nx_lib_pdf.nx"
6const K_MAGIC_16777216: i64 = 16777216
7
8func dg_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
9func dg_wr(p: *u8, n: i64) -> i64 { sys_write(1, p, n); return 0 }
10func dg_putn(v: i64) -> i64 {
11 let bb: *u8 = sys_mmap(28); var m: i64 = v
12 if m < 0 { m = 0 - m; sys_write(1, "-" as *u8, 1) }
13 let t: *u8 = sys_mmap(28); var k: i64 = 0
14 if m == 0 { t[0] = 48 as u8; k = 1 }
15 while m > 0 { t[k] = (48 + (m - (m/10)*10)) as u8; m = m / 10; k = k + 1 }
16 var i: i64 = 0; while i < k { bb[i] = t[k - 1 - i]; i = i + 1 } sys_write(1, bb, k); return 0
17}
18
19func main() -> i64 {
20 let lb: *i64 = sys_mmap(16) as *i64
21 let pdf: *u8 = sys_read_file("knowledge/fetched/pmc_cd004504.pdf\x00" as *u8, lb)
22 if (pdf as i64) == 0 { dg_puts("cannot read saved PDF\n"); return 1 }
23 let n: i64 = lb[0]
24 let cap: i64 = K_MAGIC_16777216
25 let out: *u8 = sys_mmap(cap)
26 let tn: i64 = nx_lib_pdf_text(pdf, n, out, cap)
27 dg_puts("pdf bytes="); dg_putn(n); dg_puts(" extracted text bytes="); dg_putn(tn); dg_puts("\n")
28
29 var printable: i64 = 0
30 var letters: i64 = 0
31 var i: i64 = 0
32 while i < tn {
33 let c: i64 = out[i] as i64
34 if c == 10 { printable = printable + 1 }
35 else { if c >= 32 { if c < 127 { printable = printable + 1 } } }
36 if c >= 65 { if c <= 90 { letters = letters + 1 } }
37 if c >= 97 { if c <= 122 { letters = letters + 1 } }
38 i = i + 1
39 }
40 dg_puts("printable="); dg_putn(printable); dg_puts(" ascii-letters="); dg_putn(letters); dg_puts("\n")
41
42 let fd: i64 = sys_openat_wr("knowledge/fetched/pmc_text.txt\x00" as *u8, 0x1A4)
43 if fd > 0 { sys_write(fd, out, tn); sys_close(fd) }
44
45 dg_puts("--- sample @ 40%% ---\n")
46 var s1: i64 = (tn / 10) * 4
47 var w1: i64 = 400; if s1 + w1 > tn { w1 = tn - s1 }
48 if w1 > 0 { dg_wr(((out as i64) + s1) as *u8, w1) }
49 dg_puts("\n--- end ---\n")
50 return 0
51}