Java读取Word图片坐标的常用方法总结

 更新时间:2026年05月27日 08:55:48   作者:hef288  
本文介绍了使用Java处理Word文档中图片坐标的方法,主要讲解了两种图片类型(内嵌式图片和浮动定位图片),文中的示例代码讲解详细,感兴趣的小伙伴可以了解下

在平常办公自动化开展过程里, 常常得从Wor‌d文档当⁠中提取图片, 还⁠要清晰知晓其确切位置⁠。好多开发者觉得图片不‍过是单纯镶嵌于段落之中, 实际上Wo‌rd文档里头的图片常常被安⁠放在一个叫做“‍锚点”的架构之内, 关键参数便⁠是图片相对于页面或者段‍落的坐标。‍接下来我‍就从编⁠程实战的层面, 说一⁠说怎样用Java获‍取‍这些坐标信息。

这里整理了三种主流的实现方案,并会先介绍坐标计算的一个关键核心概念 EMU,帮助你更好地理解和运用这些方法。

核心概念:EMU (English Metric Unit)

在使用任何库处理 Word 图片坐标时,你几乎都会遇到 EMU 这个单位。它是 Office 内部用于精确布局的度量标准。

定义:EMU 是一种整数运算单位,用于确保在不同分辨率和设备上都能保持精确的布局。

换算关系:掌握 EMU 与常见单位的换算至关重要:

  • 1 inch (英寸) = 914,400 EMUs
  • 1 cm (厘米) ≈ 360,000 EMUs

三种主流实现方案解析

方案一:Apache POI (开源免费)

适用场景:主要处理 .docx 文件,内嵌式图片通常可直接通过 XWPFRun.getEmbeddedPictures() 获取。但官方 API 并不直接提供图片位置,不过可以通过解析 XML 来实现。

核心思路:通过解析 word/document.xml 文件中的 <wp:anchor>(定位型图片)或 <wp:inline>(内嵌型图片)标签来提取位置信息。

示例代码

// ... 加载 XWPFDocument 对象 doc
try (FileInputStream fis = new FileInputStream("your_document.docx")) {
    XWPFDocument doc = new XWPFDocument(fis);
    
    // 获取文档的底层XML对象
    CTDocument1 ctDoc = doc.getDocument();
    
    // 通过解析ctDoc对象,遍历所有段落,深度搜索其中的&lt;wp:anchor&gt;和&lt;wp:inline&gt;节点
    // 从这些节点中可以解析出距离信息,如distT, distB, distL, distR
    // 或水平位置positionH,垂直位置positionV等[reference:3][reference:4]
    
    // 注意:此方法代码量较多,需要结合XPath解析XML结构,并处理EMU单位转换
}

这种方式的优点是免费且灵活,能够深入到文档的 XML 结构中进行精确控制;但缺点也相对明显:实现复杂度高,需要自己编写大量 XML 解析和数据处理逻辑。

方案二:Aspose.Words for Java (商业库,但功能最强大)

适用场景:需要处理各种复杂文档,且对提取的准确性和易用性有较高要求。

核心思路:Aspose.Words 提供了非常直观的 API。图片在文档中作为 Shape 节点存在,其位置和尺寸可以直接通过 Shape 对象的方法获取。

示例代码

import com.aspose.words.*;

public class ExtractImagePositions {
    public static void main(String[] args) throws Exception {
        // 加载文档
        Document doc = new Document("your_document.docx");
        
        // 遍历文档中的所有Shape节点(图片就是Shape的一种)
        NodeCollection shapes = doc.getChildNodes(NodeType.SHAPE, true);
        for (Shape shape : (Iterable&lt;Shape&gt;) shapes) {
            // 判断是否为图片
            if (shape.getShapeType() == ShapeType.IMAGE) {
                // 获取绝对水平和垂直位置(单位:磅)
                double x = shape.getAbsoluteHorizontalPosition();
                double y = shape.getAbsoluteVerticalPosition();
                double width = shape.getWidth();
                double height = shape.getHeight();
                
                System.out.println("Image Position: (" + x + ", " + y + ")");
                System.out.println("Image Size: (" + width + ", " + height + ")");
            }
        }
    }
}

这个方案的优点是代码简洁,能够轻松获取位置、尺寸等信息;且功能强大,能处理浮动和内嵌等各种复杂场景。

方案三:Spire.Doc for Java (商业库)

适用场景:对中文支持较好,提供了清晰的 API。

核心思路:通过遍历文档的 Section、Paragraph 对象,判断其下的 DocumentObject 是否为 DocPicture,并直接获取其 HorizontalPositionVerticalPosition 等坐标属性。

示例代码

import com.spire.doc.*;
import com.spire.doc.documents.DocumentObjectType;
import com.spire.doc.fields.DocPicture;
public class GetPictureDetails {
    public static void main(String[] args) {
        Document doc = new Document();
        doc.loadFromFile("your_document.docx");
        for (Section section : doc.getSections()) {
            for (Paragraph paragraph : section.getParagraphs()) {
                for (DocumentObject docObj : paragraph.getChildObjects()) {
                    if (docObj.getDocumentObjectType() == DocumentObjectType.Picture) {
                        DocPicture picture = (DocPicture) docObj;
                        // 获取图片的水平和垂直位置(磅)
                        float x = picture.getHorizontalPosition();
                        float y = picture.getVerticalPosition();
                        float width = picture.getWidth();
                        float height = picture.getHeight();
                        System.out.println("图片位置:(" + x + ", " + y + ")");
                        System.out.println("图片尺寸:" + width + " x " + height);
                    }
                }
            }
        }
    }
}

Spire.Doc 的优点在于接口友好,文档完善,对中文的支持也相当出色。

总结与对比

特性Apache POIAspose.WordsSpire.Doc
许可模式开源免费商业授权商业授权
坐标提取能力需深层解析 XML,实现复杂简单直接,API 强大简单直接,API 清晰
格式支持主要支持 .docx全面支持 .doc, .docx 等全面支持 .doc, .docx 等
核心优势免费,是许多项目的首选库功能最强,处理最复杂中文友好,API 清晰
缺点/挑战坐标提取门槛高,官方文档示例较少商业授权,需采购许可商业授权,需采购许可

选择哪种方案,通常取决于项目预算和对坐标提取的需求深度。如果追求开源免费且不介意工作量,POI 是可行的;如果希望快速、稳定地实现功能,Aspose.Words 或 Spire.Doc 会节省大量时间。

Java 获取Word中指定图片的坐标位置

import com.spire.doc.*;
import com.spire.doc.documents.DocumentObjectType;
import com.spire.doc.documents.Paragraph;
import com.spire.doc.fields.DocPicture;
public class GetCoordinatesOfPicture {
    public static void main(String[] args) {
        //加载Word测试文档
        Document doc = new Document();
        doc.loadFromFile("input.docx");
        //遍历section
        for (int a = 0; a<doc.getSections().getCount();a++)
        {
            Section section = doc.getSections().get(a);
            //遍历paragraph段落
            for (int b =0 ;b<section.getParagraphs().getCount();b++)
            {
                Paragraph paragraph = section.getParagraphs().get(b);
                //遍历段落中的对象
                for (int i = 0; i < paragraph.getChildObjects().getCount(); i++)
                {
                    DocumentObject docobj = paragraph.getChildObjects().get(i);
                    //判断对象是否为图片
                    if (docobj.getDocumentObjectType()== DocumentObjectType.Picture)
                    {
                        DocPicture picture = (DocPicture) docobj ;
                        if (picture.getTitle().equals("图片4"))//定位标题为“图片4”的图片
                        {
                            //获取图片坐标位置
                            float x = picture.getHorizontalPosition();
                            float y = picture.getVerticalPosition();
                            System.out.println("坐标位置为:\n X=" + x + " Y=" + y);
                        }
                    }
                }
            }
        }
    }
}

到此这篇关于Java读取Word图片坐标的常用方法总结的文章就介绍到这了,更多相关Java读取Word图片坐标内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

最新评论