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}