6

MS Word ファイルに描画されたすべての画像と図を抽出するという単純な要件があります。画像のみを抽出できますが、図形のグループ (ユースケース図やアクティビティ図など) は抽出できません。すべてのダイアグラムを画像として保存したい。

私はapachePOIを使用しました。

私が書いた次のコード

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

}

形状ではなく画像のみを抽出します。

誰もこれを行う方法を知っていますか?

4

2 に答える 2

2

[MS-ODRAW]で定義されているもの、つまり Word で Drawing パレットを使用して直接作成できる、いわゆる OfficeDrawings をお探しですか?

残念ながら、POI はここではほとんど役に立ちません。HWPF (古いバイナリ *.doc ファイル形式) を使用すると、のようなデータのハンドルを取得できます。

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

これdrawingは、個々のレコードにさらに処理できます。

EscherRecordManager escherRecordManager = new EscherRecordManager(drawing.getOfficeArtSpContainer());
EscherSpRecord escherSpRecord = escherRecordManager.getSpRecord();
EscherOptRecord escherOptRecord = escherRecordManager.getOptRecord();

これらすべてのレコードからのデータを使用して、理論的には元の図面を再度レンダリングできます。でも結構痛い…。

これまでのところ、これを行ったのは、ページ上にたくさんの単純な矢印が浮かんでいる 1 つのケースだけでした。これらはテキスト表現に変換する必要がありました ( 「位置 (x1, y1) と (x2, y2) は矢印で接続されています」のようなもの)。これを行うことは、基本的に、上記のレコードを使用して、これらの矢印に関連する [MS-ODRAW] のサブセットを実装することを意味しました。まったく楽しい仕事ではありません。

MS Word バックアップ ソリューション

MS Word 自体を使用するオプションがある場合は、別の実用的な方法があります。

  1. POI を使用して、OfficeDrawings を含むすべての関連オフセットを抽出します。
  2. 内部 Word: VBA を使用してドキュメントを反復処理し、指定されたオフセットですべての図面をクリップボードにコピーします。
  3. 他のアプリケーション (私は Visio を選択) を使用して、クリップボードの内容を PNG にダンプします。

ステップ 1 で必要な図面のチェックは非常に簡単です (以下を参照)。残りは Word で完全に自動化できます。誰かが必要な場合は、それぞれの VBA コードを共有できます。

if (characterRun.isSpecialCharacter()) {
    for (char currentChar : characterRun.text().toCharArray()) {
        if ('\u0008' == currentChar) return true;
    }
}
于 2016-01-04T00:26:00.127 に答える
0

オフィス アート オブジェクトを意味する場合

クラス org.apache.poi.hwpf.HWPFDocument には、オフィス アート オブジェクトを含む _officeDrawingsMain があります。

このリンクを確認してくださいhttps://poi.apache.org/apidocs/org/apache/poi/hwpf/HWPFDocument.html

于 2014-10-18T06:39:24.910 に答える