Java读取Word图片坐标的常用方法总结
在平常办公自动化开展过程里, 常常得从Word文档当中提取图片, 还要清晰知晓其确切位置。好多开发者觉得图片不过是单纯镶嵌于段落之中, 实际上Word文档里头的图片常常被安放在一个叫做“锚点”的架构之内, 关键参数便是图片相对于页面或者段落的坐标。接下来我就从编程实战的层面, 说一说怎样用Java获取这些坐标信息。
这里整理了三种主流的实现方案,并会先介绍坐标计算的一个关键核心概念 EMU,帮助你更好地理解和运用这些方法。
核心概念:EMU (English Metric Unit)
在使用任何库处理 Word 图片坐标时,你几乎都会遇到 EMU 这个单位。它是 Office 内部用于精确布局的度量标准。
定义:EMU 是一种整数运算单位,用于确保在不同分辨率和设备上都能保持精确的布局。
换算关系:掌握 EMU 与常见单位的换算至关重要:
1 inch (英寸) = 914,400 EMUs1 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对象,遍历所有段落,深度搜索其中的<wp:anchor>和<wp:inline>节点
// 从这些节点中可以解析出距离信息,如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<Shape>) 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,并直接获取其 HorizontalPosition、VerticalPosition 等坐标属性。
示例代码:
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 POI | Aspose.Words | Spire.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图片坐标内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
idea已经提交到远程分支,但需要本地和远程都回退到某一版本问题
这篇文章主要介绍了idea已经提交到远程分支,但需要本地和远程都回退到某一版本问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2023-11-11
SpringBoot项目执行脚本 自动拉取最新代码并重启的实例内容
在本篇文章里小编给大家整理的是一篇关于SpringBoot项目执行脚本 自动拉取最新代码并重启的实例内容,有需要的朋友们参考下。2019-12-12
详解SpringMVC注解@initbinder解决类型转换问题
本篇文章主要介绍了详解SpringMVC注解@initbinder解决类型转换问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-03-03


最新评论