#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, то есть другой прагматичный способ:
- извлеките все соответствующие смещения, которые содержат OfficeDrawings, используя POI.
- Внутри Word: выполните итерацию по документу с помощью VBA и скопируйте все рисунки с заданными смещениями в буфер обмена.
- Используйте какое-либо другое приложение (я выбрал 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