Как создать файл слова с добавлением файлов wmf в виде встроенных уравнений по POI?

Среда: word2007 на windows7.

Я разбираю файл word (.docx), используя последнюю библиотеку Apache POI (3.16), и успешно уточняю тексты, изображения и встроенные математические уравнения.

Чтобы разобрать встроенные уравнения математического типа, я использовал следующий API

List<XWPFPictureData> allPictures = doc.getAllPictures();
int i = 0;
for (XWPFPictureData picture: allPictures) {
    if (picture.getFileName().endsWith(".wmf")) {
        FileUtils.writeByteArrayToFile(new File(i + ".wmf"), 
        picture.getData());
        i++;
    }
}

Теперь я хочу создать новый файл word (docx), добавив в него тексты, изображения и встроенные уравнения математического типа.

Добавьте текст: XWPFRun run = para.createRun(); run.setText("xxx").

Добавить картинку: XWPFPicture xwpfPicture = run.addPicture(pictureData, pictureType, filename, Units.pixelToEMU(width), Units.pixelToEMU(height));

Добавить wmf: String rId = doc.addPictureData(new FileInputStream(wmfFilePath), Document.PICTURE_TYPE_WMF);

Проблема в том, что wmf теперь невидим, а как сделать его видимым и разместить в нужном месте? или сказать, что wmf связан с созданным прогоном.

Видел примеры poi и тестовые примеры, но до сих пор не могу найти API или метод. http://svn.apache.org/repos/asf/poi/trunk/src/ooxml/testcases/org/apache/poi/xwpf/ http://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/xwpf/usermodel/examples/

Есть один связанный с этим вопрос: Как добавить встроенные уравнения в файлы docx с помощью Apache POI?

Разница в том, что я просто хочу добавить проанализированные файлы wmf в новый файл слова, а не программно писать некоторые математические уравнения.

Может кто-нибудь помочь?


например: у меня есть слово, которое имеет одно уравнение математического типа, при двойном щелчке по нему открывается редактор математического типа, поскольку на машине установлено программное обеспечение математического типа.

Разобрал его, используя API POI:

doc.getAllPictures(); FileUtils.writeByteArrayToFile (новый файл (i + ".wmf"), picture.getData());

Теперь уравнение математического типа преобразуется в файлы wmf на диске.

run.addPicture(pictureData, Document.PICTURE_TYPE_WMF, имя файла, Units.pixelToEMU(ширина), Units.pixelToEMU(высота)) он может добавить wmf как изображение, но я хочу восстановить слово, когда пользователь дважды щелкает слово уравнение, редактор mathtype открыт.

POI может анализировать уравнение математического типа в слове в файлы wmf, есть ли способ записать слово как исходное?


person five    schedule 08.07.2017    source источник
comment
POI может анализировать уравнение математического типа в слове в файлы wmf: нет, не может. Если doc.getAllPictures() находит WMF картинок в *.docx файлах, то они должны были попасть туда до того, как poi начал читать. И сам Word 2007 не будет помещать формулы в виде WMF картинок в *.docx файл. Он преобразует формулы в изображения при сохранении как Word 97/2003 format *.doc. Но после этого они только картинки, а не формулы.   -  person Axel Richter    schedule 08.07.2017
comment
Откройте новое пустое слово, сначала вставьте изображение png, затем вставьте объект, выберите MathType 6.0 Equation, вставьте уравнение математического типа. Уравнение может быть двойным щелчком мыши. Затем doc.getAllPictures() вернет два объекта XWPFPictureData. Напечатайте имя файла: один — image1.png, другой — image2.wmf. Разве это не может доказать, что XWPFPictureData.getData() анализирует уравнение математического типа? Повторно откройте слово, уравнение также можно дважды щелкнуть.   -  person five    schedule 08.07.2017
comment
затем вставьте объект, выберите MathType 6.0: Ah. Но тогда это OLEObject, встроенный в Word, а не реальная формула, вставленная с использованием Insert - Formula. Нет, apache poi пока не поддерживает создание таких OLEObject в XWPF. Добиться этого можно было, заморачиваясь специальными XML для этого в /word/document.xml и доставая откуда-то нужные /word/embeddings/oleObject1.bin. Но я этого делать не буду, так как такой подход древний (более 10 лет).   -  person Axel Richter    schedule 08.07.2017
comment
apache poi до сих пор не поддерживает создание таких объектов OLEObject в XWPF. О, это печаль. Итак, если слово имеет уравнение математического типа (OLEObject), синтаксический анализ POI является односторонним процессом, не может восстановить слово как исходное. верно? У меня есть текстовые файлы pic и wmf, которые анализируются POI. Требование состоит в том, чтобы экспортировать слово программно. Если уравнение математического типа (OLEObject) можно добавить к новому созданному слову, пользователи могут использовать его более удобно. Есть ли для этого какие-либо хорошие современные способы рекомендовать?   -  person five    schedule 08.07.2017
comment
Как уже говорилось, вам нужно будет создать специальный XML в /word/document.xml. Создайте *.docx, имеющий OLEObjectsтипа MathType 6.0 Equation, используя Word. Эти *.docx файлы являются ZIPархивами. Разархивируйте его и посмотрите на /word/document.xml. Там вы увидите то, что нужно. И вам также понадобится /word/embeddings/oleObject1.bin из этого архива. Это двоичный файл, который реагирует на двойной щелчок.   -  person Axel Richter    schedule 08.07.2017
comment
Я немного понимаю, а потом попробую. Большое спасибо.   -  person five    schedule 08.07.2017
comment
Я попробовал это и разархивировал слово, но мне было трудно понять xml. При разборе слова я много гуглил и писал тестовый код, наконец нашел xwpfPictureData.getRelationId(xwpfPictureData.getParent()) и run.getCTR(). toString(), в xml, ‹v:imagedata r:id=rId1, в соответствии с этим rId, чтобы соответствовать порядку изображения. Но теперь я обнаружил, что мне сложно восстановить исходное слово, а CTR CTP... Объект имеет небольшой документ и образец, которые трудно понять.   -  person five    schedule 08.07.2017
comment
Другое дело, что у меня есть только файлы wmf или латекс, интересно, можно ли в этом случае создать файл слова с правильным математическим типом OLEObject. Честно говоря, я не понимаю, что делать дальше, и почти хочу сдаться. некоторые предложения.   -  person five    schedule 08.07.2017