这边是简单实现
在做的一个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()); }
相关推荐
docx4j是一个强大的开源Java库,它允许开发者对OpenXML格式(如.docx、.xlsx等)进行深度操作,包括创建、读取和修改这些文件。以下是对这一主题的详细阐述: 首先,docx4j库的核心功能在于处理OpenXML文档,这种...
通常,这些jar包包括`docx4j.jar`,`docx4j-openxml-libs`下的若干依赖库,例如`fontmetrics.jar`、`ooxml-schemas.jar`等。确保这些库都已正确添加,否则可能会出现运行时错误。 使用docx4j操作docx文档的基本步骤...
- `docx4j`是一个用于处理OpenXML格式(如.docx)的Java库,可能会被用来与Freemarker协同工作,生成Word文档。 - `itextpdf`是iText库的文件名,表示该项目直接使用了iText的PDF处理功能。 这些技术在企业级应用...
Docx4j是一个开源项目,专门用于读写OpenXML格式的文档,如Word (.docx)、Excel (.xlsx)和PowerPoint (.pptx)。它提供了一套全面的API,使得开发者能够轻松地对文档进行各种操作,而无需深入了解复杂的OpenXML结构。...
Apache POI和Docx4J是两个非常重要的Java库,分别用于处理Microsoft Office的文档格式,如Excel、Word和PowerPoint。在这个名为“java-office-experimental”的项目中,开发者使用了这两个库来创建和操作PPTX文件。...
1. 导入必要的类库,包括 java.io.FileInputStream、java.io.FileOutputStream、java.io.InputStream、java.io.OutputStream、org.apache.poi.openxml4j.opc.OPCPackage、org.apache.poi.xwpf.usermodel....
- **OpenXML4J**:处理Open XML格式(如Office 2007及以后版本的文件)的一个库。 - **FlexiPDF/Aspose**:商业库,提供更高级的功能,如创建、编辑和转换PDF和Office文件。 - **LibreOffice/OpenOffice**:可以...
同时,由于Apache POI并不完全针对Android平台优化,因此可能会遇到内存泄漏或其他兼容性问题,这时可能需要寻找专门为Android设计的替代库,如Doc4j或OpenXML4J。 总之,Android结合Apache POI提供了一种灵活的...
- **概述**:OpenXML4J 是一个基于Java的开源库,它允许开发者轻松地创建、读取和修改Microsoft Office Open XML 格式的文档,如Word (.docx)、Excel (.xlsx) 和 PowerPoint (.pptx) 文件。 - **主要特性**: - ...
- **OpenXML4J**:用于解析Open XML文件格式(如Office 2007及更高版本)。此库可以帮助提取文档内容,但可能不适用于显示整个文档。 - **第三方库**:例如Spire.Doc for Android、Aspose.Cells for Android等,...