云
昨天 a87fcc60346dfc799bd3c2cddc7acfffb105cb61
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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("&","&amp;").replace("<","&lt;").replace(">","&gt;");}
 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);
 }
}