2016-03-21 21 views
0

Tüm gömülü nesneleri (doc, ..., txt) bir ofis dosyasında (doc, docx, xls, xlsx, ppt, pptx, ...) listelemek için bir fırsat var mı?Tüm gömülü dosyaları Apache POI kullanarak bir microsoft office belgesinden nasıl listeleme?

Office dosyalarından metin ayıklamak için Apache POI (Java) Kitaplığı kullanıyorum. Gömülü nesnelerden tüm metni ayıklamam gerekmiyor, tüm gömülü belgelerin dosya isimleriyle bir günlük dosyası hoş olurdu (string objectFileNames = getEmbeddedFileNames(fileInputStream) gibi bir şey).

Örnek: "excel.xls" adında başka bir dosya içeren "document.doc" adlı bir Word belgesine sahibim. Excel.xls dosya adını (bu durumda) bir günlük dosyasına yazmak istiyorum.

Bunu apache ana sayfasından (https://poi.apache.org/text-extraction.html) bazı örnek kod kullanarak denedim. Ancak Kodum her zaman aynı döner ("Altbilgi Metni: Başlık Metni"). Denedim ne

geçerli:

private static void test(String inputfile, String outputfile) throws Exception { 

    String[] extractedText = new String[100]; 
    int emb = 0;//used for counter of embedded objects 

    InputStream fis = new FileInputStream(inputfile); 
    PrintWriter out = new PrintWriter(outputfile);//Text in File (txt) schreiben 

System.out.println("Emmbedded Search started. Inputfile: " + inputfile); 

//Based on Apache sample Code 
emb = 0;//Reset Counter 

POIFSFileSystem emb_fileSystem = new POIFSFileSystem(fis); 
// Firstly, get an extractor for the Workbook 
POIOLE2TextExtractor oleTextExtractor = 
    ExtractorFactory.createExtractor(emb_fileSystem); 
// Then a List of extractors for any embedded Excel, Word, PowerPoint 
// or Visio objects embedded into it. 
POITextExtractor[] embeddedExtractors = 
    ExtractorFactory.getEmbededDocsTextExtractors(oleTextExtractor); 

for (POITextExtractor textExtractor : embeddedExtractors) { 
    // If the embedded object was an Excel spreadsheet. 
    if (textExtractor instanceof ExcelExtractor) { 
     ExcelExtractor excelExtractor = (ExcelExtractor) textExtractor; 
     extractedText[emb] = (excelExtractor.getText()); 
    } 
    // A Word Document 
    else if (textExtractor instanceof WordExtractor) { 
     WordExtractor wordExtractor = (WordExtractor) textExtractor; 
     String[] paragraphText = wordExtractor.getParagraphText(); 
     for (String paragraph : paragraphText) { 
      extractedText[emb] = paragraph; 
     } 
     // Display the document's header and footer text 
     System.out.println("Footer text: " + wordExtractor.getFooterText()); 
     System.out.println("Header text: " + wordExtractor.getHeaderText()); 
    } 
    // PowerPoint Presentation. 
    else if (textExtractor instanceof PowerPointExtractor) { 
     PowerPointExtractor powerPointExtractor = 
     (PowerPointExtractor) textExtractor; 
     extractedText[emb] = powerPointExtractor.getText(); 
     emb++; 
     extractedText[emb] = powerPointExtractor.getNotes(); 
    } 
    // Visio Drawing 
    else if (textExtractor instanceof VisioTextExtractor) { 
     VisioTextExtractor visioTextExtractor = 
     (VisioTextExtractor) textExtractor; 
     extractedText[emb] = visioTextExtractor.getText(); 
    } 
    emb++;//Count Embedded Objects 
}//Close For Each Loop POIText... 

for(int x = 0; x <= extractedText.length; x++){//Write Results to TXT 
    if (extractedText[x] != null){ 
     System.out.println(extractedText[x]); 
     out.println(extractedText[x]); 
    } 
    else { 
     break; 
    } 
} 
out.close(); 

} 

GirdiDosyası nesnesi olarak doc dosyasını içeren ve outputfile txt olan xls vardır.

Bana yardım edebilecek birisi varsa.

cevap

1

Katıştırılmış OLE nesnelerinin orijinal dosya adlarını saklı tuttuğunu düşünmüyorum, bu yüzden istediğiniz şeyi gerçekten düşünmüyorum.

Ben Microsoft writes about embedded images da OLE-Nesneler için geçerlidir şeye inanacak:

Sen resim dosyasının dosya adı image1.gif için Eagle1.gif olarak değiştirildi fark edebilirsiniz. Bu, gizlilikle ilgili endişeleri ele almak için yapılır; kötü niyetli bir kişi, bir görüntü dosyası gibi bir belgedeki parçaların adından rekabet avantajı sağlayabilir. Örneğin, bir yazar, belge dosyasının metin kısmını şifreleyerek bir belgenin içeriğini korumayı seçebilir. Ancak, iki resim eski_widget.gif ve new_reenforced_widget.gif olarak adlandırılmışsa, metin korunsa bile, kötü niyetli bir kişi, widget'ın yükseltildiğini öğrenebilir. Image1 ve image2 gibi genel resim dosyası adlarını kullanmak Office Open XML Formats dosyalarına başka bir koruma katmanı ekler.

Ancak, (Word 2007 dosya, nam XWPFDocument, namı diğer ".docx" için, diğer MS Office dosyalarını benzer işe) deneyebilirsiniz:

try (FileInputStream fis = new FileInputStream("mydoc.docx")) { 
    document = new XWPFDocument(fis); 
    listEmbeds (document); 
} 


private static void listEmbeds (XWPFDocument doc) throws OpenXML4JException { 
    List<PackagePart> embeddedDocs = doc.getAllEmbedds(); 
    if (embeddedDocs != null && !embeddedDocs.isEmpty()) { 
     Iterator<PackagePart> pIter = embeddedDocs.iterator(); 
     while (pIter.hasNext()) { 
      PackagePart pPart = pIter.next(); 
      System.out.print(pPart.getPartName()+", "); 
      System.out.print(pPart.getContentType()+", "); 
      System.out.println(); 
     } 
    } 
} 

pPart.getPartName() ben bulabildiğim en yakın olan gömülü bir dosyanın dosya adı.

0
public class GetEmbedded { 

    public static void main(String[] args) throws Exception { 
     String path = "SomeExcelFile.xlsx" 
     XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream(new File(path))); 

      for (PackagePart pPart : workbook.getAllEmbedds()) { 
          String contentType = pPart.getContentType(); 
          System.out.println("List of all the embedded contents in the Excel"+contentType); 
      } 
    } 
}