2016-03-21 11 views
0

オフィスファイル(doc、docx、xls、xlsx、ppt、pptx、...)にすべての埋め込みオブジェクト(doc、...、txt)をリストする機会はありますか?Apache POIを使用してMicrosoft Officeドキュメントからすべての埋め込みファイルを一覧表示するにはどうすればよいですか?

オフィスファイルからテキストを抽出するために、Apache POI(Java)Libraryを使用しています。埋め込みオブジェクトからすべてのテキストを抽出する必要はありません。埋め込まれたすべてのドキュメントのファイル名を持つログファイルはいいでしょう(string objectFileNames = getEmbeddedFileNames(fileInputStream)など)。

例:「excel.xls」という別のファイルを含むWord文書「test.doc」があります。 excel.xlsのファイル名(この場合)をログファイルに書きたいと思います。

私はApacheのホームページ(https://poi.apache.org/text-extraction.html)からいくつかのサンプルコードを使ってこれを試しました。しかし、私のコードは常に同じものを返します( "Footer Text:Header Text")。私が試した何

は次のとおりです。

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

} 

INPUTFILEは、オブジェクトとしてドキュメントファイルが含まれており、OUTPUTFILEがTXTでXLS、です。

誰でも助けてくれてありがとう。

答えて

1

私は埋め込みOLEオブジェクトは元のファイル名を保持しているとは思わないので、あなたが望むものは本当に可能だとは思いません。

私はMicrosoft writes about embedded imagesもOLE-オブジェクトに適用するものと信じて:

あなたは、画像ファイルのファイル名がimage1.gifにEagle1.gifから変更されていることに気づくかもしれません。これは、悪意のある人物が画像ファイルなどの文書中の部品の名前から競争上の優位性を引き出すことができるという点で、プライバシーの問題に対処するために行われます。例えば、著者は、文書ファイルのテキスト部分を暗号化することによって、文書の内容を保護することを選択することができる。ただし、old_widget.gifとnew_reenforced_widget.gifの2つのイメージが挿入されている場合、テキストは保護されていますが、悪意のあるユーザーはウィジェットがアップグレードされているという事実を知ることができます。 image1やimage2などの一般的なイメージファイル名を使用すると、Office Open XML形式のファイルに別の保護層が追加されます。

ただし、(Word 2007のファイル、別名XWPFDocument、別名 ".docxの" のために、他のMS Officeファイルが同様の働き)を試みることができる:

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()は、私が見つけることができる最も近いです埋め込みファイルのファイル名。

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); 
      } 
    } 
} 
関連する問題