2017-12-21 28 views
0

私の目標はApache POIを使用して.docx文書をJavaで処理することです。私はドキュメントからすべてを抽出して新しいものを作成したいが、処理されたドキュメントから選択できる特定のコンテンツのみを作成したい。 これまでのところ、テーブルやテキストでは動作しますが、写真に関する問題があります。通常、私は、このようにそれらを抽出します:Rは、段落から抽出され、タイプXWPFRunのですApache POI XWPF - 実行に画像が含まれていないか確認してください。

List<XWPFPictureData> images = r.getEmbeddedPictures(); 

。 ここで大きな問題は、この解決策は一部の画像でのみ機能し、画像がWord文書にどのように挿入されるかによって異なります。

実行のXMLコードにアクセスでき、このような画像を見つけようとしましたが、これはpythonでうまく動作し、xpathクエリを指定できます。 Javaで同じことを試みましたが、エラーメッセージが表示されました。

r.getCTR().selectPath(".//w:drawing/wp:inline/a:graphic/a:graphicData/pic:pic/pic:blipFill/a:blip/@r:embed")) 

そして、それは、この例外を返します: enter image description here

+2

XPathエンジンがないと思われます。あなたのクラスパスを確認しました – gtosto

+0

はい、まさにそうでした。私のプロジェクトにxmlbeans-xpath.jarを追加すると、これが解決されました。 – Phil

答えて

2

使用可能なすべてのエンジンは、名前空間を認識するものです。ここで

は、実行は、画像が含まれているかどうかを確認するために私のコードですしたがって、名前空間を宣言する必要があります。

import java.io.FileInputStream; 

import org.apache.poi.xwpf.usermodel.*; 

import org.apache.xmlbeans.XmlObject; 

public class WordRunSelectPath { 

public static void main(String[] args) throws Exception { 

    XWPFDocument document = new XWPFDocument(new FileInputStream("WordInsertPictures.docx")); 
    for (XWPFParagraph paragraph : document.getParagraphs()) { 
    for (XWPFRun run : paragraph.getRuns()) { 
    String declareNameSpaces = "declare namespace w='http://schemas.openxmlformats.org/wordprocessingml/2006/main'; " 
         + "declare namespace wp='http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing'; " 
         + "declare namespace a='http://schemas.openxmlformats.org/drawingml/2006/main'; " 
         + "declare namespace pic='http://schemas.openxmlformats.org/drawingml/2006/picture'; " 
         + "declare namespace r='http://schemas.openxmlformats.org/officeDocument/2006/relationships' "; 

    XmlObject[] selectedObjects = run.getCTR().selectPath(
         declareNameSpaces 
         + ".//w:drawing/wp:inline/a:graphic/a:graphicData/pic:pic/pic:blipFill/a:blip/@r:embed"); 
    if (selectedObjects.length > 0) { 
    String rID = selectedObjects[0].newCursor().getTextValue(); 
    System.out.println(rID); 
    } 
    } 
    } 

    document.close(); 
} 
} 
+0

ありがとう!それは今働く。私の次の問題がどこにあるのか分からない名前空間。欠けている依存関係の問題を解決した後。 – Phil

+0

@ Phil:あなたは大歓迎です。 XPATHの使い方を誰かが知っていることに私は驚いていました。これが "偉大な蛇の弟子"であるときでさえ、別名Python ;-)。 –

関連する問題