`
01jiangwei01
  • 浏览: 533165 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

docx4j word 工具类及测试类

 
阅读更多
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

import org.docx4j.Docx4J;
import org.docx4j.convert.out.FOSettings;
import org.docx4j.fonts.IdentityPlusMapper;
import org.docx4j.fonts.Mapper;
import org.docx4j.fonts.PhysicalFont;
import org.docx4j.fonts.PhysicalFonts;
import org.docx4j.openpackaging.exceptions.Docx4JException;
import org.docx4j.openpackaging.exceptions.InvalidFormatException;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.wml.P;
import org.docx4j.wml.R;
import org.docx4j.wml.STBrType;


public class WordUtil {
	
	/**
	 * 
	 * @param xwpfDocument  poi包里的类
	 * @return
	 * @throws IOException
	 * @throws Docx4JException
	 */
//	public static WordprocessingMLPackage loadMLPackage(
//			XWPFDocument xwpfDocument) throws IOException,
//            Docx4JException {
//        InputStream is = null;
//        try (ByteArrayOutputStream out = new ByteArrayOutputStream();) {
//        	xwpfDocument.write(out);
//            is = new ByteArrayInputStream(out.toByteArray());
//            return WordprocessingMLPackage.load(is);
//        } finally {
//            IOUtils.closeQuietly(is);
//        }
//    }
	
	/**
	 * 将word输出到某个pdf文件savePdfPath中
	 * @param wordMLPackage
	 * @param savePdfPath
	 * @throws Exception
	 */
	public static void convertWordToPdf(WordprocessingMLPackage wordMLPackage,String savePdfPath) throws Exception{
		OutputStream os = new java.io.FileOutputStream(savePdfPath);
		convertWordToPdf(wordMLPackage,os);
	}
	/**
	 * 将word文件保存输出到输出流
	 * @param wordMLPackage
	 * @param os
	 * @throws Exception
	 */
	public static void convertWordToPdf(WordprocessingMLPackage wordMLPackage,OutputStream os ) throws Exception  {
		
		// Font regex (optional)
		// Set regex if you want to restrict to some defined subset of fonts
		// Here we have to do this before calling createContent,
		// since that discovers fonts
		String regex = null;
		// Windows:
		// String
		// regex=".*(calibri|camb|cour|arial|symb|times|Times|zapf).*";
		regex=".*(simsun|calibri|camb|cour|courier new|arial|times|comic|georgia|impact|LSANS|pala|tahoma|trebuc|verdana|symbol|webdings|wingdings|palatino).*";
		// Mac
		// String
		// regex=".*(Courier New|Arial|Times New Roman|Comic Sans|Georgia|Impact|Lucida Console|Lucida Sans Unicode|Palatino Linotype|Tahoma|Trebuchet|Verdana|Symbol|Webdings|Wingdings|MS Sans Serif|MS Serif).*";
		//PhysicalFonts.setRegex(regex);
		PhysicalFonts.setRegex(regex);
		// Set up font mapper (optional)
		Mapper fontMapper = new IdentityPlusMapper();
		// .. example of mapping font Times New Roman which doesn't have certain Arabic glyphs
		// eg Glyph "ي" (0x64a, afii57450) not available in font "TimesNewRomanPS-ItalicMT".
		// eg Glyph "ج" (0x62c, afii57420) not available in font "TimesNewRomanPS-ItalicMT".
		// to a font which does
		PhysicalFont font  = PhysicalFonts.get("arial unicode ms"); 
			// make sure this is in your regex (if any)!!!
		if (font!=null) {
			fontMapper.put(Mapper.FONT_FALLBACK, font);
		}
		
		//fontMapper.getFontMappings().put("Libian SC Regular", PhysicalFonts.getPhysicalFonts().get("SimSun"));
		wordMLPackage.setFontMapper(fontMapper);
		// FO exporter setup (required)
		// .. the FOSettings object
    	FOSettings foSettings = Docx4J.createFOSettings();
		foSettings.setWmlPackage(wordMLPackage);
		
		// Specify whether PDF export uses XSLT or not to create the FO
		// (XSLT takes longer, but is more complete).
		
		// Don't care what type of exporter you use
		Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL);
		
		// Prefer the exporter, that uses a xsl transformation
		// Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL);
		
		// Prefer the exporter, that doesn't use a xsl transformation (= uses a visitor)
		// .. faster, but not yet at feature parity
		// Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_NONXSL);
	}
	
//	public InputStream transOutputStreamToInputStream(ByteArrayOutputStream out){
//		 InputStream is = null;
//		 is = new ByteArrayInputStream(out.toByteArray());
//		 return is;
//	ByteArrayOutputStream out = new ByteArrayOutputStream()
//	}
	
	/**
	 * 创建分页符
	 * @return
	 */
    public static P getPageBreak() {
        P p = new P();
        R r = new R();
        org.docx4j.wml.Br br = new org.docx4j.wml.Br();
        br.setType(STBrType.PAGE);
        r.getContent().add(br);
        p.getContent().add(r);
        return p;
    }
    
    /**
     * 合并成word文档
     * 
     * @param newMLPackage
     * @param srcMLPackage
     * @param b
     * @throws InvalidFormatException 
     */
    public static WordprocessingMLPackage  mergeWord2010Util(List<WordprocessingMLPackage> srcMLPackageList, boolean b) throws InvalidFormatException {
    		WordprocessingMLPackage newMLPackage =  WordprocessingMLPackage.createPackage();
	    	int l=srcMLPackageList.size();
    		for(int i=0;i<l;i++){
    			WordprocessingMLPackage item  = srcMLPackageList.get(i);
    			
    			List<Object> list =  item.getMainDocumentPart().getContent();
    	        for (Object obj : list) {
    	            newMLPackage.getMainDocumentPart().addObject(obj);
    	        }
    	        if (b) {// 判断是否需要换页符
    	           if( i != (l-1)){ 
    	        	   newMLPackage.getMainDocumentPart().addObject(WordUtil.getPageBreak());
    	           }
    	        }
	    	}
    		if ( l == 0) return null;
    		return newMLPackage;
        
    }
    
    /**
     * 将WordprocessingMLPackage导出到输出流
     * @param wordMLPackage
     * @param baos
     * @throws Docx4JException
     */
    public static void convertWordprocessingMLPackageToOutputStream(WordprocessingMLPackage wordMLPackage,ByteArrayOutputStream out) throws Docx4JException{
    	FOSettings foSettings = Docx4J.createFOSettings();
		foSettings.setWmlPackage(wordMLPackage);
		
		// want the fo document as the result.
		foSettings.setApacheFopMime(FOSettings.INTERNAL_FO_MIME);
		
//    	ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    	
		//Don't care what type of exporter you use
//		Docx4J.toFO(foSettings, os, Docx4J.FLAG_NONE);
		//Prefer the exporter, that uses a xsl transformation
		Docx4J.toFO(foSettings, out, Docx4J.FLAG_EXPORT_PREFER_XSL);
    }
    /**
     * 将wordMLPackage转成输出流
     * @param wordMLPackage
     * @return
     * @throws Docx4JException
     */
    public InputStream wordprocessingMLPackageToInputStream(WordprocessingMLPackage wordMLPackage) throws Docx4JException{
    	InputStream is = null;
    	ByteArrayOutputStream out = new ByteArrayOutputStream();
    	convertWordprocessingMLPackageToOutputStream(wordMLPackage, out);
    	is = new ByteArrayInputStream(out.toByteArray());
    	return is;
    }
	
	
}

 工具测试类

import java.util.ArrayList;
import java.util.List;

import myutils.WordUtil;

import org.docx4j.openpackaging.packages.WordprocessingMLPackage;

public class WordUtilTest {

	private static String[] docnames = {"\\myexamples\\file_1.docx","\\myexamples\\file_2.docx"};
	private static String  out_put_docnames =  "\\myexamples\\files.docx";
	private static String  out_put_pdf =  "\\myexamples\\files.pdf";
	public static void main(String[] args) throws Exception {
		
	 WordUtilTest.mergeWord2010UtilTest();

	}
	
	public static void mergeWord2010UtilTest() throws Exception{
		List<WordprocessingMLPackage> srcPkgList=new ArrayList<WordprocessingMLPackage>();
		
		for(int i = 0,l = docnames.length;i<l;i++){
			String docName = docnames[i];
			String docPath = System.getProperty("user.dir")+docName;
			
			WordprocessingMLPackage wmlSourcePkg = WordprocessingMLPackage.load(new java.io.File(docPath));
			srcPkgList.add(wmlSourcePkg);
		}
//		XWPFDocument document = new XWPFDocument();
//		ByteArrayOutputStream out = new ByteArrayOutputStream();
//		document.write(out );
//		InputStream is  = new ByteArrayInputStream(out.toByteArray());
		WordprocessingMLPackage newMLPackage =   WordUtil.mergeWord2010Util( srcPkgList, true);
		//保存成文件
		//newMLPackage.save(new File( System.getProperty("user.dir")+out_put_docnames));
//		ByteArrayOutputStream out = new ByteArrayOutputStream();
//		WordUtil.convertWordprocessingMLPackageToOutputStream(newMLPackage, out);
//		System.out.println(out.toByteArray().length);
		//转成PDF
		WordUtil.convertWordToPdf(newMLPackage, System.getProperty("user.dir")+out_put_pdf);
	}

}

 

分享到:
评论

相关推荐

    我们将常用的测试工具分为10类.docx

    我们将常用的测试工具分为10类.docx

    JDBC专题(四)-JDBC封装工具类.docx

    工具类测试 4.工具类优化 4.1.jdbc.properties文件里面的内容 4.2.最终版工具类 1.为什么要封装工具类 在实际JDBC的使用中,存在着大量的重复代码:例如连接数据库、关闭数据库等这些操作!! 急需把传统的...

    使用poi将word读取后替换指定内容后再次生成新word

    使用poi将word读取后替换指定内容后再次生成新word,本人经过测试,拿来即用!

    Java高效开发工具汇总.docx

    1、集成开发环境 2 2、测试 2 3、集成 3 4、应用服务器 3 5、Web应用测试 3 6、质量分析 4 7、版本控制 4 8、持续集成 4 9、Java 应用分析 5 10、代码覆盖工具 5 11、Bug跟踪 5 ...14、 java工具类 6

    Flex自动化功能测试工具大比拼.docx

    本 文介绍了 4 种支持 Flex 自动化功能测试的商用工具,经过粗略的使用和对比,可以发现:每个工具在支持 Flex 的对象识别所采用的技术上有所差别,但是总体而言可分为两类:一类是采用了 Flex 自动化接口,例如 RFT...

    ETest搭建半实物仿真测试环境.docx

    长期在装备系统仿真与嵌入式系统测试领域的研究与创新,凯云科技已发展为国内嵌入式系统测试类产品与软件测试服务的主要供应商,产品具有核心竞争力,得到各行业用户的广泛认可与支持。我们将一如既往坚持“以客户为...

    POI操作WORD 官方测试案例 DEMO.zip

    JAVA操作MS office 工具 POI操作WORD 官方测试案例 DEMO(含jar包,IDEA) 可直接运行测试。 ------------------------------------------------------ 1 什么是Apache POI 全称Apache POI,使用Java编写的免费...

    黑盒测试实验报告.docx

    使用C++语言,VC6.0工具作为开发环境(IDE) 1.3实验要求 根据给出的程序分别使用等价类划分法、边界值分析法、判定表方法、因果图法、正交试验法、功能图法、错误推测法来设计相应的测试用例。 输入数据进行测试,...

    软件测试复习总结.docx

    软件测试是软件开发过程中至关重要的环节,它有助于发现...等价类划分:将输入分为等价类,从每个类中选择测试数据。 边界值分析:选择靠近边界的测试数据,通常边界处容易出错。 决策表:列出条件和结果的组合,帮助设

    基于电商系统软件测试设计与应用.docx

    第四章 电商系统软件测试工具 14 4.1 电商系统软件测试工具的分类 14 4.2 电商系统软件测试工具的使用 16 第五章 电商系统软件测试管理 18 5.1 电商系统软件测试管理的基本流程 18 5.2 电商系统软件测试管理的方法和...

    数字化项目测试方案.docx

    使用专业的测试工具和技术,确保测试的全面性和深入性; 建立问题跟踪和管理机制,确保问题得到及时解决和记录。 五、测试执行 根据测试计划,组织测试团队进行测试工作; 执行测试用例,记录测试结果和发现的问题...

    并发编程笔记20190526.docx

    第二章 线程的并发工具类 21 一、 Fork/Join框架的介绍 21 1、实现步骤: 22 2、工作窃取算法 22 3、分而治之 23 4、Fork/Join使用的标准范式 24 5、Fork/Join框架的异常处理 26 6、Fork/Join框架的实现原理 26 二、...

    填充word文档热门demo,直接使用,包含可填充图片

    * 功能需求通过填充生成.doc和.docx格式的文档,由于使用easypoi内容太多(冗余),并且生成word的图片,文本换行不易处理。我将word部分代码抽离出来并对代码进行处理逻辑调整。生成单独、简单、易用的工具包 &gt; 二...

    SM加密.docx

    SM2,SM3,SM4四种国密算法,测试方法,工具类,本人测试通过

    SAS介绍.docx

    ,开发和编程(EIS/OLAP 应用程序生成器,框架生成器,类浏览器,数据仓库管理员),报表(EIS/OLAP报表库,设计报表,即席图表),附件(图形测试图案,注册表编辑器,元数据浏览器),ASSIST,EIS/OLAP应用程序...

    软件测试入门教程知识点以及测试技巧知识点总结.docx

    单元测试(Unit Testing) 单元测试是一种软件测试方法,主要用于检验软件设计的最小可测试单元(通常是函数、方法或类)的功能正确性。开发者编写针对这些小块代码的测试用例,确保它们在隔离状态下按预期运行。单元...

    android studo连接真机测试.docx

    凭借强大的功能和灵活的截取策略,使其成为类UNIX系统下用于网络分析和问题排查的首选工具 tcpdump提供了源代码,公开了接口,因此具备很强的可扩展性,对于网络维护和入侵者都是非常有用的工具 tcpdump 支持针对...

    软件测试是软件开发过程中的关键一环.docx

    软件测试是软件开发过程中的关键一环,其目的在于确保软件的质量、稳定性及可靠性。通过执行一系列测试活动,可以发现软件中的缺陷和漏洞,为后续的修复和优化提供依据。以下是对软件测试的简要介绍。 软件测试涉及...

    凯云联创测评中心介绍.docx

    凯云科技自创建以来,始终致力于国产自主可控软件测试类产品的研发及推广,为国内军用、工业、民用以及院校培训教学提供具有国际领先水平、通用性强、可靠性高、应用成本低的通用装备软件测试及管理环境。...

    基于微信小程序的大学生心理健康测试设计与实现.docx

    2.4 心理健康测试的常用工具 12 第三章 微信小程序开发技术 14 3.1 微信小程序开发环境搭建 14 3.2 微信小程序框架与组件 15 3.3 微信小程序开发流程 17 3.4 微信小程序发布与上线 18 第四章 大学生心理健康测试需求...

Global site tag (gtag.js) - Google Analytics