2016-03-21 8 views
0

Gibt es eine Möglichkeit, alle eingebetteten Objekte (doc, ..., txt) in einer Office-Datei (doc, docx, xls, xlsx, ppt, pptx, ...) aufzulisten?Wie listet man alle eingebetteten Dateien aus einem Microsoft Office-Dokument mit Apache POI auf?

Ich verwende Apache POI (Java) Bibliothek, um Text aus Office-Dateien zu extrahieren. Ich muss nicht den ganzen Text von eingebetteten Objekten extrahieren, eine Protokolldatei mit den Dateinamen aller eingebetteten Dokumente wäre schön (so etwas wie: string objectFileNames = getEmbeddedFileNames(fileInputStream)).

Beispiel: Ich habe ein Word-Dokument "test.doc", das eine andere Datei namens "excel.xls" enthält. Ich möchte den Dateinamen von excel.xls (in diesem Fall) in eine Protokolldatei schreiben.

Ich versuchte dies mit einigen Beispielcode von der Apache-Homepage (https://poi.apache.org/text-extraction.html). Aber mein Code gibt immer den gleichen zurück ("Footer Text: Header Text").

Was ich versucht ist:

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

} 

Eingabedatei xls, das eine doc-Datei als Objekt enthält und Ausgabedatei ist txt.

Danke, wenn mir jemand helfen kann.

Antwort

1

Ich glaube nicht, dass eingebettete OLE-Objekte ihren ursprünglichen Dateinamen behalten, also glaube ich nicht, was Sie wirklich wollen.

Ich glaube, was Microsoft writes about embedded images gilt auch für OLE-Objekte:

Sie vielleicht feststellen, dass der Dateiname der Bilddatei von Eagle1.gif geändert wurde image1.gif. Dies geschieht, um Datenschutzbedenken entgegenzuwirken, indem eine böswillige Person aus dem Namen von Teilen in einem Dokument, wie beispielsweise einer Bilddatei, einen Wettbewerbsvorteil ziehen kann. Zum Beispiel könnte ein Autor den Inhalt eines Dokuments schützen, indem er den Textteil der Dokumentdatei verschlüsselt. Wenn jedoch zwei Bilder mit den Namen old_widget.gif und new_reenforced_widget.gif eingefügt werden, kann eine böswillige Person die Tatsache lernen, dass das Widget aktualisiert wird, obwohl der Text geschützt ist. Durch die Verwendung generischer Bilddateinamen wie image1 und image2 wird Office Open XML Formats-Dateien eine weitere Schutzebene hinzugefügt.

Sie können jedoch versuchen (für Word 2007 Dateien, auch bekannt als XWPFDocument, auch bekannt als ".docx", andere MS-Office-Dateien arbeiten ähnlich):

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

Die pPart.getPartName() ist das nächstgelegene ich finden konnte ein Dateiname einer eingebetteten Datei.

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); 
      } 
    } 
} 
Verwandte Themen