import org.apache.poi.hwpf.HWPFDocument;
|
import org.apache.poi.hwpf.usermodel.*;
|
import java.nio.file.*;
|
import java.io.*;
|
import java.nio.charset.StandardCharsets;
|
class ExtractLegacyQcDocs {
|
static String text(Paragraph p){StringBuilder s=new StringBuilder();for(int i=0;i<p.numCharacterRuns();i++){CharacterRun r=p.getCharacterRun(i);String t=r.text();s.append(r.getSubSuperScriptIndex()==1?"^("+t+")":t);}return s.toString();}
|
static String esc(String s){return s.replaceAll("[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F]", "").replace("&","&").replace("<","<").replace(">",">");}
|
public static void main(String[] args)throws Exception {
|
Path out=Path.of("scripts/sop-qc/extracted");Files.createDirectories(out);int count=0;
|
try(var files=Files.list(Path.of(args[0]))) {
|
for(Path file:files.filter(p->p.toString().toLowerCase().endsWith(".doc")).toList()) {
|
try(InputStream input=Files.newInputStream(file);HWPFDocument doc=new HWPFDocument(input)) {
|
Range range=doc.getRange();StringBuilder xml=new StringBuilder("<doc>");
|
for(int i=0;i<range.numParagraphs();i++){
|
Paragraph p=range.getParagraph(i);
|
if(p.isInTable()){
|
Table table=range.getTable(p);xml.append("<table>");
|
for(int r=0;r<table.numRows();r++){TableRow row=table.getRow(r);xml.append("<row>");for(int c=0;c<row.numCells();c++){TableCell cell=row.getCell(c);xml.append("<cell>");for(int j=0;j<cell.numParagraphs();j++)xml.append("<p>").append(esc(text(cell.getParagraph(j)))).append("</p>");xml.append("</cell>");}xml.append("</row>");}xml.append("</table>");
|
while(i+1<range.numParagraphs() && range.getParagraph(i+1).getStartOffset()<table.getEndOffset())i++;
|
}else xml.append("<p>").append(esc(text(p))).append("</p>");
|
}
|
xml.append("</doc>");Files.writeString(out.resolve(file.getFileName()+".xml"),xml,StandardCharsets.UTF_8);count++;
|
}catch(Exception e){System.out.println("FAILED "+file.getFileName()+": "+e.getMessage());}
|
}
|
}System.out.println("Legacy DOC extracted="+count);
|
}
|
}
|