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