2014-06-30 17 views
6

Mam prosty wymóg, aby wyodrębnić wszystkie obrazy i diagramy rysowane w pliku MS Word. Jestem w stanie wyodrębnić tylko obrazy, ale nie grupę kształtów (jak Diagram przypadku użycia lub Diagram aktywności). Chcę zapisać wszystkie Diagramy jako obraz.Jak odczytać grupę kształtów jako obraz z dokumentu programu Word (.doc lub .docx) za pomocą apachePOI?

Użyłem apachePOI.

następujący kod Pisałem

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(); 
    } 
} 

}

wyodrębnić tylko obrazy nie kształtach.

Czy ktoś wie Jak to zrobić?

+0

Myślę, że to, czego szukasz, nie jest możliwe. –

Odpowiedz

1

A więc śledzisz rzeczy zdefiniowane w [MS-ODRAW], czyli tzw. OfficeDrawings, które można utworzyć bezpośrednio w Wordzie używając palety Rysowanie?

Niestety, UM oferuje tutaj tylko niewielką pomoc. Z HWPF (stary binarny format pliku * .doc) można uzyskać uchwyt do takich danych jak w przykładzie:

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 

Ten drawing mogą być następnie przetwarzane na poszczególne rekordy:

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

Korzystając z danych ze wszystkich tych rekordów, można teoretycznie ponownie wyrenderować oryginalny rysunek. Ale to dość bolesne ...

Do tej pory zrobiłem to tylko w jednym przypadku, w którym miałem wiele prostych strzałek unoszących się na stronie. Tych trzeba było przekonwertować na tekstową reprezentację (coś w stylu: "Pozycje (x1, y1) i (x2, y2) są połączone strzałką"). Zasadniczo ma to na celu implementację podzbioru [MS-ODRAW] odnoszącego się do tych strzałek przy użyciu wyżej wymienionych rekordów. Niezupełnie przyjemne zadanie.

MS Word rozwiązanie kopii zapasowej

przypadku korzystania z samego MS Word jest opcją dla ciebie, to jest inny sposób pragmatyczny:

  1. ekstrakt wszystkie istotne przesunięcia, które zawierają OfficeDrawings pomocą POI.
  2. Wewnątrz wyrazu: Iteruj dokumentem za pomocą VBA i skopiuj wszystkie rysunki w danym przesunięciu do schowka.
  3. Użyj innej aplikacji (wybrałem Visio), aby zrzucić zawartość schowka do pliku PNG.

Konieczna kontrola rysunku w punkcie 1 jest bardzo prosta (patrz poniżej).Resztę można całkowicie zautomatyzować w programie Word. Jeśli ktokolwiek jest w potrzebie, mogę udostępnić odpowiedni kod VBA.

if (characterRun.isSpecialCharacter()) { 
    for (char currentChar : characterRun.text().toCharArray()) { 
     if ('\u0008' == currentChar) return true; 
    } 
} 
Powiązane problemy