2014-06-30 7 views
6

Ho un semplice requisito per estrarre tutte le immagini e diagrammi disegnati nel file MS Word. Sono in grado di estrarre solo le immagini ma non il gruppo di forme (come Usa diagramma di caso o diagramma di attività). Voglio salvare tutti i diagrammi come Immagine.Come leggere il gruppo di forme come immagine dal documento di Word (.doc o .docx) usando apachePOI?

Ho usato apachePOI.

seguito il codice che ho scritto

public class worddocreader { 
public static void main(String args[]) { 
    FileInputStream fis; 
    try { 
     FileInputStream fs = new FileInputStream("F:/1.docx"); 
     XWPFDocument docx = new XWPFDocument(fs); 
     List<XWPFPictureData> piclist = docx.getAllPictures(); 
     Iterator<XWPFPictureData> iterator = piclist.iterator(); 
     int i = 0; 
     while (iterator.hasNext()) { 
      XWPFPictureData pic = iterator.next(); 
      byte[] bytepic = pic.getData(); 
      BufferedImage imag = ImageIO.read(new ByteArrayInputStream(
        bytepic)); 
      ImageIO.write(imag, "image/jpeg", new File("F:/docParsing/imagefromword" + i + ".jpg")); 
      i++; 
     } 

     ArrayList<PackagePart> packArrayList = docx.getPackageRelationship().getPackage().getParts(); 
     int size = packArrayList.size(); 
     System.out.println("Array List Size : " + packArrayList.size()); 

     while (size-->0) { 
      PackagePart packagePart = packArrayList.get(size); 

      System.out.println(packagePart.getContentType()); 

      try{ 
       BufferedImage bfrImage = ImageIO.read(packagePart.getInputStream()); 
       ImageIO.write(bfrImage,"image/png",new File("F:/docParsing_emb/size"+size+".png")); 
      }catch(Exception e){ 
       e.printStackTrace(); 
      } 
     } 
     System.out.println("Done"); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

}

Si estrarre solo non immagini Forme.

Qualcuno sa Come faccio a fare questo?

+0

Penso che ciò che stai cercando non sia possibile. –

risposta

1

Quindi stai cercando le cose definite in [MS-ODRAW], ovvero i cosiddetti OfficeDrawings che possono essere creati direttamente in Word usando la sua palette Disegno?

Sfortunatamente, POI offre solo un piccolo aiuto qui. Con HWPF (il vecchio formato di file binario * .doc) è possibile ottenere un handle a tali dati in questo modo:

HWPFDocument document; 
OfficeDrawings officeDrawings = document.getOfficeDrawingsMain(); 
OfficeDrawing drawing = officeDrawings.getOfficeDrawingAt(OFFSET); 
// OFFSET is a global character offset describing the position of the drawing in question 
// i.e. document.getRange().getStartOffset() + x 

Questo drawing possono poi essere ulteriormente trasformato in singoli record:

EscherRecordManager escherRecordManager = new EscherRecordManager(drawing.getOfficeArtSpContainer()); 
EscherSpRecord escherSpRecord = escherRecordManager.getSpRecord(); 
EscherOptRecord escherOptRecord = escherRecordManager.getOptRecord(); 

Utilizzando i dati di tutti questi record è possibile teoricamente eseguire nuovamente il rendering del disegno originale. Ma è piuttosto doloroso ...

Finora l'ho fatto solo in un caso in cui avevo un sacco di semplici frecce che giravano su una pagina. Quelli dovevano essere convertiti in una rappresentazione testuale (qualcosa come: "Le posizioni (x1, y1) e (x2, y2) sono collegate da una freccia" ". In pratica, ciò significava implementare un sottoinsieme di [MS-ODRAW] relativo a tali frecce usando i record sopra menzionati. Non è esattamente un compito piacevole.

soluzione di backup di MS Word

Se si usa MS Word per sé è un'opzione per voi, allora c'è un altro modo pragmatico:

  1. estratto di tutti gli spostamenti rilevanti che contengono OfficeDrawings utilizzando POI.
  2. Inside Word: consente di scorrere il documento con VBA e copiare tutti i disegni negli offset specificati negli Appunti.
  3. Utilizzare qualche altra applicazione (ho scelto Visio) per scaricare il contenuto degli appunti in un PNG.

Il controllo necessario per un disegno nel passaggio 1 è molto semplice (vedere di seguito).Il resto può essere completamente automatizzato in Word. Se qualcuno ne ha bisogno, posso condividere il rispettivo codice VBA.

if (characterRun.isSpecialCharacter()) { 
    for (char currentChar : characterRun.text().toCharArray()) { 
     if ('\u0008' == currentChar) return true; 
    } 
} 
Problemi correlati