2017-10-09 12 views
0

私は、Apache POIを使用してラテックススタイルの式を含むテキストをMSワードドキュメントに変換しています。いくつかの助けを借りて、私はそれをうまく実装することができましたが、行に複数の等式があると、結果が正しくありません。次Apache POI Wordのテキストに複数の等式をインラインで追加するには?

は私のコードです:

import java.io.*; 
import org.apache.poi.xwpf.usermodel.*; 

import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP; 
import org.openxmlformats.schemas.officeDocument.x2006.math.CTOMath; 
import org.openxmlformats.schemas.officeDocument.x2006.math.CTOMathPara; 

import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.stream.StreamSource; 
import javax.xml.transform.stream.StreamResult; 

import uk.ac.ed.ph.snuggletex.SnuggleInput; 
import uk.ac.ed.ph.snuggletex.SnuggleEngine; 
import uk.ac.ed.ph.snuggletex.SnuggleSession; 

import java.io.IOException; 

public class CreateWordFormulaFromMathML { 

static File stylesheet = new File("MML2OMML.XSL"); 
static TransformerFactory tFactory = TransformerFactory.newInstance(); 
static StreamSource stylesource = new StreamSource(stylesheet); 

static CTOMath getOMML(String mathML) throws Exception { 
    Transformer transformer = tFactory.newTransformer(stylesource); 

    StringReader stringreader = new StringReader(mathML); 
    StreamSource source = new StreamSource(stringreader); 

    StringWriter stringwriter = new StringWriter(); 
    StreamResult result = new StreamResult(stringwriter); 
    transformer.transform(source, result); 

    String ooML = stringwriter.toString(); 
    stringwriter.close(); 

    CTOMath ctOMath = CTOMath.Factory.parse(ooML); 
    return ctOMath.getOMathArray(0); 
} 

public static void main(String[] args) throws Exception { 

    XWPFDocument document = new XWPFDocument(); 

    String mstr = "The expression is as: $ax^2 + bx = c$ is easier to understand than $$ax^2 + \\frac{\\sin^{-1}\\theta}{\\cot{-1}} \\times y_1$$ or anything in \\[ ay^2 + b_2 \\theta\\]"; 

    XWPFParagraph paragraph = document.createParagraph(); 
    XWPFRun run = paragraph.createRun(); 
// run.setText(""); 

    SnuggleEngine engine = new SnuggleEngine(); 
    SnuggleSession session = engine.createSession(); 

    SnuggleInput input = new SnuggleInput(mstr); 
    session.parseInput(input); 

    String mathML = session.buildXMLString(); 
    System.out.println("Input " + input.getString() + " was converted to:\n" + mathML + "\n\n"); 


for(String s : mathML.split("\\s+(?=<math)|(?<=</math>)\\s+")){ 

if (s.startsWith("<math")) 
{ 
    CTOMath ctOMath = getOMML(s); 
    System.out.println(s); 

    CTP ctp = paragraph.getCTP(); 
    ctp.setOMathArray(new CTOMath[]{ctOMath});   
} 
else 
{ 
    run.setText(s + " "); 
    System.out.println(s); 
} 
} 

    document.write(new FileOutputStream("CreateWordFormulaFromMathML.docx")); 
    document.close(); 

} 
} 

これは表現のようにある

と文書作成:

注^ 2 + B_2 \シータAYよりも理解しやすいか何かです:(ay^2 + b_2 \ theta)は単語式の形式で正しくあります。

私が必要とするのは、中間の多元方程式を持つインラインテキストです。

答えて

1

*.docxなどOffice OpenXML個のファイルを作成するタスクを解決するにはどうすればよいですか?

Office OpenXML*.docxなどのファイルは、サイプレスZIPアーカイブです。私たちはそれらを解凍し、内部を見ることができます。 *.docxには/word/document.xmlがあり、ドキュメントの構造を記述するXMLがあります。式インラインを持つ段落のために我々のような何かを見つける:

<w:p> 
<w:r> 
    <w:t>text</w:t> 
</w:r> 
<m:oMath>... </m:oMath> 
<w:r> 
    <w:t>text</w:t> 
</w:r> 
<m:oMath>... </m:oMath> 
... 
</w:p> 

をだから我々は、テキストと、それらの間の複数のを保持する複数の実行を必要としています。

なぜ段落にOMathArrayCTOMath[]があるのですか。そしてあなたのコードは、このアレイを新しい配列を1つ上に上書きします。CTOMathそれぞれ時にはCTOMathが見つかりました。代わりに、追加のCTOMathが見つかるたびに、追加のCTOMathを配列に追加する必要があります。

org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPの段落でできることを知るには、このためのドキュメントが必要です。私が見つけたベストはgrepcode.comです。そこにはCTP.addNewOMath()CTP.setOMathArray(int, CTOMath)があります。

だから、のようなあなたのコード変更:

for(String s : mathML.split("\\s+(?=<math)|(?<=</math>)\\s+")){ 

    if (s.startsWith("<math")) { 
    CTOMath ctOMath = getOMML(s); 
    System.out.println(s); 

    CTP ctp = paragraph.getCTP(); 
    ctp.addNewOMath(); 
    ctp.setOMathArray(ctp.sizeOfOMathArray()-1, ctOMath);   
    } 
    else { 
    run = paragraph.createRun(); 
    run.setText(s + " "); 
    System.out.println(s); 
    } 
    } 

が動作するはずです。

+0

これは完璧に機能しています!ありがとうございました! –

関連する問題