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

我们都知道要想利用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文件中的图片:

控制台输出的信息:

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

然后就是对于是.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文件的全部生命周期(也就是从无到有的过程)。这只是本人简略总结,有不足之处希望看到这篇博客的网友多多吐槽,多多交流。

时间: 2024-10-24 10:15:06

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

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

我们都知道要想利用java对office操作最经常使用的技术就应该是POI了,在这里本人就不多说到底POI是什么和怎么用了. 先说本人遇到的问题,不同于利用POI去向word文档以及excel文档去写入数据和向外导出数据而且保存到数据库中这些类似的操作,因为业务上的须要须要利用POI去读取word中的图片,而且去把图片去保存为一个file文件.查了Apache公司提供的api帮助文档,再网友的一些线索,本人也总结了几中对不同word版本号(.doc或者是.docx结尾)对于文件里所含图片的操作方

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

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

【web开发】☆★之利用POI操作Excel表格系列教程【8】设置单元格对其方式

[web开发]☆★之利用POI操作Excel表格系列教程[8]设置单元格对其方式 package csg.xiaoye.poidemo; import java.io.FileOutputStream; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFRichTextString; import org.apache.poi.hssf.usermodel.HS

【web开发】☆★之利用POI操作Excel表格系列教程【9】单元格边框处理

[web开发]☆★之利用POI操作Excel表格系列教程[9]单元格边框处理 package csg.xiaoye.poidemo; import java.io.FileOutputStream; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.a

【web开发】☆★之利用POI操作Excel表格系列教程【10】单元格填充色和颜色操作

[web开发]☆★之利用POI操作Excel表格系列教程[10]单元格填充色和颜色操作 package csg.xiaoye.poidemo; import java.io.FileOutputStream; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import

【web开发】☆★之利用POI操作Excel表格系列教程【11】单元格合并

[web开发]☆★之利用POI操作Excel表格系列教程[11]单元格合并 package csg.xiaoye.poidemo; import java.io.FileOutputStream; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.p

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

LaTeX中一般只直接支持插入eps(Encapsulated PostScript)格式的图形文件, 因此在图片插入latex文档之前应先设法得到图片的eps格式的文件. 在LaTeX文档中插入图片都是通过使用一些latex图形处理宏命令来实现的, 有很多宏命令都支持在在LaTeX文档中插入eps格式的图形文件, 主要有:1. 用includegraphics宏命令(graphicx包): 首先需在latex文档的文件说明部分加上: usepackage{graphicx} 然后在需要插入图片

[PDF文件怎么编辑]如何在PDF文档中插入图片

收到一份PDF格式文档需要进行编辑,文件中只有文本内容,需要在页面中为对应的配图,也就是在PDF中添加图片,作为一个只懂得用阅读器来查看文档人来说,编辑PDF文件可谓是一件难事,这种格式的文件是如何编辑的呢? 首先对PDF文档内容的修改需要用到对应的PDF编辑器,所以先进行下载安装. 打开PDF编辑器,选择"文件-打开"命令,打开需要编辑的PDF文档. 文档打开后切换到需要添加图片的页面,选择"文档-添加图像"命令,会弹出打开文件对话框. 在对话框中选择需要添加的图

Python中办公软件(创建word)

当前目录下创建word文件import win32comimport win32com.clientimport os def makeWordFile(fileName,name): word=win32com.client.Dispatch("Word.Application")#获取word程序 #让文档可见 word.Visible=True #创建文档 doc=word.Documents.Add() #写内容 r=doc.Range(0,0) r.InsertAfter(&