我有一个简单的要求,即提取在MS Word文件中绘制的所有图像和图表。 我只能提取图像而不能提取形状组(如用例图或活动图)。我想将所有Diagrams保存为图像。
我使用过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();
}
}
}
它只提取图像而不是形状。
有人知道我该怎么做?
答案 0 :(得分: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();
使用所有这些记录中的数据,您可以理论上再次渲染原始图形。但这很痛苦......
到目前为止,我只在一个案例中完成了这项工作,我在页面上有很多简单的箭头。那些必须转换为文本表示(类似于:&#34;位置(x1,y1)和(x2,y2)通过箭头&#34; )连接。这样做本质上意味着使用上述记录实现与这些箭头相关的[MS-ODRAW]的子集。这不是一项令人愉快的任务。
如果使用MS Word本身是一个选项,那么还有另一种实用的方法:
步骤1中对图纸的必要检查非常简单(见下文)。其余的可以在Word中完全自动化。如果有人需要,我可以分享相应的VBA代码。
if (characterRun.isSpecialCharacter()) {
for (char currentChar : characterRun.text().toCharArray()) {
if ('\u0008' == currentChar) return true;
}
}
答案 1 :(得分:0)
如果您的意思是Office Art对象,那么
在类org.apache.poi.hwpf.HWPFDocument中 有一个_officeDrawingsMain包含办公室艺术品
点击此链接https://poi.apache.org/apidocs/org/apache/poi/hwpf/HWPFDocument.html