code wiki / (root) / nx_lib_pdf_diag.nx

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}