2014-06-30 14 views
6

MS Word dosyasında çizilen tüm Görüntü ve Çizimleri ayıklamak için basit bir gereksinim var. Yalnızca görüntüleri ayıklayabiliyorum, ancak şekil grubunu kullanamıyorum (Durum Şeması veya Etkinlik Şeması Kullan gibi). Tüm Diyagramları Görüntü olarak kaydetmek istiyorum.ApachePOI kullanarak Word belgesinden (.doc veya .docx) görüntü olarak şekil grubu nasıl okunur?

ApachePOI kullandım.

ardından kod ben sadece Görüntüleri değil Şekiller ayıklamak

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

} yazdım.

Herkes bunu biliyor mu? Bunu nasıl yaparım?

+0

Sanırım, aradığınız şey mümkün değil. –

cevap

1

nesneleri içeren bir _officeDrawingsMain var org.apache.poi.hwpf.HWPFDocument Eğer sınıfında sonra

Ofis Sanat kastediyorsan Yani, Çizim Paletini kullanarak doğrudan Word'de oluşturulabilen OfficeDrawings olarak adlandırılan, yani [MS-ODRAW]'da tanımlanan şeylerin peşindesiniz?

Maalesef, POI burada sadece çok az yardım sunuyor. Ile HWPF (eski ikili * .doc dosya biçimi) bu kadar gibi böyle verilere yürütebilirim:

Bu drawing sonra daha da bireysel kayıtlarına işlenebilir
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(); 

Tüm bu kayıtlardan gelen verileri kullanarak kuramsal olarak orijinal çizimi tekrar oluşturun. Ama bu oldukça acı verici ...

Şimdiye kadar bunu sadece bir sayfada dolaşan çok sayıda basit ok içeren tek bir durumda yaptım. Bunlar, metinsel bir temsile dönüştürülmek zorundaydı (gibi bir şey) Pozisyonlar (x1, y1) ve (x2, y2) bir ok ") tarafından bağlanır. Bunu yapmak, esasen yukarıda bahsedilen kayıtları kullanan oklarla ilgili bir [MS-ODRAW] alt kümesini uygulamak anlamına gelir. Tam olarak hoş bir görev değil.

  1. özü POI kullanarak OfficeDrawings içeren tüm ilgili uzaklıklar:

    MS Word kendisini kullanarak size bir seçenek ise MS Word yedekleme çözümü, sonra başka pragmatik bir yolu yoktur.

  2. Inside Word: Belgeyi VBA ile yineleyin ve tüm çizimleri verilen ofsetlerden panoya kopyalayın.
  3. Pano içeriklerini bir PNG'ye dökmek için başka bir uygulama (Visio'yu seçtim) kullanın.

Aşama 1'deki çizim için gerekli kontrol çok basittir (aşağıya bakınız).Gerisi Word'de tamamen otomatikleştirilebilir. İhtiyacı olan biri varsa, ilgili VBA kodunu paylaşabilirim.

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