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的原理对比、数据倾斜的应对策略,以及基于大语言模型的非结构化数据理解,正成为算法岗位新的能力要求。无论你是准备算法岗笔试,还是希望了解大数据技术在实际业务中的选型思路,都可以从这些经典问题出发,构建系统化的复习路径,避开常 阅读详情

相关推荐

第二章 零差云控关节模组内部构造

对零差云控的eRob70I进行了拆解

SFY__优快云的博客 5965

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

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

weixin_30764883的博客 1464

命名管道和匿名管道

我们知道进程间是可以通信的。可以达到数据传输、资源共享、事件通知、进程控制等目的。进程间通信主要包括管道、系统IPC,套接字等。 管道分为三种: 普通管道:一是单工,只能单向传输 ,二是仅能在父子进程或者兄弟进程中使用。 流管道:去除了第一种限制,为半双工,可以双向传递, 命名管道:去除了第二种限制 ,可以在很多并不相关的进程 中进行通信。 1、普通管道 int pipe(int f...

ffsiwei的博客 1万+

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

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

稻草人 7883

Shell数学计算(算术运算,加减乘除运算)

声明: 本篇博客的学习途径主要为以下网站和课堂讲解,发博客目的仅为学习使用,在该博客的基础上做了一定程序的简略和修改。 参考博客 : 原文链接:http://c.biancheng.net/shell/ Shell数学计算Shell数学计算数学计算命令对整数进行数学运算: (()) / let / $[] /exprShell (())Shell let命令bc命令:一款数学计算器在 Shell 中使用 bc 计算器 Shell数学计算 默认情况下,Shell 不会直接进行算术运算,而是把+两边的数据(数

AKUANer的博客 2万+

PADS Layout差分对布线实战:从规则设置到高速信号优化

本文详细讲解了在PADS Layout中进行差分对布线的完整实战流程。从在Layout中定义差分对网络,到进入Router配置线宽、间距等关键规则,再到布线实战技巧与高速信号完整性优化,系统阐述了如何确保差分信号(如USB、HDMI)的稳定传输,是高速PCB设计的核心技能。

weixin_29274969的博客 522

java提取word中的图片

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

絮落锦乡的博客 2608

图像拼接(Image Stitching)

图像拼接(Image Stitching):是一项计算机视觉技术,它将多张重叠的图像合并为一张更大、无缝的全景图或广角视图。该技术广泛应用于全景摄影、地图制作、医学影像处理、计算机视觉及增强现实(AR)等领域。

📷 图像处理践行者 | 传统算法 · 深度学习 · 多模态 | 分享实战经验与技术洞见,探索从像素到智能的无限可能。 2505

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

Istio ICA考试之路---2-2

找到dr部分,这部分可以在mirroring里找也可以和题2-1一样在Traffic Management的dr里复制,内容都一样。此题之后都是在cluster-2上操作,所以就不需要再切换了.之后的几题2.1节就忽略掉了。可以看到,80%的流量被镜像到了dev上,实际考试这步可以忽略。看到ex-ip是192.168.126.220。获取gw,把gateways加入到vs配置中。获取istio-ingress的ex-ip。就获得了这样一个模板文件。查看2个pod的日志。

Q先生 854

29、固态变压器拓扑、设计及其应用深度解析

本文深入解析了固态变压器(SST)的拓扑结构、设计方法及其在智能电网和能源互联网中的应用。重点探讨了机器学习在SST优化设计中的应用,包括中高频变压器设计、整体系统优化与建模研究。文章详细介绍了多端口SST的拓扑特点、功率传输机制及其作为能源路由器的关键作用,分析了不同端口数量下的控制复杂度与应用场景,并通过案例研究展示了四端口SST在分布式能源系统中的实际应用。最后,文章总结了多端口SST面临的技术挑战,并展望了未来在先进控制策略、集成化设计和标准化方面的发展方向。

study的专栏 3793

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

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

weixin_42759398的博客 527

【Unity优化篇】| Unity3D场景 常用优化策略,遮挡剔除、层消隐距离技术 和 LOD多层次细节

本篇文章来简单介绍一下 Unity中几种常用3D场景优化策略 方法 对于整个项目来说,本文中出现的方法也只是冰山一角,慢慢积累学习吧! 内容包括遮挡剔除(Occlusion Culling)、层消隐距离技术 和 LOD多层次细节

努力前行,总会成为自己心中的那道光 1万+

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

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

小江的记录本 4618

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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

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

weixin_48053866的博客 816

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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

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

weixin_34082854的博客 426

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

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、付费专栏及课程。

余额充值