利用POI操作不同版本号word文档中的图片以及创建word文档

时间:2023-01-09 14:20:14

我们都知道要想利用java对office操作最经常使用的技术就应该是POI了,在这里本人就不多说到底POI是什么和怎么用了。

先说本人遇到的问题,不同于利用POI去向word文档以及excel文档去写入数据和向外导出数据而且保存到数据库中这些类似的操作,因为业务上的须要须要利用POI去读取word中的图片,而且去把图片去保存为一个file文件。查了Apache公司提供的api帮助文档,再网友的一些线索,本人也总结了几中对不同word版本号(.doc或者是.docx结尾)对于文件里所含图片的操作方式。希望能对大家有所帮助。

闲话不多说,请看代码:

首先先是对于是.docx文件结尾的word文档中图片的操作:
package poi;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List; import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFPictureData; public class GetPics {
public static void main(String[] args) {
String path ="F:\\xx.docx";
File file = new File(path);
try {
FileInputStream fis = new FileInputStream(file);
XWPFDocument document = new XWPFDocument(fis);
XWPFWordExtractor xwpfWordExtractor = new XWPFWordExtractor(document);
String text = xwpfWordExtractor.getText();
System.out.println(text);
List<XWPFPictureData> picList = document.getAllPictures();
for (XWPFPictureData pic : picList) {
System.out.println(pic.getPictureType() + file.separator + pic.suggestFileExtension()
+file.separator+pic.getFileName());
byte[] bytev = pic.getData();
FileOutputStream fos = new FileOutputStream("d:\\"+pic.getFileName());
fos.write(bytev);
}
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

指定word文件里的图片:

利用POI操作不同版本号word文档中的图片以及创建word文档

控制台输出的信息:

利用POI操作不同版本号word文档中的图片以及创建word文档

指定磁盘位置生成的图片文件:

利用POI操作不同版本号word文档中的图片以及创建word文档

然后就是对于是.doc结尾的word文档中图片的操作:

不同于高版本号的操作类,这里用的就是专门对于03版本号的word操作类:

package com.zjcx.read;

import java.io.*;
import java.util.*; import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.model.PicturesTable;
import org.apache.poi.hwpf.usermodel.CharacterRun;
import org.apache.poi.hwpf.usermodel.Picture;
import org.apache.poi.hwpf.usermodel.Range; public class ReadImg { public static void main(String[] args) throws Exception {
new ReadImg().readPicture("F://test//test.doc");
} private void readPicture(String path)throws Exception{
FileInputStream in=new FileInputStream(new File(path));
HWPFDocument doc=new HWPFDocument(in);
int length=doc.characterLength();
PicturesTable pTable=doc.getPicturesTable();
// int TitleLength=doc.getSummaryInformation().getTitle().length(); // System.out.println(TitleLength);
// System.out.println(length);
for (int i=0;i<length;i++){
Range range=new Range(i, i+1,doc); CharacterRun cr=range.getCharacterRun(0);
if(pTable.hasPicture(cr)){
Picture pic=pTable.extractPicture(cr, false);
String afileName=pic.suggestFullFileName();
OutputStream out=new FileOutputStream(new File("F:\\test\\"+UUID.randomUUID()+afileName));
pic.writeImageContent(out); }
} } }

下面的生成结果同用高版本号读取word中图片而且生成新图片的那几张效果图。

说完了对于不同版本号的word文档中图片的操作,本人还遇到了创建word的业务。不同于我们利用流去生成一个txt文件,也不同与我们直接new一个File。然后在调用file的createNew这种方法。让我们来看看到底利用POI代码和其它的代码来创建或者说是新建(事实上仅仅是近期程度的模仿生成一个word。可是肯定跟我们手动新建有所差别,详细有什么差别本人还是没有參透,假设有大牛看了例如以下的代码知道的话,希望能指点迷津~)一个word,闲话不多说,请看代码:

首先是第一种,创建.doc结尾的word文件。(在这里本人不在贴生成文件的效果图,大家试试就可以)

package poi;

import java.io.ByteArrayInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.poifs.filesystem.DirectoryEntry;
import org.apache.poi.poifs.filesystem.POIFSFileSystem; public class GenWord03 {
public static void main(String[] args) throws IOException {
String path = "F:/";
String filename = "/123321.doc";
String content="";
byte[] b = content.getBytes("UTF-8");
ByteArrayInputStream bais = new ByteArrayInputStream(b);
POIFSFileSystem poifs = new POIFSFileSystem();
DirectoryEntry dirEntry = poifs.getRoot();
dirEntry.createDocument("WordDocument", bais);
FileOutputStream out = new FileOutputStream(path + filename);
poifs.writeFilesystem(out);
out.flush();
out.close();
bais.close();
}
}

再者就是创建.docx结尾的word文件。

package poi;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException; import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun; public class GenNewWord { public static void main(String[] args) throws IOException {
String content = "要展示的内容"; String path = "F:/";
String filename = "/xxx.doc";
XWPFDocument doc = new XWPFDocument();
XWPFParagraph para= doc.createParagraph();
XWPFRun run = para.createRun();
run.setText(content); File file = new File(path + filename);
FileOutputStream out = new FileOutputStream(file);
doc.write(out);
out.close(); } }

注:也许比較熟练POI操作的老手们来说,也许知道Apache公司提供的操作类中对于03版本号的word文档操作是有限的,很多其它仅仅是对于一个现有(已经存在)的文档操作,所以我们在各大网友的博客或者帖子中都会发现对于旧版本号的word文档操作的代码開始处就是读取一个现有word的操作。而对于07版本号(也就是.docx结尾的word文档)来说,则更加完好,开发人员真正意义上能够全然利用POI去操作一个word文件的所有生命周期(也就是从无到有的过程)。这仅仅是本人简略总结,有不足之处希望看到这篇博客的网友多多吐槽,多多交流。

利用POI操作不同版本号word文档中的图片以及创建word文档的更多相关文章

  1. net9:图片变成二进制流存入XML文档,从XML文档中读出图片以及从XML文档中读取并创建图片文件

    原文发布时间为:2008-08-10 -- 来源于本人的百度文章 [由搬家工具导入] fileToXml类: using System;using System.Data;using System.C ...

  2. C&num; 提取Word文档中的图片

    C# 提取Word文档中的图片 图片和文字是word文档中两种最常见的对象,在微软word中,如果我们想要提取出一个文档内的图片,只需要右击图片选择另存为然后命名保存就可以了,今天这篇文章主要是实现使 ...

  3. FORM实现中打开图片,链接,文档(参考自itpub上一篇帖子,整理而来)

    FORM实现中打开图片,链接,文档 参考自itpub上一篇帖子,整理而来 1.添加PL程序库D2kwutil.pll 2.主要实现程序 /*过程参数说明: v_application --打开文件的应 ...

  4. 在LaTeX文档中插入图片的几种常用的方法

    LaTeX中一般只直接支持插入eps(Encapsulated PostScript)格式的图形文件, 因此在图片插入latex文档之前应先设法得到图片的eps格式的文件. 在LaTeX文档中插入图片 ...

  5. Java 写一段字符到指定的文本文档中,如果该文本文档不存在,则创建该文本文档

    写一段字符到指定的文本文档中,如果该文本文档不存在,则创建该文本文档 import java.io.File; import java.io.FileNotFoundException; import ...

  6. 利用poi操作word文档

    关键字:POI JAVA 批注 总页数 总字符数 一:认识POI Apache POI是一个开源的利用Java读写Excel.WORD等微软OLE2组件文档的项目.最新的3.5版本有很多改进,加入了对 ...

  7. php解析word&comma;获得文档中的图片

    背景 前段时间在写一个功能:用原生php将获得word中的内容并导入到网站系统中.因为文档中存在公式,图片,表格等,因此写的比较麻烦. 思路 大体思路是先将word中格式为doc的文档转化为docx, ...

  8. Java 利用POI操作PPT

    解析PPT文件中的图片 import java.io.File; import java.io.FileOutputStream; import org.apache.poi.hslf.HSLFSli ...

  9. Aspose&period;Words提取word文档中的图片文件

    /// <summary> /// 提取word中的图片 /// </summary> /// <param name="filePath">w ...

随机推荐

  1. thinkphp &lowbar;&lowbar;PUBLIC&lowbar;&lowbar;的定义 &lowbar;&lowbar;ROOT&lowbar;&lowbar;等常量的定义

    2 3 4 5 6 7 8 9 '__TMPL__'      =>  APP_TMPL_PATH,  // 项目模板目录 '__ROOT__'      =>  __ROOT__,    ...

  2. C&num; Split用法

    1.用字符串分隔: using System.Text.RegularExpressions;string str="aaajsbbbjsccc";string[] sArray= ...

  3. 代码记录——phase16&comma;block36

    36*36 -2,-2扩展 代码有问题,有时能运行有时报错. HRESULT RotateZoom(PBYTE pbSrc,int iWidth,int iHeight,double dbRotate ...

  4. 禁用xampp的ssl功能

    按照Disable SSL on XAMPP for Windows文章里讲解的步骤如下: 1 以管理员身份启动XAMPP控制面板,点击Config按钮打开httpd.conf 分别注释171,539 ...

  5. c&num;&lowbar;导出table功能

    一:第一张导出方法,简单快捷 请注意:一般表格都有真分页,查询数据时候注意把分页条件去掉#region 此处是获取的list数组 然后转table再调用ExportExcel var list=&qu ...

  6. 手机网络抓包 转载记录http&colon;&sol;&sol;blog&period;csdn&period;net&sol;skylin19840101&sol;article&sol;details&sol;43485911

    Fiddler不但能截获各种浏览器发出的HTTP请求, 也可以截获各种智能手机发出的HTTP/HTTPS请求.Fiddler能捕获IOS设备发出的请求,比如IPhone, IPad, MacBook. ...

  7. CCFlow SDK模式开发(有比较详细的代码,以服务的形式与ccflow数据库进行数据交互)

    http://www.cnblogs.com/s0611163/p/3963142.html 需求: 1.业务数据要保存在我们自己的数据库里     2.CCFlow有保存草稿的功能,但是领导要求每个 ...

  8. ImageUploader卸载教程-Xproer&period;ImageUploader

    1.1. 手动卸载控件-Windows XP 主要步骤如下: 1.关闭所有IE 2.打开cmd 3.进入C:\Windows\System32 4.输入命令regsvr32 -u ImageUploa ...

  9. Lua中&OpenCurlyDoubleQuote;&period;”调用方法与&OpenCurlyDoubleQuote;:”调用方法的区别

    Lua中“.”调用方法与“:”调用方法的区别:                                                                             ...

  10. POJ - 2079:Triangle (旋转卡壳,求最大三角形)

    Given n distinct points on a plane, your task is to find the triangle that have the maximum area, wh ...