`
01jiangwei01
  • 浏览: 542737 次
  • 性别: 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);
	}

}

 

分享到:
评论

相关推荐

    docx4j相关jar包

    5. **测试和示例**:压缩包中可能还包括了测试用例和示例代码,帮助开发者理解和使用docx4j,例如`docx4j-samples.jar`。 在实际开发中,将这些jar包添加到项目的类路径(classpath)是至关重要的,这样才能确保...

    docx4j-3.3.3 jar包及依赖jar包

    在实际应用中,docx4j不仅可以用于生成动态报告、批量处理文档,还可以用于自动化测试,例如验证生成的文档是否满足特定格式和内容要求。此外,由于它支持转换到HTML、PDF等多种格式,docx4j也是将Office文档集成到...

    docx4j-2.6.0.tar.gz

    《docx4j-2.6.0:深入解析Word文档处理库》 docx4j-2.6.0.tar.gz是一个TAR+GZIP压缩文件,它包含了一个名为docx4j-2.6.0的完整版本。这个压缩包的大小约为13,828,193字节,这在软件分发中是常见的大小,因为它包含...

    Java将doc转docx工具类方法,maven项目,Idea可直接运行

    本示例提供了一个Java工具类,用于将.doc格式的Microsoft Word文档转换为较新的.docx格式。这个工具类是作为Maven项目构建的,这意味着它依赖于Maven的依赖管理系统来管理所需的库,并且可以在IntelliJ IDEA这样的...

    JAVA生成WORD工具类

    6. **测试代码**:`TestJava2Word.java`可能是测试类,用于验证整个转换过程的正确性,确保生成的Word文档符合预期。 在实际开发中,这样的工具类可能会封装以上所有操作,提供简单的API供其他部分代码调用,从而...

    aspose生成word、转pdf的java工具类

    以下是关于这个工具类及相关知识点的详细说明: 1. **Aspose库**:Aspose是开发人员用来创建、操作和转换不同文档格式的工具集。它提供了多种编程语言的API,包括Java、.NET、Python等,使得开发者可以在自己的应用...

    word内容提取 word转html-POI wps doc docx转html

    Apache POI处理DOC和DOCX文件时,理论上也适用于WPS产生的文档,但可能会遇到一些特定于WPS的格式问题,需要进行额外的测试和适配。 综上所述,Apache POI是一个强大的工具,它使得在Java环境中处理Word文档变得...

    解决jsolve,templ4docx文本不换行的问题

    在使用jsolve和templ4docx这两个工具进行文本处理时,可能会遇到一个问题,即文本在导出时不按预期换行,导致最终文档显示的内容与前端输入的内容不一致。这个问题主要涉及JavaScript、Java以及Word文档格式的理解,...

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

    测试工具在软件开发和维护过程中扮演着至关重要的角色,它们帮助开发者和测试人员发现和修复问题,确保产品质量。本文将详细介绍各类测试工具及其特点。 **测试管理工具**用于跟踪测试活动,包括缺陷管理、测试计划...

    Python项目-自动办公-55 Word-docx-读取word.zip

    如果项目规模较大,可能还需要集成版本控制工具(如Git)、持续集成服务(如Jenkins或GitHub Actions)和自动化测试,确保代码质量及部署流程的顺畅。 总结来说,这个项目展示了如何使用Python和`python-docx`库...

    jmeter性能测试报告.docx

    JMeter是一款广泛使用的开源性能测试工具,适用于模拟多种负载条件,进行负载测试、压力测试、并发测试和容量测试,以验证系统的性能表现。 1.1 性能测试概念 性能测试包括负载测试和压力测试,前者用于了解系统在...

    LTP测试工具使用.docx

    LTP测试套件主要针对Linux内核及相关特性进行测试,通过自动化测试提高内核的质量。 - **目标**:LTP的目标是提供一套标准化的测试方案,帮助开发者和用户评估Linux系统的功能、性能和稳定性。 #### 2. 源目录结构 ...

    Android 封装的工具类

    在Android开发中,工具类(Utils Class)是程序员经常创建的一种辅助代码结构,用来封装一些通用功能,提高代码的复用性和可维护性。这里提到的"Android 封装的工具类"涵盖了几种关键的模块,包括网络请求、数据库...

    软件测试.docx

    黑盒测试方法包括等价类划分、边界值分析、因果图、决策表和正交实验设计。白盒测试则涉及逻辑覆盖(如语句覆盖、条件覆盖等)和程序插桩(目标代码和源代码插桩)。 性能测试关注系统的响应速度、负载能力和稳定性...

    java word(doc,docx,rtf)转为pdf

    - **读取Word文档**:使用Apache POI的HSSFWorkbook或XWPFDocument类读取.doc或.docx文件,HWPFDocument用于处理RTF文件。 - **解析内容**:从Word文档中提取文本、段落样式、图片等信息。 - **创建PDF**:使用iText...

    PDF转WORD工具

    因此,在使用PDF转Word工具时,最好先对小样本进行测试,确保转换结果满足需求。 总之,PDF转Word工具是处理PDF文档的一个实用辅助,它可以帮助用户轻松地将不可编辑的PDF转换为可编辑的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

    java常用工具类封装

    在Java编程中,工具类(Util Classes)是包含各种实用方法的静态类,它们提供了一种简化常见任务的方式。"java常用工具类封装"是指将常见的功能如线程管理、数据解析、第三方库集成等进行封装,以提高代码的可重用性...

Global site tag (gtag.js) - Google Analytics