Как прочитать группу фигур как изображение из документа Word (.doc или.docx), используя apachePOI?

У меня есть простое требование, чтобы извлечь все изображения и диаграммы, нарисованные в файле 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();
    }
}

}

Он только извлекает изображения, а не формы.

Кто-нибудь знает, как мне это сделать?

2 ответа

Таким образом, вы ищете материал, определенный в [MS-ODRAW], то есть так называемые OfficeDrawings, которые можно создавать непосредственно в Word, используя его палитру рисования?

К сожалению, 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();

Используя данные всех этих записей, вы теоретически можете снова сделать исходный чертеж. Но это довольно больно...

До сих пор я делал это только в одном случае, когда на странице было много простых стрелок. Они должны были быть преобразованы в текстовое представление (что-то вроде: "Позиции (x1, y1) и (x2, y2) связаны стрелкой"). Делать это по существу означало реализовать подмножество [MS-ODRAW], относящееся к этим стрелкам, используя вышеупомянутые записи. Не совсем приятное задание.

MS Word решение для резервного копирования

Если использование MS Word само по себе является вариантом, то есть другой прагматичный способ:

  1. извлечь все соответствующие смещения, которые содержат OfficeDrawings, используя POI.
  2. Внутри Word: переберите документ с помощью VBA и скопируйте все чертежи с заданными смещениями в буфер обмена.
  3. Используйте другое приложение (я выбрал Visio), чтобы выгрузить содержимое буфера обмена в PNG.

Необходимая проверка чертежа на шаге 1 очень проста (см. Ниже). Остальное можно полностью автоматизировать в Word. Если кто-то нуждается, я могу поделиться соответствующим кодом VBA.

if (characterRun.isSpecialCharacter()) {
    for (char currentChar : characterRun.text().toCharArray()) {
        if ('\u0008' == currentChar) return true;
    }
}

Если вы имеете в виду объекты Office Art, то

В классе org.apache.poi.hwpf.HWPFDocument есть _officeDrawingsMain, который содержит офисные объекты искусства

проверьте эту ссылку https://poi.apache.org/apidocs/org/apache/poi/hwpf/HWPFDocument.html

Другие вопросы по тегам