`

docx4j 自定义格式支持(openxml直写)

阅读更多

这边是简单实现

 

在做的一个pptx转docx的东西

 

首先是用POI实现的 发现ppt中取出的图像(XSLFPictureShape)放到docx中显示不出(文件在的 解压docx看到了) 直接处理openxml不会....然后就用了docx4j

 

docx4j(http://www.docx4java.org/trac/docx4j)

 

将图片写入 显示没有问题 在处理好了表格之后 要做自定义格式的处理(也就是ppt的格式到word里也要保留(最低限度的保留 字体和字号总要的))

 

接下来用dom4j获取pptx的自定义格式的信息(此时项目已经是POI负责做pptx解析 docx4j负责做docx生成了)

然后用docx4j的自定义格式发现不管用:

http://blog.csdn.net/zhyh1986/article/details/8733389

其中的第一段代码 改和没改输出一样

 

然后最后用了xml直接写入 就可以了

 

先介绍一下openxml的简单格式(这里主要处理document.xml这个文档):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:document
	xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas"
	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:m="http://schemas.openxmlformats.org/officeDocument/2006/math"
	xmlns:v="urn:schemas-microsoft-com:vml"
	xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing"
	xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing"
	xmlns:w10="urn:schemas-microsoft-com:office:word"
	xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
	xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml"
	xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup"
	xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocessingInk"
	xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml"
	xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape"
	mc:Ignorable="w14 wp14">
	<w:body>
		<w:p w:rsidR="003323F9" w:rsidRDefault="00713F7D" w:rsidP="00713F7D">
			<w:pPr>
				<w:jc w:val="center" />
				<w:rPr>
					<w:rFonts w:ascii="微软雅黑" w:eastAsia="微软雅黑" w:hAnsi="微软雅黑" />
					<w:b />
					<w:color w:val="000000" />
					<w:sz w:val="39" />
					<w:szCs w:val="39" />
				</w:rPr>
			</w:pPr>
			<w:r w:rsidRPr="00713F7D">
				<w:rPr>
					<w:rFonts w:ascii="微软雅黑" w:eastAsia="微软雅黑" w:hAnsi="微软雅黑" />
					<w:b />
					<w:color w:val="000000" />
					<w:sz w:val="39" />
					<w:szCs w:val="39" />
				</w:rPr>
				<w:t>Nutch相关框架</w:t>
			</w:r>
			<w:r w:rsidRPr="00713F7D">
				<w:rPr>
					<w:rFonts w:ascii="微软雅黑" w:eastAsia="微软雅黑" w:hAnsi="微软雅黑"
						w:hint="eastAsia" />
					<w:b />
					<w:color w:val="000000" />
					<w:sz w:val="39" />
					<w:szCs w:val="39" />
				</w:rPr>
				<w:t>视频教程</w:t>
			</w:r>
		</w:p>

... ...

 格式比较简单明了

w:r被w:p包裹 w:p中有多个w:r 由他们组成一段话

w:r中的w:t是内容 w:rPr是一些格式参数 

 

按照以上就能实现最低限度的要求了

要在docx4j里直接写的话 从w:p开始就可以了 要注意写上w的空间名

 

这里附上完整的处理代码:

				if (shape instanceof XSLFTextShape) {
					XSLFTextShape txShape = (XSLFTextShape) shape;

					// System.out.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>"+shape.getXmlObject());
					SAXReader reader = new SAXReader();
					org.dom4j.Document document = reader
							.read(new ByteArrayInputStream(
									("<?xml version=\"1.0\" encoding=\"utf-8\"?>" + txShape
											.getXmlObject().toString())
											.getBytes("utf-8")));
					StringBuffer sb = new StringBuffer();
					// 获得根
					Element root = document.getRootElement();
					try {
						// 获得文本信息
						Element txBody = root.element("txBody");

						Element p = txBody.element("p");

						sb.append("<w:p xmlns:w =\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">");
						
						List<Element> rs = p.elements("r");

						if (rs.size() == 0) {

							continue;
						}
						/*
						 * <w:r> <w:rPr> <w:rFonts w:ascii="微软雅黑"
						 * w:eastAsia="微软雅黑" w:hAnsi="微软雅黑" w:hint="eastAsia" />
						 * <w:b /> <w:color w:val="000000" /> <w:sz w:val="39"
						 * /> <w:szCs w:val="39" /> </w:rPr>
						 * <w:t>通过ivy来进行依赖管理(1.2之后)。</w:t> </w:r>
						 */
						for (Element r : rs) {
							sb.append("<w:r>");
							sb.append("<w:rPr>");
							Element erPr = r.element("rPr");
							RPr rpr = new RPr();
							String size = erPr.attributeValue("sz");
							
							Element ea = null;
							if ((ea = erPr.element("ea")) != null) {
								if (ea.attributeValue("typeface") != null) {
									sb.append("<w:rFonts w:ascii=\""+erPr.element("ea")+"\"  w:eastAsia=\""+erPr.element("ea")+"\" w:hAnsi=\""+erPr.element("ea")+"\" w:hint=\"eastAsia\" />");
								}

							}
							
							String b=erPr.attributeValue("b");
							
							String i=erPr.attributeValue("i");
							
							if(Objects.equals("1", b)){
								sb.append("<w:b />");
							}
							
							if(Objects.equals("1", i)){
								sb.append("<w:i />");
							}
							
							if (size != null) {
								System.out.println(size);
								int iSize=Integer.valueOf(size)/100;
                                sb.append("<w:sz w:val=\""+iSize+"\" /> <w:szCs w:val=\""+iSize+"\" />");
							}
							
							sb.append("</w:rPr>");
							Element t = r.element("t");
                            
							sb.append("<w:t>"+t.getText()+"</w:t>");
							sb.append("</w:r>");

							

						}
						sb.append("</w:p>");
//						sb.append("</w:body>");
						wordMLPackage.getMainDocumentPart()
						.addParagraph(sb.toString());
					} catch (Exception e) {
						e.printStackTrace();
						wordMLPackage.getMainDocumentPart().addParagraphOfText(
								txShape.getText());
					}

					System.out.println(txShape.getText());
}

 

0
1
分享到:
评论

相关推荐

    docx4j 动态生成表格 (一 )

    docx4j是一个强大的开源Java库,它允许开发者对OpenXML格式(如.docx、.xlsx等)进行深度操作,包括创建、读取和修改这些文件。以下是对这一主题的详细阐述: 首先,docx4j库的核心功能在于处理OpenXML文档,这种...

    java docx文档操做需要的相关jar包

    通常,这些jar包包括`docx4j.jar`,`docx4j-openxml-libs`下的若干依赖库,例如`fontmetrics.jar`、`ooxml-schemas.jar`等。确保这些库都已正确添加,否则可能会出现运行时错误。 使用docx4j操作docx文档的基本步骤...

    word转pdf、word导出、pdf加水印

    - `docx4j`是一个用于处理OpenXML格式(如.docx)的Java库,可能会被用来与Freemarker协同工作,生成Word文档。 - `itextpdf`是iText库的文件名,表示该项目直接使用了iText的PDF处理功能。 这些技术在企业级应用...

    Docx 文档操作工具类

    Docx4j是一个开源项目,专门用于读写OpenXML格式的文档,如Word (.docx)、Excel (.xlsx)和PowerPoint (.pptx)。它提供了一套全面的API,使得开发者能够轻松地对文档进行各种操作,而无需深入了解复杂的OpenXML结构。...

    java-office-experimental:使用apache poi和docx4j创建pptx的测试存储库

    Apache POI和Docx4J是两个非常重要的Java库,分别用于处理Microsoft Office的文档格式,如Excel、Word和PowerPoint。在这个名为“java-office-experimental”的项目中,开发者使用了这两个库来创建和操作PPTX文件。...

    java 使用POI合并两个word文档.docx

    1. 导入必要的类库,包括 java.io.FileInputStream、java.io.FileOutputStream、java.io.InputStream、java.io.OutputStream、org.apache.poi.openxml4j.opc.OPCPackage、org.apache.poi.xwpf.usermodel....

    Android office

    - **OpenXML4J**:处理Open XML格式(如Office 2007及以后版本的文件)的一个库。 - **FlexiPDF/Aspose**:商业库,提供更高级的功能,如创建、编辑和转换PDF和Office文件。 - **LibreOffice/OpenOffice**:可以...

    android 根据模板生成word

    同时,由于Apache POI并不完全针对Android平台优化,因此可能会遇到内存泄漏或其他兼容性问题,这时可能需要寻找专门为Android设计的替代库,如Doc4j或OpenXML4J。 总之,Android结合Apache POI提供了一种灵活的...

    JAVA开源框架-汇总.doc

    - **概述**:OpenXML4J 是一个基于Java的开源库,它允许开发者轻松地创建、读取和修改Microsoft Office Open XML 格式的文档,如Word (.docx)、Excel (.xlsx) 和 PowerPoint (.pptx) 文件。 - **主要特性**: - ...

    安卓Android源码——android 读取展示office2007.zip

    - **OpenXML4J**:用于解析Open XML文件格式(如Office 2007及更高版本)。此库可以帮助提取文档内容,但可能不适用于显示整个文档。 - **第三方库**:例如Spire.Doc for Android、Aspose.Cells for Android等,...

Global site tag (gtag.js) - Google Analytics