Java解析word,获取文档中图片位置,互联网 面试官 如何面试

语雀:开发者必备的知识管理与团队协作平台深度解析 知识管理是现代开发者和技术团队提升效率、沉淀经验的核心实践,其原理在于通过结构化的方式组织信息,将碎片化的知识转化为可复用、可协作的资产。这一过程的技术价值在于打破信息孤岛,促进知识流动与传承,从而加速问题解决和团队成长。在应用场景上,无论是个人学习笔记、技术文档沉淀,还是团队的项目协作与决策记录,一个优秀的工具都至关重要。本文聚焦于语雀这一平台,它通过“文档-知识库-空间”的三层结构设计,精准平衡了个人创作的流畅性与团队协作的结构化需求。其强大的块编辑器、双向链接功能,特别是全面高效的快捷键体系,能显著提 阅读详情


写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家。扫码加微信好友进【程序员面试学习交流群】,免费领取。也欢迎各位一起在群里探讨技术。

 

前言(背景介绍):
Apache POI是Apache基金会下一个开源的项目,用来处理office系列的文档,能够创建和解析word、excel、ppt格式的文档。

 

其中对word文档的处理有两个技术,分别是HWPF(.doc)和XWPF(.docx)。如果你对这两个技术熟悉的话,就应该能明白使用java解析word文档的痛楚所在。

其中两个最大的问题在于:

第一是这两个类并没有统一的父类和接口(隔壁的XSSF和HSSF投过来鄙视的眼光),所以没法进行同一格式的接口式编程;

第二是官方API中并没有文档中图片相对位置的接口,这就导致了虽然你能获得文档中的所有图片,但是你并不能知道这些图片是在哪里,将来要展示图片就没法插入到正确的位置。

对于第一点,我是没什么办法,可以研究下其他相关技术,比如jacob,doc4j等看看有没有其他的解决方案,不过doc4j这货貌似只能处理2007文档(.docx)。

对于第二点,本文将给出笔者的解决方案,实际上,这也是我写本文的目的所在。

 

注意:简单求快的同学看第二章和第三章就行了;

一、预备知识

1.word文档的两种格式对应两种不同的存储方式

众所周知,word文档有两种存储格式:doc和docx

doc:习惯上称为Word2003,使用二进制储存数据;这个不是我们今天讨论的重点.

docx:word2007,使用xml来存储数据和格式.

可能你会问了,明明是docx结尾的文档,怎么成了xml格式了?

很简单:你随便选择一个docx文件,右键使用压缩工具打开,就能得到一个这样的目录结构:

 

所以你以为docx是一个完整的文档,其实它只是一个压缩文件。(docx:?_?)

 

2.Word文档中xml的定义格式:

从前面我们知道了docx文档使用压缩文件也就是xml来描述数据,那么word文档中的数据具体是怎么定义的呢?

出于篇幅的关系,这里不会详细地描述整个压缩的文档,这里只简单介绍下两个文件/文件夹:

一是word目录下的documen.xml文件,这个就是整个文档内容的定义;

二是word目录下的media文件夹,看名字也能猜出来这个文件夹里面是文档中的多媒体内容:

图3:word/document.xml(定义文档内容) 图4:word/media文件夹下的内容

 

以下是document.xml文档的部分关键内容:

A:document整体结构定义:



 

<w:document mc:ignorable="w14 w15 wp14" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" xmlns:wpscustomdata="http://www.wps.cn/officeDocument/2013/wpsCustomData">

    <w:body>

        <w:p>

            <w:ppr>

                <w:pstyle w:val="2">

                </w:pstyle>

                <w:keepnext w:val="0">

                </w:keepnext>

                <w:keeplines w:val="0">

                </w:keeplines>

                <w:widowcontrol>

                </w:widowcontrol>

                <w:suppresslinenumbers w:val="0">

                </w:suppresslinenumbers>

                <w:pbdr>

                    <w:top w:color="auto" w:space="0" w:sz="0" w:val="none">

                    </w:top>

                    <w:left w:color="auto" w:space="0" w:sz="0" w:val="none">

                    </w:left>

                    <w:bottom w:color="auto" w:space="0" w:sz="0" w:val="none">

                    </w:bottom>

                    <w:right w:color="auto" w:space="0" w:sz="0" w:val="none">

                    </w:right>

                </w:pbdr>





View Code

B:文档段落内容:



 

<w:p>

            <w:ppr>

                <w:pstyle w:val="2">

                </w:pstyle>

                <w:keepnext w:val="0">

                </w:keepnext>

                <w:keeplines w:val="0">

                </w:keeplines>

                <w:widowcontrol>

                </w:widowcontrol>

                <w:suppresslinenumbers w:val="0">

                </w:suppresslinenumbers>

                <w:pbdr>

                    <w:top w:color="auto" w:space="0" w:sz="0" w:val="none">

                    </w:top>

                    <w:left w:color="auto" w:space="0" w:sz="0" w:val="none">

                    </w:left>

                    <w:bottom w:color="auto" w:space="0" w:sz="0" w:val="none">

                    </w:bottom>

                    <w:right w:color="auto" w:space="0" w:sz="0" w:val="none">

                    </w:right>

                </w:pbdr>

                <w:shd w:fill="FAFAFA" w:val="clear">

                </w:shd>

                <w:spacing w:after="150" w:afterautospacing="0" w:before="150" w:beforeautospacing="0" w:line="378" w:linerule="atLeast">

                </w:spacing>

                <w:ind w:firstline="0" w:left="0" w:right="0">

                </w:ind>

                <w:rpr>

                    <w:rfonts w:ascii="Verdana" w:cs="Verdana" w:hansi="Verdana" w:hint="default">

                    </w:rfonts>

                    <w:i w:val="0">

                    </w:i>

                    <w:caps w:val="0">

                    </w:caps>

                    <w:color w:val="404040">

                    </w:color>

                    <w:spacing w:val="0">

                    </w:spacing>

                    <w:sz w:val="21">

                    </w:sz>

                    <w:szcs w:val="21">

                    </w:szcs>

                </w:rpr>

            </w:ppr>

            <w:r>

                <w:rpr>

                    <w:rfonts w:ascii="Verdana" w:cs="Verdana" w:hansi="Verdana" w:hint="default">

                    </w:rfonts>

                    <w:i w:val="0">

                    </w:i>

                    <w:caps w:val="0">

                    </w:caps>

                    <w:color w:val="404040">

                    </w:color>

                    <w:spacing w:val="0">

                    </w:spacing>

                    <w:sz w:val="21">

                    </w:sz>

                    <w:szcs w:val="21">

                    </w:szcs>

                    <w:bdr w:color="auto" w:space="0" w:sz="0" w:val="none">

                    </w:bdr>

                    <w:shd w:fill="FAFAFA" w:val="clear">

                    </w:shd>

                </w:rpr>

                <w:t>

                    作者: Brian Dear

                </w:t>

            </w:r>

        </w:p>





View Code

C:图片内容定义:



 

<w:r>

                <w:rpr>

                    <w:rfonts w:ascii="Verdana" w:cs="Verdana" w:hansi="Verdana" w:hint="default">

                    </w:rfonts>

                    <w:i w:val="0">

                    </w:i>

                    <w:caps w:val="0">

                    </w:caps>

                    <w:color w:val="404040">

                    </w:color>

                    <w:spacing w:val="0">

                    </w:spacing>

                    <w:sz w:val="21">

                    </w:sz>

                    <w:szcs w:val="21">

                    </w:szcs>

                    <w:bdr w:color="auto" w:space="0" w:sz="0" w:val="none">

                    </w:bdr>

                    <w:shd w:fill="FAFAFA" w:val="clear">

                    </w:shd>

                </w:rpr>

                <w:drawing>

                    <wp:inline distb="0" distl="114300" distr="114300" distt="0">

                        <wp:extent cx="5543550" cy="5543550">

                        </wp:extent>

                        <wp:effectextent b="0" l="0" r="0" t="0">

                        </wp:effectextent>

                        <wp:docpr descr="IMG_256" id="1" name="Picture 1">

                        </wp:docpr>

                        <wp:cnvgraphicframepr>

                            <a:graphicframelocks nochangeaspect="1" xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">

                            </a:graphicframelocks>

                        </wp:cnvgraphicframepr>

                        <a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">

                            <a:graphicdata uri="http://schemas.openxmlformats.org/drawingml/2006/picture">

                                <pic:pic xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture">

                                    <pic:nvpicpr>

                                        <pic:cnvpr descr="IMG_256" id="1" name="Picture 1">

                                        </pic:cnvpr>

                                        <pic:cnvpicpr>

                                            <a:piclocks nochangeaspect="1">

                                            </a:piclocks>

                                        </pic:cnvpicpr>

                                    </pic:nvpicpr>

                                    <pic:blipfill>

                                        <a:blip r:embed="rId4">

                                        </a:blip>

                                        <a:stretch>

                                            <a:fillrect>

                                            </a:fillrect>

                                        </a:stretch>

                                    </pic:blipfill>

                                    <pic:sppr>

                                        <a:xfrm>

                                            <a:off x="0" y="0">

                                            </a:off>

                                            <a:ext cx="5543550" cy="5543550">

                                            </a:ext>

                                        </a:xfrm>

                                        <a:prstgeom prst="rect">

                                            <a:avlst>

                                            </a:avlst>

                                        </a:prstgeom>

                                        <a:nofill>

                                        </a:nofill>

                                        <a:ln w="9525">

                                            <a:nofill>

                                            </a:nofill>

                                        </a:ln>

                                    </pic:sppr>

                                </pic:pic>

                            </a:graphicdata>

                        </a:graphic>

                    </wp:inline>

                </w:drawing>

            </w:r>





View Code

有兴趣的童鞋可以看一下上面三段xml代码,我这里直接给结论了:

word文档shema文件:xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"

文档根节点:<w:document> 定义了整个文档的开始

<w:body>是document的子节点,文档的主体内容

<w:p>body子节点,一个段落,就是word文档中的段落

<w:r>P元素的子节点,一个Run定义了段落中具有相同格式的一段内容

<w:t>Run元素节点的子节点,就是文档的内容.

<w:drawing> run元素的子节点,定义了一张图片:

<w:inline> drawing子节点,具体应用也没有深入研究

<a:graphic> 定义图片内容

<pic:blipfill>这个是graphic文档的子节点,定义了图片内容的索引,具体来说,poi能根据这个名称拿到图片所对应的资源,而获取文档图片位置的关键也就在这里

 

总体看来:XWPF解析docx文档就是做了xml文档的解析,将所有的节点保存下来,然后转换成更加好用的属性,提供API出来供用户使用.

所以我们就能用POI提供给我们的接口拿到文档内容,自己去解析文档中的数据,就能获取到图片是在哪一个段落里了,当然你也可以得知图片是位于哪一个Run元素的后面.

二、实现

 

package com.szdfhx.reportStatistic.util;

import com.microsoft.schemas.vml.CTShape;

import org.apache.poi.xwpf.usermodel.XWPFParagraph;

import org.apache.poi.xwpf.usermodel.XWPFPictureData;

import org.apache.poi.xwpf.usermodel.XWPFRun;

import org.apache.xmlbeans.XmlCursor;

import org.apache.xmlbeans.XmlObject;

import org.openxmlformats.schemas.drawingml.x2006.main.CTGraphicalObject;

import org.openxmlformats.schemas.drawingml.x2006.picture.CTPicture;

import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTInline;

import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTDrawing;

import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTObject;

import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTR;

import java.util.ArrayList;

import java.util.List;

import java.util.Map;

public class XWPFUtils {

    //获取某一个段落中的所有图片索引

    public static List<String> readImageInParagraph(XWPFParagraph paragraph) {

        //图片索引List

        List<String> imageBundleList = new ArrayList<String>();

        //段落中所有XWPFRun

        List<XWPFRun> runList = paragraph.getRuns();

        for (XWPFRun run : runList) {

            //XWPFRun是POI对xml元素解析后生成的自己的属性,无法通过xml解析,需要先转化成CTR

            CTR ctr = run.getCTR();

            //对子元素进行遍历

            XmlCursor c = ctr.newCursor();

            //这个就是拿到所有的子元素:

            c.selectPath("./*");

            while (c.toNextSelection()) {

                XmlObject o = c.getObject();

                //如果子元素是<w:drawing>这样的形式,使用CTDrawing保存图片

                if (o instanceof CTDrawing) {

                    CTDrawing drawing = (CTDrawing) o;

                    CTInline[] ctInlines = drawing.getInlineArray();

                    for (CTInline ctInline : ctInlines) {

                        CTGraphicalObject graphic = ctInline.getGraphic();

                        //

                        XmlCursor cursor = graphic.getGraphicData().newCursor();

                        cursor.selectPath("./*");

                        while (cursor.toNextSelection()) {

                            XmlObject xmlObject = cursor.getObject();
                // 如果子元素是<pic:pic>这样的形式

                            if (xmlObject instanceof CTPicture) {

                                org.openxmlformats.schemas.drawingml.x2006.picture.CTPicture picture = (org.openxmlformats.schemas.drawingml.x2006.picture.CTPicture) xmlObject;

                                //拿到元素的属性

                                imageBundleList.add(picture.getBlipFill().getBlip().getEmbed());

                            }

                        }

                    }

                }

                //使用CTObject保存图片
          //<w:object>形式

                if (o instanceof CTObject) {

                    CTObject object = (CTObject) o;

                    System.out.println(object);

                    XmlCursor w = object.newCursor();

                    w.selectPath("./*");

                    while (w.toNextSelection()) {

                        XmlObject xmlObject = w.getObject();

                        if (xmlObject instanceof CTShape) {

                            CTShape shape = (CTShape) xmlObject;

                            imageBundleList.add(shape.getImagedataArray()[0].getId2());

                        }

                    }

                }

            }

        }

        return imageBundleList;

    }

}

 

首先要提出来是XWPF对xml元素的封装:

<w:document> 对应XWPFDocument类

<w:run>对应XWPFRun类

基本上只对应到Run这一层,因为run的子元素有很多,所以没有再往下面的层次封装和定义了,

所以我们使用API只能拿到所有的XWPFRun对象转成它的xml的定义:CTR对象。最后利用CTR去读取和解析的Run元素中的内容,获取图片的索引。

其次要谈的则是整个XML元素的定义:

我们可以看到POI使用的是Apache下的xmlbeans这个技术解析的XML,相关的技术不做深谈,关键要明白两点:

1:xml文档中的所有元素经过xmlbean是封装后都继承了一个XMLObject的接口,所以可以用这个类来接收获取到的子元素;

2:元素遍历是通过XmlCursor来做的,具体获取子元素是根据XmlCursor对象的selectPath属性来控制,当selectPath为"./*"时就定义为遍历子元素;

所以写成了如下的代码:能遍历当前元素的子元素,并且检验子元素的类型:

 
 CTR ctr = run.getCTR();

            //对子元素进行遍历

            XmlCursor c = ctr.newCursor();

            //这个就是拿到所有的子元素:

            c.selectPath("./*");

            while (c.toNextSelection()) {

                XmlObject o = c.getObject();

                //如果子元素是<w:drawing>这样的形式,使用CTDrawing保存图片

                if (o instanceof CTDrawing) {

                    CTDrawing drawing = (CTDrawing) o;
 

最后你可能会有疑问,不是说<w:drawing>这个元素定义了一张图片吗?

那么

if (o instanceof CTObject) {

CTObject object = (CTObject) o;
...
}

这个第二个判断条件是用来干嘛的?

聪明的你应该已经猜到了

没错!docx文档中的xml定义图片的方式除了<w:drawing>这一种之外,还可以运用<w:object>元素去定义,

为什么只有这两种?

因为我只使用第一种方式解析,发现有些图片丢失了,于是发现了第二种方式.......也许不止两种?我也不知道,反正对于目前的我来说已经没有问题了.

或许聪明的你在实践中还遇到了更多种情况?

那么运用上面提到的xml解析方式,相信你也能正确读取,得到自己想要的索引值.

再拓宽一点,如果POI还有其他没有提供的API,我们是不是也能通过XML解析的技术自己实现呢?这个就需要我们在实践中去探索了,相信时间会给我们答案

好了,现在我们拿到了索引值,那么如何去拿到图片资源呢?

POI提供了现成的方法:

XWPFDocument类中有getPictureDataByID(String picture);方法可以拿到XWPFPictrueDate对象,这个就是图片的资源了.

具体的操作可以参阅相关的博文和API,这里就不详细介绍了.

三、测试:

使用Junit4测试的代码:

 

package com.szdfhx.reportStatistic.util;

import org.apache.commons.collections.CollectionUtils;

import org.apache.commons.lang.StringUtils;

import org.apache.poi.xwpf.usermodel.XWPFDocument;

import org.apache.poi.xwpf.usermodel.XWPFParagraph;

import org.apache.poi.xwpf.usermodel.XWPFPictureData;

import org.junit.Test;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStream;

import java.util.Collections;

import java.util.List;

import static org.junit.Assert.*;

public class XWPFUtilsTest {

    @Test

    public void readImageInParagraph() throws IOException {

        InputStream in = new FileInputStream("D:\Document\我的博客\Java解析word,获取文档中图片位置\示例.docx");

        XWPFDocument xwpfDocument = new XWPFDocument(in);

        List<XWPFParagraph> paragraphList = xwpfDocument.getParagraphs();

        System.out.println("图片的索引	|图片名称	|图片上一段文字的内容	");

        System.out.pringln("------------------------------------------");

        for(int i = 0;i < paragraphList.size();i++){

            List<String> imageBundleList = XWPFUtils.readImageInParagraph(paragraphList.get(i));

            if(CollectionUtils.isNotEmpty(imageBundleList)){

                for(String pictureId:imageBundleList){

                    XWPFPictureData pictureData = xwpfDocument.getPictureDataByID(pictureId);

                    String imageName = pictureData.getFileName();

                    String lastParagraphText = paragraphList.get(i-1).getParagraphText();

                    System.out.println(pictureId +"	|" + imageName + "	|" + lastParagraphText);

                }

            }

        }

    }

}

 

展示结果:

这里使用图片名称指代表明我拿到了对应的资源,实际上 如果你对前文的内容还熟悉的话,会发现图片的名称实际上就是word/media文件夹下的所有图片的全名称。

在对应的XWPFPictureData对象中,图像的二进制数据可以通过getData()属性来拿到,这样你就可以保存到数据库或者是你本地的文件夹中了!

四、其他:

谈到这里,开头提到的第二个问题这里就已经解决了。

那么,第一个问题怎么办呢?

如果你的系统对速度要求不高的话,那么我给你的建议是,把doc文档转化成docx文档来解析--POI就有成熟的API来做

如果要考虑性能的话,那就只好写两套方法去解析文档。

那么......doc类型的word文档怎么获取图片的相对位置呢?

我也不知道········或者,你来告诉我?


参考:

POI官网:https://poi.apache.org/

Apache POI Word - 快速指南 :https://www.w3cschool.cn/apache_poi_word/apache_poi_word_quick_guide.html

 


转载:https://www.cnblogs.com/ct-csu/p/8178932.html

推荐内容:
java面试
Java高级工程师面试题总结及参考答案
Java面试题总结-Day1
Java面试题总结-Day3
【原创】JAVA面试解析(有赞一面)
Java线程池详解
Java面试集合(三)
Java 学习路线之四个阶段
Java 初/中级面试题及答案【详细】
Java面试题—初级(7)

 

金山办公2020校招大数据与机器学习笔试题深度解析 从数据结构到机器学习理论,再到大数据工程实践,校招笔试往往考察的是候选人对基础概念的深度理解和工程落地能力。KMP算法、逻辑回归推导、决策树与集成学习、聚类分析等高频考点,不仅是笔试的必拿分项,更是日常业务中处理用户行为分析与内容推荐的基石。而在大数据生态中,Spark与MapReduce的原理对比、数据倾斜的应对策略,以及基于大语言模型的非结构化数据理解,正成为算法岗位新的能力要求。无论你是准备算法岗笔试,还是希望了解大数据技术在实际业务中的选型思路,都可以从这些经典问题出发,构建系统化的复习路径,避开常 阅读详情

相关推荐

数字IC笔记-逻辑单元库和库文件

逻辑单元库的建立: 一个完整的单元库是由不同的功能电路所组成,在芯片应用中可分为三类: 标准单元:反相器、与门、寄存器、选择器、全加器。组合逻辑电路和时序逻辑电路。互补,反向,非反向,其他。锁存器、寄存器。 模块宏单元:ROM、RAM 输入输出单元 库文件: 在逻辑综合产生门级网表和物理设计做布局布线的过程中需要两个重要的库文件,就是物理库(lef)和时序库(lib) 1.物理库LEF文件 LEF是版图级的抽象文件,主要用于布局和布线。目前普遍使用的是由Candence开发的LEF文件格式,以le

sinat_41774721的博客 9141

Java解析word,获取文档中图片位置

前言(背景介绍): Apache POI是Apache基金会下一个开源的项目,用来处理office系列的文档,能够创建和解析word、excel、ppt格式的文档。 其中对word文档的处理有两个技术,分别是HWPF(.doc)和XWPF(.docx)。如果你对这两个技术熟悉的话,就应该能明白使用java解析word文档的痛楚所在。 其中两个最大的问题在于: 第一是这两个类并没有统一的父类和...

weixin_30764883的博客 1464

低代码Agent开发框架使用指南(二)—Coze平台核心功能概览

本篇分享系统介绍了字节跳动推出的低代码智能体开发平台Coze。Coze以免费易用、多模型支持和便捷的跨平台发布为核心优势,显著降低了智能体开发门槛。文章详细解析了平台的六大核心功能:扩展能力边界的插件系统、增强认知的知识库、结构化数据管理的数据库、可视化图像处理的图像流、实现复杂逻辑编排的工作流,以及处理复杂任务的多智能体协作机制,全面展现了Coze平台的强大能力。

weixin_42782643的博客 1358

Java poi之word文本图片内容提取

基于Apache POI实现Word文档中文本内容及图片提取存储

稻草人 7883

Vmware虚拟机一打开就蓝屏解决方法

Vmware虚拟机一打开就蓝屏解决方法 问题: 一打开Vmware虚拟机就蓝屏,如下图所示: 解决方法1: 启用和关闭windows功能(对话框)——>虚拟机平台(选项打对勾,默认没勾选)——>确定后重启——>再进应该就好了。 解决方法2: ①.查看电脑中的Hyper-V服务是否关闭 1.打开控制面板-程序-程序和功能 2.双击启用或关闭Windows功能 3.把Hyper-V前面的勾去掉 如果后期发下没有反应,或者电脑本身Hyper-V的服务没有打开,可以先打开在关闭,试

m0_55901666的博客 26万+

ABAP - Function ALV 11 - 单元格下拉框

【代码】ABAP - Function ALV 11 - 单元格下拉框。

HeathlX的博客 1814

java提取word中的图片

一、项目中需要用到word的导入,word 里面的内容由图片,文本,公式等,步骤为:将文档另存为xml格式 1、提取图片

絮落锦乡的博客 2608

树莓派使用 OLED 屏显示图片及文字

树莓派默认是不带显示屏的,如果想要查看系统的一些信息,需要使用电脑登录到树莓派,或者通过 HDMI 连接外接显示器查看。这样做总是有点麻烦,我们可以通过外接一个 OLED 屏来显示一些关键参数或者图片。本文将详细介绍操作方法。 OLED 模组介绍 OLED 屏主要有两种:128×32 和 128×64 ,主要颜色是白、黄、蓝。OLED 屏的特点是功耗低,价格便宜,使用 I2C 接口与主机连接。本文所使用的是 128×64 尺寸的屏幕,外形如下: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直

码到成功 3743

java获取word中的图片位置信息

@RequestMapping("/importWord") public void importWord(MultipartFile file, HttpServletResponse response, HttpServletRequest request,int appFlag) throws Exception { Stuteaall sysuser = getsession(request); // 1.将导入的文件上传到本地 ResourceBundle resource = Re

qq_39807853的博客 966

YOLOv11改进 | Conv篇 | 2024最新轻量化自适应提取模块LAE助力边缘设备部署计算(附代码 + 修改教程 + 运行教程)

本文给大家带来的一个改进机制是最新由LSM-YOLO提出的轻量化自适应特征提取(Lightweight Adaptive Extraction, LAE)模块,其是LSM-YOLO模型中的关键模块,旨在进行多尺度特征提取,同时降低计算成本。LAE通过以下方式实现更有效的特征提取:多尺度特征提取、自适应特征提取。LAE模块可以在不增加额外参数的情况下提高了模型对ROI区域的检测性能。​欢迎大家订阅我的专栏一起学习YOLO!YOLOv11改进系列专栏——本专栏持续复习各种顶会内容——科研必备目录一、本文介绍。

Snu77的博客 4055

五、MT8168 音频驱动之SPEAKER

本章主要讲解MT8168平台的内部SPEAKER驱动配置。分为HP接法和LINE OUT接法。2.1.3 audio_custom_exp.h设置。2.1.4 mixer_paths.xml设置。2.2.3 mixer_paths.xml设置。2.1.2 ProjectConfig 设置。2.2.2 ProjectConfig 设置。2.2.1 deconfig设置。2.1.1 DTS设置。......

Joon2020的博客 1664

java读取表格获取其段落内的图片保存在本地

【代码】java读取表格获取其段落内的图片保存在本地。

weixin_42759398的博客 527

W5500以太网&PoE扩展模块原理图设计,已量产

本文将以 W5500 以太网 & PoE 扩展板为对象,从嵌入式硬件设计的视角,深度拆解其电路架构、核心器件选型、关键功能实现,以及这款板子解决行业痛点的设计思路。

不脱发的程序猿 940

【AI Agent】2026年9月 AI Agent 全栈开发最新技术面试宝典(含高频+必背+大厂真题)

本文整理了2026年AI Agent全栈开发最新技术面试题,涵盖基础概念、核心框架和系统设计等关键领域。重点解析了AI Agent与普通Chatbot的本质区别(自主闭环执行能力)、Agentic Loop的完整工作流程(规划-执行-观察-评估循环),以及ReAct范式的原理与适用场景。特别强调面试回答技巧:需结合工程实践中的典型问题、处理方案和量化指标,而非简单背诵定义。内容来自字节、阿里等大厂真实面经,适合3-5年经验开发者准备春招面试,突出考察候选人在复杂场景下的技术决策能力。

小江的记录本 4618

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

AIGC 应用工程师(5-10年)面试题与答案全解析(2026 前沿版)

AIGC 应用工程师面试题与答案全解析(2026 前沿版) 摘要 本文系统整理了 2026 年 AIGC 应用工程师岗位的核心面试内容,包含 19 大模块、68 道关键题目及 15+ 代码示例。内容覆盖: 岗位定位:强调工程落地能力(RAG、Agent、系统集成)与业务闭环思维 技术体系:从基础理论(Transformer、涌现能力)到前沿应用(MCP协议、多模态生成) 工程实践:包含推理优化、成本控制、安全合规等关键落地能力 评估体系:详细讲解 golden set 构建、LLM-as-judge 等评估

weixin_48053866的博客 816

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

3000+技术简历模板与ATS优化指南:提升面试通过率

简历模板作为求职过程中的关键技术工具,其核心原理在于通过结构化布局优化信息传递效率。在技术招聘场景下,专业的简历模板能够有效适配ATS(申请人跟踪系统)的解析算法,避免因格式兼容性问题导致简历被自动过滤。对于开发者而言,采用Markdown版本控制的简历模板不仅能体现技术专业性,还能实现内容与格式的分离管理。通过量化技术成果和突出技术栈优先级,工程师可以在有限的简历篇幅内最大化展示技术价值。本文提供的3000+套经过招聘场景验证的模板资源,特别针对后端开发、前端架构等不同技术方向进行了ATS兼容性优化,帮助

weixin_34082854的博客 426

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

AI简历工具实战指南:人机协同提升求职效率

简历优化已从文字润色升级为求职系统工程,核心在于理解ATS筛选原理、HR阅读行为与岗位需求匹配逻辑。AI简历工具的本质不是替代写作,而是提供关键词分析、可读性诊断和格式兼容性验证等增强能力,其技术价值体现在缩短人岗匹配路径、提升简历通过率与面试转化率。典型应用场景包括应届生快速适配JD、转行者提炼可迁移能力、资深从业者补全ATS敏感细节。本文聚焦‘AI-Powered Tools’与‘Job Search’两大热词,拆解如何以人机协同模式构建可验证、可复刻的智能求职工作流。

congtaixiao7151的博客 407

2017年欢聚时代Android校招笔试题型深度复盘

Android开发进阶不仅要求掌握四大组件的使用,更需要对底层原理有系统认知。例如,Binder作为Android IPC的核心机制,通过mmap实现一次拷贝,保障跨进程通信的性能与安全;Handler消息机制则通过Looper与MessageQueue驱动主线程任务调度。性能优化中的内存泄漏、布局绘制等问题,直接影响应用用户体验。这些知识点在移动互联网时代成为Android工程师校招笔试的高频考点。本文基于欢聚时代2017年Android校招笔试A卷,复盘其题型结构与考察重点,涵盖Java基础、并发、四大

weixin_34248023的博客 442

OpenClaw新手必备:10个高效技能包快速搭建AI助手

在AI Agent(智能体)开发领域,框架与技能包是构建实用应用的核心。AI Agent通过集成大语言模型(LLM)作为“大脑”,并借助可插拔的技能包来执行具体任务,其原理类似于操作系统与应用程序的关系。这种架构的技术价值在于降低了开发门槛,实现了能力的模块化复用与灵活组合。在实际应用场景中,从文档处理、数据分析到自动化工作流,技能包能将自然语言指令转化为具体操作,极大提升开发与办公效率。本文聚焦于OpenClaw这一开源框架,重点介绍其生态中诸如ClawHub Skill(技能包管理)、Web Searc

weixin_34253126的博客 365

用文心一言高效写简历:职业语义重构与ATS友好生成指南

简历本质上是一种面向招聘方的专业广告文案,其核心是将真实工作经历转化为HR、技术面试官和ATS系统可快速识别的结构化信号。这涉及职业语言转译、技术能力-业务结果映射、关键词精准匹配等底层逻辑。大模型如文心一言并非替代人工,而是通过提示工程实现‘语义压缩与重构’——在严格事实约束下,将模糊描述(如‘参与开发’)升级为高信噪比表达(如‘主导订单状态机重构,错误率降至0.03%’)。其技术价值在于提升表达效率与ATS通过率,广泛应用于校招、跳槽、转岗等求职场景,并需结合原始素材锚定、角色设定、三不原则与结构化输出

a4512138的专栏 340

NLP求职匹配工作流:从岗位理解到简历精准适配

自然语言处理(NLP)正深刻改变求职效率的底层逻辑——它不再停留于关键词堆砌,而是通过语义理解、意图建模与文本对齐,实现人岗之间的精准匹配。其核心原理在于利用轻量级嵌入模型(如all-MiniLM-L6-v2)计算简历与JD的多维相似度,并结合领域适配的NER技术识别隐性要求,从而将模糊的‘我觉得合适’转化为可量化、可验证的匹配证据。该技术显著提升ATS初筛通过率与面试邀约率,广泛应用于应届生定位初级岗、职场人转行锚定目标领域、以及HR优化JD表述等真实场景。本文聚焦NLP在求职中的落地实践,涵盖模型选型、

310

58同城大数据岗秋招笔试复盘:从集群部署到数据质量

大数据岗位的笔试正从单一知识点的记忆考察,转向对集群部署策略、数据质量保障、实时计算链路等工程实践能力的综合评估。理解HDFS副本机制、Spark执行流程、Flink容错原理,以及如何通过监控和治理减少数据错误,是构建完整大数据架构能力的基础。这类技术不仅支撑着日志分析、实时风控、在线报表等业务场景,也决定了候选人能否在真实数据链路中做出合理选型与优化。本文以58集团大数据岗秋招笔试为线索,拆解各题型背后的技术要点,并给出从基础组件到开放设计题的备战思路,帮助求职者把握考核核心。

weixin_34184158的博客 374

java poi 读取 word图片_Java Poi 根据文字内容 插入 word 图片-Go语言中文社区

需求描述如下图,我需要在word里根据一个图片的名字,将名字替换成该图片(公章)思路:用POI遍历每一个表格里的每一行的每一个单元格,如果遇到我自己定义的"&章",则获取后面的图片的名字,然后利用POI的XWPFRun.addPicture(url,像素…)方法将图片添加到word里,然后将原有的文字清除掉。注意:图片要放在表格的单元格里,最后单元格里的文本会被清除掉,只留下图片简单生成图...

weixin_29620579的博客 918

java获取word文档中指定位置图片

//获取图片 private List&lt;XWPFPicture&gt; getPictureDatas(XWPFParagraph xwpfParagraph) { List&lt;XWPFPicture&gt; pictureDatas = Lists.newArrayListWithCapacity(1); for (XWPFRun run...

ling913的专栏 3060

XWPF POI word文档操作

XWPFWord文档基础知识的简介word文档包括 页眉、页脚、脚注、批注、链接、正文部分,在XWPF中都有与之对应的类: .docx文件的文档的根 XWPFDocument 页眉 XWPFHeader 页脚 XWPFFooter 脚注 XWPFFootnote 批注 XWPFComment 链接

qq_23555141的博客 1万+

java读写word表格、图片

【代码】java读写word表格、图片。

qq_38759137的博客 3770
上一篇: 从Java小白到收获BAT等offer,分享我这两年的经验和感悟,BAT 面试官 如何面试
下一篇: Java的深拷贝和浅拷贝,互联网 面试官 如何面试
ccc_ccc8
博客等级 码龄8年 8粉丝 50原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值