基于java处理ofd格式文件

一、ofd格式介绍

在这里插入图片描述

国家发布过一份关于ofd编码格式的资料,本来我想传上去的发现资源重复了,你们可以找找看,没有的话留个邮箱,我看到会发给你们的

ofd本质上其实是一个压缩文件,咱们把他当做一个压缩包来处理就好了,思路是先解压,对解压后的文件进行解析处理,解压后是xml文件,java有很多处理xml的类,这里我推荐dom4j,原因是相对来说功能全、速度快,处理完后再进行压缩,保存为ofd格式即可

ofd的阅读器我也有,只是是公司的,不方便共享了,大家可以找网上在线阅读器
 

二、xml处理工具类

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;/**  DOM4J类DOM4J定义了几个Java类。以下是最常见的类:Document - 表示整个XML文档。文档Document对象是通常被称为DOM树。Element - 表示一个XML元素。 Element对象有方法来操作其子元素,它的文本,属性和名称空间。Attribute - 表示元素的属性。属性有方法来获取和设置属性的值。它有父节点和属性类型。Node - 代表元素,属性或处理指令常见DOM4J的方法当使用DOM4J,还有经常用到的几种方法:SAXReader.read(xmlSource)() - 构建XML源的DOM4J文档。Document.getRootElement() - 得到的XML的根元素。Element.node(index) - 获得在元素特定索引XML节点。Element.attributes() - 获取一个元素的所有属性。Node.valueOf(@Name) - 得到元件的给定名称的属性的值。* * */
public class OfdXmlUtil {public static String ids = "";public static String getAttributeIdByPath(String path,String attribute) throws Exception {List<XmlEntity> xmlList = readXmlByPath(path);int mediaId = 0;for (XmlEntity xml : xmlList) {if (xml.getNode().equals(attribute) && xml.getAttributes().get("ID") != null) {mediaId = mediaId>Integer.parseInt(xml.getAttributes().get("ID"))?mediaId:Integer.parseInt(xml.getAttributes().get("ID"));}}String id=String.valueOf(mediaId+1);return id;}public static String getId(Element node, String element) {if(node.getName().equals(element)) {ids = node.valueOf("id");}// 当前节点下面子节点迭代器Iterator<Element> it = node.elementIterator();// 递归遍历while (it.hasNext()) {// 获取某个子节点对象Element e = it.next();// 对子节点进行遍历getId(e, element);}return ids;}public static String getLastIdByElement(String path, String element) throws Exception {File file = new File(path);// 创建saxReader对象SAXReader reader = new SAXReader();Document document = reader.read(file);// 获取根节点元素对象Element node = document.getRootElement();String str = getId(node, element);return str;}/*** * @param path* @return* @throws Exception*/public static List<XmlEntity> readXmlByPath(String path) throws Exception {File file = new File(path);List<XmlEntity> xmlEntities = readXmlByFile(file);return xmlEntities;}/*** @param file* @return* @throws Exception*/public static List<XmlEntity> readXmlByFile(File file) throws Exception {// 创建saxReader对象SAXReader reader = new SAXReader();Document document = reader.read(file);// 获取根节点元素对象Element node = document.getRootElement();List<XmlEntity> xmlEntities = new ArrayList<XmlEntity>();listNodes(node, xmlEntities);return xmlEntities;}/*** 遍历当前节点元素下面的所有(元素的)子节点* * @param node*/public static void listNodes(Element node, List<XmlEntity> xmlEntities) {XmlEntity xmlEntity = new XmlEntity();xmlEntity.setNode(node.getName());// 获取当前节点的所有属性节点List<Attribute> list = node.attributes();// 遍历属性节点Map<String, String> attributeMap = list.stream().collect(Collectors.toMap(Attribute::getName, Attribute::getValue));xmlEntity.setAttributes(attributeMap);if (!(node.getTextTrim().equals(""))) {xmlEntity.setContent(node.getText());}xmlEntities.add(xmlEntity);// 当前节点下面子节点迭代器Iterator<Element> it = node.elementIterator();// 递归遍历while (it.hasNext()) {// 获取某个子节点对象Element e = it.next();// 对子节点进行遍历listNodes(e, xmlEntities);}}// 递归获取当前节点下最后一个节点的元素public static Element getLastElement(Element node) throws Exception {Element node2 = getNextElement(node, 0);if (node2.elements().size() > 0) {node2 = getNextElement(node2, 0);}return node2;}// 获取当前节点下第i个节点的元素public static Element getNextElement(Element e, int i) {e = e.elements().get(i);return e;}/*** 根据节点名获取节点* * @param node*/public static List<Element> getAllEle(Element node, List<Element> elems) {elems.add(node);List<Element> listElement = node.elements();// 所有一级子节点的listfor (Element e : listElement) {// 遍历所有一级子节点getAllEle(e, elems);// 递归}return elems;}/*** 修改、增加xml属性值 元素无重复 不能修改根元素 String elem 需要修改的标签名, String key属性名, String* value修改后的值* * @return* @throws Exception*/public static boolean edit(Document doc, String elem, String key, String value, String outUrl) throws Exception {Element element = doc.getRootElement();// 当前节点下面子节点迭代器Element tmpEle = doc.getRootElement();List<Element> elems = new ArrayList<Element>();List<Element> listElement = getAllEle(element, elems);if (listElement.size() != 0) {for (Element e : listElement) {// 遍历所有一级子节点if (e.getName().equals(elem)) {tmpEle = e;}}}if (tmpEle.isRootElement()) {return false;} else {// 2.通过增加同名属性的方法,修改属性值tmpEle.addAttribute(key, value); // key相同,覆盖;不存在key,则添加// 指定文件输出的位置writer(doc, outUrl);return true;}}/*** 把document对象写入新的文件* * @param document* @throws Exception*/public static void writer(Document document, String url) throws Exception {// 紧凑的格式// OutputFormat format = OutputFormat.createCompactFormat();// 排版缩进的格式OutputFormat format = OutputFormat.createPrettyPrint();// 设置编码format.setEncoding("UTF-8");// 创建XMLWriter对象,指定了写出文件及编码格式// XMLWriter writer = new XMLWriter(new FileWriter(new// File("src//a.xml")),format);XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(new File(url)), "UTF-8"), format);// 写入writer.setEscapeText(false);writer.write(document);// 立即写入writer.flush();// 关闭操作writer.close();}public static void createSignaturesXml(String signs,String signTmp) throws Exception {Document doc1 = new SAXReader().read(new File(signs + "/Signatures.xml"));Element Signatures = doc1.getRootElement();Element Signature = Signatures.addElement("ofd:Signature");Signature.addAttribute("ID", "1");Signature.addAttribute("Type", "Seal");Signature.addAttribute("BaseLoc", signTmp.substring(signTmp.length()-6) + "/Signature.xml");OfdXmlUtil.writer(doc1, signs + "/Signatures.xml");}
}

三、压缩解压缩处理工具类

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;public class ZipUtil {private ZipUtil() {}public static void doCompress(String srcFile, String zipFile) throws Exception {String rootdDirectory = srcFile.split("/")[srcFile.split("/").length - 1]; // 获取根目录名称doCompress(new File(srcFile), new File(zipFile), rootdDirectory);}/*** 文件压缩* * @param srcFile 目录或者单个文件* @param zipFile 压缩后的ZIP文件*/public static void doCompress(File srcFile, File zipFile, String rootdDirectory) throws Exception {ZipOutputStream out = null;try {out = new ZipOutputStream(new FileOutputStream(zipFile));doCompress(srcFile, out, rootdDirectory);} catch (Exception e) {throw e;} finally {out.close();// 记得关闭资源}}public static void doCompress(File file, ZipOutputStream out, String rootdDirectory) throws IOException {doCompress(file, out, "", rootdDirectory);}public static void doCompress(File inFile, ZipOutputStream out, String dir, String rootdDirectory)throws IOException {if (inFile.isDirectory()) {File[] files = inFile.listFiles();if (files != null && files.length > 0) {for (File file : files) {String name = inFile.getName();if (!"".equals(dir)) {name = dir + "/" + name;}ZipUtil.doCompress(file, out, name, rootdDirectory);}}} else {// 将根目录干掉,否则无法打开OFD文件dir = dir.replaceAll(rootdDirectory, "");ZipUtil.doZip(inFile, out, dir);}}public static void doZip(File inFile, ZipOutputStream out, String dir) throws IOException {String entryName = null;if (!"".equals(dir)) {dir = dir.substring(1, dir.length());entryName = dir + "/" + inFile.getName();} else {entryName = inFile.getName();}ZipEntry entry = new ZipEntry(entryName);out.putNextEntry(entry);int len = 0;byte[] buffer = new byte[1024 * 1024];FileInputStream fis = new FileInputStream(inFile);while ((len = fis.read(buffer)) > 0) {out.write(buffer, 0, len);out.flush();}out.closeEntry();fis.close();}
}
package com.koalii.oes.util;import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;/*** @项目名称:meter* @类名称:ZipTools * @类描述:采用zip压缩文件* @创建人:meter* @创建时间:2018年5月4日 上午10:25:09* @版权:Copyright@2018.All Rights Reserved* @version v1.0*/
public class UnzipUtil {/*** 读写zip文件*/private static void write(InputStream inputStream,OutputStream outStream) throws IOException{byte[] data=new byte[4096];int length=0;while((length=inputStream.read(data)) != -1){outStream.write(data,0,length);}outStream.flush();//刷新输出流inputStream.close();//关闭输入流}public static void unzip(String zipFile, String destDir) throws IOException {unzip(new File(zipFile), new File(destDir));}/*** 解压文件n */public static void unzip(File zipFile, File destDir) throws IOException {ZipFile zipOutFile = new ZipFile(zipFile);Enumeration<? extends ZipEntry> entries = zipOutFile.entries();while (entries.hasMoreElements()) {ZipEntry entry = entries.nextElement();if(entry.isDirectory()){File tempFile = new File(destDir.getAbsolutePath()+File.separator+entry.getName());if (!tempFile.exists()) {tempFile.mkdirs();}}else{File tempFile=new File(destDir.getAbsolutePath()+File.separator+entry.getName());checkParentDir(tempFile);FileOutputStream fileOutStream=new FileOutputStream(tempFile);BufferedOutputStream bufferOutStream = new BufferedOutputStream(fileOutStream);write(zipOutFile.getInputStream(entry),bufferOutStream);bufferOutStream.close();fileOutStream.close();}}zipOutFile.close();//关闭zip文件}/*** 验证父目录是否存在,否则创建*/private static void checkParentDir(File file){if(!file.getParentFile().exists()){file.getParentFile().mkdirs();}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/496424.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文带你读懂深度学习:AI 认识世界的方式如同小孩

来源&#xff1a;36氪摘要&#xff1a;搞清楚儿童的大脑究竟是如何运转的&#xff0c;然后设计出一个电子版本能够同样有效地运转&#xff0c;可能需要计算机科学家们几十年的努力。如果你经常花时间和小孩子待在一起的话&#xff0c;你会不由得思考小孩子怎么能够学习得如此之…

java方法的参数传递规则_java语言参数传递介绍

java语言参数传递介绍Java不只是一种编程语言&#xff0c;它是一个完整的平台&#xff0c;拥有庞大的库&#xff0c;将诸如图形绘制、Socket连接、数据库存取等复杂操作进行了最大程度的简化。下面是小编分享的java语言参数传递介绍&#xff0c;一起来看一下吧。1.按值传递(by …

C#使用oracle数据库的function与procedure

ORACLE段&#xff1a;首先在ORACLE建立PACKAGE和PACKAGE BODY&#xff0c;将在这里面定义函数和存储过程返回结果集。1&#xff1a;建立PACKAGE&#xff1a;CREATE OR REPLACE package SCOTT.pk_wtistype mytype is ref cursor;procedure p_wt(mycs out mytype);function f_get…

微信支付PKIX path building failed

异常信息 javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification p ath to requested targetat sun.security.ssl…

Nvidia黄仁勋发布了全球最大GPU

来源&#xff1a;凤凰科技花子健摘要&#xff1a;有竞争在&#xff0c;更大的惊喜才有可能会到来。北京时间3月28日凌晨00:00&#xff0c;英伟达GTC 2018&#xff08;GPU Technology Conference 2018&#xff0c;以下简称GTC&#xff09;在美国圣何塞举行。英伟达再一次在提升计…

计算机网络(4):网络层

网络层提供的两种服务 虚电路服务&#xff08;Virtual Circuit Service&#xff09;和数据报服务&#xff08;Datagram Service&#xff09;是在网络层&#xff08;第三层&#xff09;提供的两种不同的通信服务。它们主要区别在于建立连接的方式和数据传输的方式。 虚电路服务…

VS通用快捷键:

通用快捷键&#xff1a; 1、自动排版(类似VC6中的AltF8&#xff09; 编辑.格式化选定内容 Ctrl K&#xff0c;Ctrl F 根据周围的代码行&#xff0c;正确缩进选定的代码行。 2、注释与去掉注释功能。 编辑.注释选定内容 Ctrl K&#xff0c;Ctrl C 使用编程语言的正确注释语法…

指针数组下标JAVA_C语言中下标与指针的转换以及指向指针的指针的例子

下标到指针之间和转换以下的程序做了什么。#include int main(){int a[3][3] {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}};int i 0;int j 0;for(i 0; i<3; i){for(j0; j<3; j){printf("%d\n", *(*(ai)j));}}}打印了数组中的每个元素&#xff1a;指向指针的指针#inc…

windows 下 Graphviz 安装及入门教程以及 PlantUML

From&#xff1a;http://m.blog.csdn.net/lanchunhui/article/details/49472949 开源工具---使用简单的文字描述画UML图之PlantUML官网&#xff1a;http://plantuml.com PlantUML 支持的工具&#xff1a;http://plantuml.com/running PlantUML语言参考手册中文版.pdf&#xff…

GTC2018八大热点:发布多项黑科技,联合芯片巨头ARM打造AI芯片专用IP

来源&#xff1a;人工智能和大数据丨公众号一年一度的GTC至今已经迎来了第十个年头&#xff0c;虽然它每年或多或少的给网友一些“失望”&#xff0c;但它也终究是代表着GPU行业的高水平技术大会。那么&#xff0c;今年的GTC大会&#xff0c;英伟达又给业界带来了哪些惊喜呢&am…

WPF and Silverlight 学习笔记(十二):WPF Panel内容模型、Decorator内容模型及其他...

由于园子里昨天使用Live Writer上传出现问题&#xff0c;昨天只能使用Web上的文本编辑器上传本文&#xff0c;造成代码、内容等格式的错误&#xff0c;现重发本文。 一、Panel内容模型 Panel内容模型指从System.Windows.Controls.Panel继承的控件&#xff0c;这些控件都是容器&…

java点击菜单项文字显示在窗体上_java点击菜单项弹出窗口怎么做啊?

程序如下&#xff0c;可弹不出窗口呀&#xff0c;高手教教我&#xff01;importjava.awt.*;importjava.awt.event.*;publicclassW111extendsFrameimplementsActionListener{MenuBarmbnewMenuBar();//产生一个菜单工具...程序如下&#xff0c;可弹不出窗口呀&#xff0c;高手教教…

Source Insight 教程

From&#xff1a;http://www.cnblogs.com/ningskyer/articles/4038501.html 最经典的Source_Insight完整使用教程&#xff1a;https://wenku.baidu.com/view/6f7dbe87caaedd3382c4d3e4.html Source Insight 使用方法及技巧&#xff1a;https://wenku.baidu.com/view/ddd28da…

GIS最新热点以及未来发展热门

来源&#xff1a;测绘地信、知乎用户测绘小河马GIS是空间技术和信息技术的交叉学科&#xff0c;相关领域的研究热点都有可能成为GIS的发展趋势。GIS的技术环节无外乎数据获取、数据分析、数据呈现三个方面&#xff0c;从近年的发展情况看&#xff0c;GIS可能在这三个方面都有着…

Spring Data JPA 从入门到精通~查询结果的处理

参数选择&#xff08;Sort/Pageable&#xff09;分页和排序 特定类型的参数&#xff0c;Pageable 并动态 Sort 地将分页和排序应用于查询 案例&#xff1a;在查询方法中使用 Pageable、Slice 和 Sort。 Page<User> findByLastname(String lastname, Pageable pageable)…

用C#做短信CMPP2.0/3.0协议 支持扩展号支持物理网卡

此程序为中国移动CMPP协议程序接口&#xff0c;适合在中国移动申请了短信发送端口的公司使用。 短信群发已经成为现在软件系统、网络营销等必不可少的应用工具。可应用在短信验证、信息群发、游戏虚拟商品购买、事件提醒、送祝福等方面。 本程序功能包括&#xff1a; 1、支持Cm…

新算法可模拟人脑整体神经电路

来源&#xff1a;科学网 作者&#xff1a;陈超3月28日&#xff0c;日本理化学研究所日前宣布&#xff0c;他们的一个国际联合研究小组成功开发出模拟人脑整体神经电路的算法&#xff0c;可在下一代超级计算机上应用。新算法不仅节省内存&#xff0c;也能大幅提高现有超级计算机…

Spring Data JPA 从入门到精通~@Query详解

语法及其源码 public interface Query {/*** 指定JPQL的查询语句。&#xff08;nativeQuerytrue的时候&#xff0c;是原生的Sql语句&#xff09;*/String value() default "";/*** 指定count的JPQL语句&#xff0c;如果不指定将根据query自动生成。* &#xff08;如…

Java中的mapreduce没了_MapReduce的过程总结

MapReduce 分为&#xff1a;1) MapTask :1.Read阶段&#xff1a;逻辑切片 128M / Maptask 读数据解析出一个个key/value。2.Map阶段&#xff1a; 把key/value 写入到map中去(处理业务逻辑)3.Collect阶段&#xff1a;将生成的key/value分区(调用Partitioner)排序&#xff0c;并写…

酒桌上的规矩,社会的潜规则

(一)如果自己真不能喝&#xff0c;丫就别开第一口&#xff0c;端着饭碗夹了菜一边吃着去(二)如果确信自己要喝&#xff0c;就别装墨迹&#xff0c;接下来就是规矩了  规矩一&#xff1a;酒桌上虽然“感情深&#xff0c;一口闷&#xff1b;感情浅&#xff0c;舔一舔”但是喝酒…