code wiki / _hdl_build / _pdf_to_text_authored.nx
_pdf_to_text_authored.nx source
↩ module page · 16 lines · 1736 B
1// AUTHORED BY THE NISHI BUILDER (pdf-to-text chain) -- real compressed PDF -> readable text, bits-up
2import "_inflate_lib_authored.nx"
3func psub(buf: *u8, n: i64, from: i64, needle: *u8, nl: i64) -> i64 { var i: i64=from; while i+nl<=n { var ok: i64=1; var j: i64=0; while j<nl { if buf[i+j]!=needle[j] { ok=0; j=nl } else { j=j+1 } } if ok==1 { return i } i=i+1 } return 0-1 }
4func pdf_extract(pdf: *u8, pl: i64, out: *u8) -> i64 { let s: i64=psub(pdf,pl,0,"stream" as *u8,6); if s<0 { return 0-1 } var ds: i64=s+6; if pdf[ds]==0x0d as u8 { ds=ds+1 } if pdf[ds]==0x0a as u8 { ds=ds+1 } let e: i64=psub(pdf,pl,ds,"endstream" as *u8,9); if e<0 { return 0-1 } var de: i64=e; if de>ds { if pdf[de-1]==0x0a as u8 { de=de-1 } } if de>ds { if pdf[de-1]==0x0d as u8 { de=de-1 } } return inflate(((pdf as i64)+ds+2) as *u8, de-ds-2, out) }
5func pdf_text(s: *u8, sl: i64, out: *u8) -> i64 { var op: i64=0; var i: i64=0; while i<sl { if s[i]==0x28 as u8 { i=i+1; var instr: i64=1; while instr==1 { if i>=sl { instr=0 } else { if s[i]==0x5c as u8 { i=i+1; if i<sl { out[op]=s[i]; op=op+1; i=i+1 } } else { if s[i]==0x29 as u8 { instr=0; i=i+1 } else { out[op]=s[i]; op=op+1; i=i+1 } } } } } else { i=i+1 } } return op }
6func pdf_to_text(pdf: *u8, pl: i64, out: *u8) -> i64 { let mid: *u8=sys_mmap(65536); let sn: i64=pdf_extract(pdf,pl,mid); if sn<0 { return 0-1 } return pdf_text(mid,sn,out) }
7func main() -> i64 {
8 let lp: *i64=sys_mmap(8) as *i64; let pdf: *u8=sys_read_file("/tmp/idx.pdf" as *u8, lp)
9 if (pdf as i64)==0 { sys_exit(2) }
10 let out: *u8=sys_mmap(65536)
11 let n: i64=pdf_to_text(pdf, lp[0], out)
12 if n<=0 { sys_exit(1) }
13 if psub(out, n, 0, "quick" as *u8, 5) >= 0 { sys_exit(0) }
14 sys_exit(1)
15 return 1
16}