Office 에서 수학 공식 을 자바 로 해석 합 니 다.

9012 단어
회 사 는 교육 용 제품 을 만 들 고 있 습 니 다. 수학 공식 을 만 났 을 때 저 희 는 보통 latex 표현 식 을 사용 하여 보존 하고 렌 더 링 합 니 다.그 중의 한 항목 에서 하나의 수 요 는 office 문서 Word 또는 Excel 에서 문제 내용 을 데이터베이스 로 가 져 오 는 것 이다. 문제 내용 에는 수학 공식 이 포 함 될 수 있 고 문서 에서 편집 하려 면 office 의 공식 플러그 인 을 사용 하여 공공 요 소 를 쓰 는 것 이다.사실 회사 의 이전 제품 은 이미 사용 .net 하여 이 기능 을 실현 한 적 이 있 지만 현재 회사 의 전면적 인 전환 Java 은 우리 도 적용 Java 의 해결 방안 을 연구 해 야 한다.
office 문서 의 공식 편집기
mathtype 플러그 인
mathtype 은 제3자 수학 공식 플러그 인 으로 Office 문서 에서 편집 을 사용 하고 공식 벡터 그림 이 있 는 ole 대상 을 문서 에 삽입 할 수 있 습 니 다.원래 .net 의 방안 은 이 방식 을 사용 하여 mathtype 제 공 된 c# 라 이브 러 리 패 키 지 를 사용 하여 ole 대상 을 분석 하고 LaTeX 표현 식 을 추출 하 는 것 이다.하지만 순수 Java 환경 에 서 는 할 수 없다.
오피스 공식 편집기
2007 판 부터 Office 공식 편집기 도 자체 적 으로 가 져 왔 다.2007 판 WordExcel 사이 에 다른 것 은 전자 가 삽입 한 공식 대상 은 Office MathML 노드 이 고 후자 가 삽입 한 것 은 ole 이다.2010 판 부터 두 제품 의 공식 편집기 가 삽 입 된 것 은 모두 Office MathML 노드 이지 만 공식 대상 의 기본 문자 인 코딩 처리 가 다르다.이런 차이 점 을 보면 같은 제품 Office 에 속 하 더 라 도 그들 사이 에는 일치 하지 않 는 부분 이 많다 는 것 을 알 수 있다.
공식 표현 식
LaTeX LaTeXΤΕΧ 을 바탕 으로 하 는 조판 시스템 으로 인쇄 품질 이 높 은 과학 기술 과 수학 문 서 를 만 드 는 데 매우 적합 하 다.예 를 들 어 피타 고 라 스 정리 용 LaTeX 으로 표현 한다.
a^{2}+b^{2}=c^{2}

자주 사용 하 는 LaTeX 렌 더 링 구성 요 소 는 MathJax 입 니 다.우리 가 프로젝트 에서 사용 하 는 것 은 바로 LaTeX 이기 때문에 이번 연 구 는 Office 중의 공식 대상 을 어떻게 LaTeX 표현 식 으로 바 꾸 는 지 하 는 것 이다.
Mathml
전 칭 수학 표기 언어 (Mathematical Markup Language) 는 XML 를 바탕 으로 인터넷 에서 수학 기호 와 공식 을 쓰 는 표기 언어 이다.예 를 들 어 표현 식:

    
        n
    
      p
      -
          1
    
  
  
  
  
  1
  
  (
  mod
  
  p
  )


Office MathML (OMML) office2007 이후 버 전에 서 편집 한 공식 대상 은 바로 OMML 이다.OMMLoffice 협조 Office Open Xml 를 위해 제 정 된 수학 표기 언어 다.예 를 들 면:

  
    
      π
      2
    
  


관 계 를 바꾸다
우리 가 프로젝트 에서 사용 하 는 세 가지 관 계 는 OMML - > MathML - > LaTex Office 설치 디 렉 터 리 에서 OMMLMathML 로 전환 하 는 xsl 도 구 를 제공 했다. MML2OMML.XSL MathML 전환 LaTex 은 인터넷 으로 다른 xsl 도구 인 mmltex. xsl 을 찾 을 수 있 도록 한다.
Office 문서 Java 분석
2007 과 이전 버 전
한 단락 Office 을 사용 한 학생 들 은 모두 알 고 있다. Office 문 서 는 wordwordx 두 가지 유형 으로 나 뉘 는데 각각 2007 년 이전 과 그 후의 버 전 형식 에 대응한다.2007 이전 버 전에 사 용 된 Office 문 서 는 바 이 너 리 파일 입 니 다.그 다음 버 전에 서 x 는 xml 새 버 전의 Office 문 서 를 Office Open Xml 로 정의 하 는 파일 형식 을 나타 낸다.만약 우리 가 wordx 파일 의 확장 자 를 zip 로 바 꾸 면 Word 문서 에 포 함 된 모든 내용 을 정상적으로 압축 해제 할 수 있다.
POI
정보 시스템 을 사용 한 학생 들 은 모두 통계 Java 문 서 를 생 성하 거나 분석 Excel 데 이 터 를 가 져 오 는 기능 을 만 났 다 고 믿 습 니 다.이때 우리 가 가장 많이 사용 하 는 개발 라 이브 러 리 는 Apache POI 다.Excel 바 이 너 리 와 POI 문 서 를 지원 하여 우리 의 대부분 Office Open Xml 문서 분석 수 요 를 만족 시 킬 수 있 습 니 다.
해석 공식 실례
먼저 우리 의 기능 제한 을 설명해 야 한다. Office 및 이상 Office2010 문서 만 을 대상 으로 Office Open XmlWord 모두 가능 하 다.그 중에서 Excel 의 공식 수학 문 자 는 일반 문자 로 바 뀌 어야 한다. 그렇지 않 으 면 Excel 식별 할 수 없 는 문자 가 나타 날 것 이다.여 기 는 Java 문 서 를 예 로 들 어 분석 과정 을 설명 한다.
기능 실현 사고
이 기능 의 관건 은 Excel 문서 의 공식 노드 Office 를 어떻게 얻 느 냐 에 있다. OMML 를 얻 은 후에 우 리 는 상기 두 도 구 를 사용 하여 OMML 로 전환 할 수 있다.
OMML 획득LaTeX 문서 가 Excel 라 는 것 을 알 았 으 니 xml 분석 도 구 를 사용 하여 xml 노드 를 읽 으 면 됩 니 다.먼저 OMML 로 조작 한 POI:
String basePath = "f:\\";
FileInputStream fis = new FileInputStream(basePath + "math.xlsx");
OPCPackage pack = OPCPackage.open(fis);
XSSFWorkbook workbook = new XSSFWorkbook(pack);
XSSFSheet sheet = workbook.getSheetAt(0);
XSSFSheet 문서 에 삽 입 된 그림, 공식 과 다른 요 소 는 모두 Excel 라 는 단독 drawing 파일 에 저 장 된 것 으로 그 중의 노드 는 요소 가 배 치 된 위치 정 보 를 기록 했다.xmlPOI 원 소 를 얻 을 수 있 습 니 다.
XSSFDrawing dr = sheet.getDrawingPatriarch();
CTDrawing drawing = dr.getCTDrawing();
CTOneCellAnchor[] oneCells = drawing.getOneCellAnchorArray();   //     、     

drawingCTOneCellAnchor 에 요소 의 위치 정 보 를 포함 하고 X 좌표, Y 좌표, 행, 소재 열 등 을 포함 하 며 더욱 중요 한 것 은 그림 이나 공식 적 인 묘사 노드 이다.xml 노드 이름 은 OMML 입 니 다. 여기 서 우 리 는 m:oMathParadom4j 를 사용 하여 얻 을 수 있 습 니 다 xpath.
CTOneCellAnchor c = oneCells[0];
String xml = c.xmlText();   //  xml 

//dom4j       
SAXReader reader = reader = new SAXReader(new DocumentFactory());
Map map=new HashMap();
map.put("xdr","http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing");
map.put("m","http://schemas.openxmlformats.org/officeDocument/2006/math");
reader.getDocumentFactory().setXPathNamespaceURIs(map); //xml   namespace  

InputSource source = new InputSource(new StringReader(xml));
source.setEncoding("utf-8");
Document doc = reader.read(source);
Element root = doc.getRootElement();
Element e = (Element)root.selectSingleNode("//m:oMathPara");    // xpath  OMML  
String omml = e.asXML();    //  xml

OMML 을 Mathml 및 LaTeX 로 변환
순조롭게 OMML 를 얻 으 면 OMML 전환 도 구 를 사용 하여 xslMathml 를 얻 을 수 있다.여기에 먼저 LaTeX 변환 도구 방법 을 쓰 고 xsl 도 구 를 사용 하여 실현 합 니 다.
/**    
 * 

Description: xsl

*/ public static String xslConvert(String s, String xslpath, URIResolver uriResolver){ TransformerFactory tFac = TransformerFactory.newInstance(); if(uriResolver != null) tFac.setURIResolver(uriResolver); StreamSource xslSource = new StreamSource(MathmlUtils.class.getResourceAsStream(xslpath)); StringWriter writer = new StringWriter(); try { Transformer t = tFac.newTransformer(xslSource); Source source = new StreamSource(new StringReader(s)); Result result = new StreamResult(writer); t.transform(source, result); } catch (TransformerException e) { logger.error(e.getMessage(), e); } return writer.getBuffer().toString(); } /** *

Description: mathml latx

* @param mml * @return */ public static String convertMML2Latex(String mml){ mml = mml.substring(mml.indexOf("?>")+2, mml.length()); // xml URIResolver r = new URIResolver(){ // xls @Override public Source resolve(String href, String base) throws TransformerException { InputStream inputStream = MathmlUtils.class.getResourceAsStream("/conventer/mml2tex/" + href); return new StreamSource(inputStream); } }; String latex = xslConvert(mml, "/conventer/mml2tex/mmltex.xsl", r); if(latex != null && latex.length() > 1){ latex = latex.substring(1, latex.length() - 1); } return latex; } /** *

Description: office mathml mml

* @param xml * @return */ public static String convertOMML2MML(String xml){ String result = xslConvert(xml, "/conventer/OMML2MML.XSL", null); return result; }

이로써 우 리 는 javax.xml.transformOMMLMathml 표현 식 으로 바 꿀 수 있다.
String mml = convertOMML2MML(omml);
String latex = convertMML2Latex(mml);

약간의 소감.
이 기능 을 실현 할 때 손 에 직접적인 자 료 를 참고 할 수 있 는 것 이 많 지 않 고 여러 가지 시행 착 오 를 거 쳤 으 며 인터넷 에서 찾 은 정보 도 많 고 유행 이 지 났 거나 말 을 반 으로 하 는 것 이다.동료 와 의 교류 에서 서로 다른 사고방식 을 사용 하여 많은 LaTeX 문 서 를 찾 아 본 데다 가 끊 임 없 는 시도 도 이 실 용적 이지 않 은 기능 을 완성 한 셈 이다.당신 자신 이 훌륭 하지 못 하 더 라 도 좋 은 팀 에서 당신 을 계속 밀 어 붙 일 수 있 습 니 다.한 사람 이 결국 얼마나 멀리 갈 수 있 는 지 는 당신 과 동행 하 는 사람 에 게 달 려 있 습 니 다.

좋은 웹페이지 즐겨찾기