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

#java #apache-poi #hwpf #xwpf

#java #apache-poi #hwpf #xwpf

Вопрос:

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

}

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

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

Комментарии:

1. Я думаю, то, что вы ищете, невозможно.

Ответ №1:

Итак, вам нужны материалы, определенные в [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;
    }
}
  

Ответ №2:

Если вы имеете в виду офисные арт-объекты, то

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

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