2014-06-30 7 views
6

MS Word 파일로 그려진 모든 이미지와 다이어그램을 추출하는 간단한 요구 사항이 있습니다. 이미지 만 추출 할 수 있지만 모양 그룹 (유스 케이스 다이어그램 또는 활동 다이어그램)은 추출 할 수 없습니다. 모든 다이어그램을 이미지로 저장하고 싶습니다.apachePOI를 사용하여 Word 문서 (.doc 또는 .docx)에서 이미지로 셰이프 그룹을 읽는 방법?

나는 apachePOI를 사용했습니다.

다음 코드 나는 그것은 단지 이미지없는 모양을 추출

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

}를 작성했습니다.

아무도 몰라 어떻게해야합니까?

+0

당신이 찾고있는 것은 불가능합니다. –

답변

1

개체를 포함하는 _officeDrawingsMain이 org.apache.poi.hwpf.HWPFDocument 당신은 클래스에서 다음

사무실 예술을 의미하는 경우 그래서 당신은 [MS-ODRAW]에 정의 된 것들, 즉 Drawing 팔레트를 사용하여 Word에서 직접 만들 수있는 OfficeDrawings을 따르고 있습니까?

불행히도 POI는 도움이되지 않습니다. 와 HWPF (이전 이진 *의 .doc 파일 형식) 당신과 같이 이러한 데이터에 대한 핸들을 얻을 수 있습니다 :

drawing 기능이 이후의 개별 레코드로 처리 할 수 ​​
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 

:

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

이 모든 레코드의 데이터를 사용하면 이론적으로을 다시 렌더링 할 수 있습니다. 하지만 다소 고통 스럽습니다. ...

지금까지 한 페이지에 떠있는 많은 단순한 화살표가있는 단일 사례에서이 작업을 수행했습니다. 그것들은 텍스트 표현 (예 : "위치 (x1, y1)과 (x2, y2)는 화살표")로 연결됩니다. 이렇게하면 기본적으로 위에서 언급 한 레코드를 사용하여 화살표와 관련된 [MS-ODRAW]의 하위 집합을 구현할 수 있습니다. 정확하지 않은 즐거운 작업.

  1. 추출물 POI를 사용하여 OfficeDrawings를 포함하는 모든 관련 오프셋 :

    MS 워드 자체를 사용하는 당신에게 옵션 인 경우 MS 워드 백업 솔루션은 다음 다른 실용적인 방법이있다.

  2. 내부 Word : VBA를 사용하여 문서를 반복하고 지정한 오프셋의 모든 그림을 클립 보드로 복사하십시오.
  3. 다른 응용 프로그램 (Visio를 선택 함)을 사용하여 클립 보드 내용을 PNG로 덤프하십시오.

1 단계에서 필요한 도면을 확인하는 작업은 매우 간단합니다 (아래 참조).나머지는 Word에서 완전히 자동화 될 수 있습니다. 누구든지 곤경에 처한 경우 VBA 코드를 공유 할 수 있습니다.

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