2016-06-20 8 views
0

ich unten Code verwenden Wort zu konvertieren Datei in HTMLApache poi Wort Konvertierung in HTML - Worten Boundry

public Map convert(String wordDocPath, String htmlPath, 
     Map conversionParams) 
{ 
    log.info("Converting word file "+wordDocPath) 
    try 
    { 
     String workingFolder = "C:\temp" 
     File workingFolderFile = new File(workingFolder) 

     FileInputStream fis = new FileInputStream(wordDocPath); 
     XWPFDocument document = new XWPFDocument(fis); 
     XHTMLOptions options = XHTMLOptions.create().URIResolver(new FileURIResolver(workingFolderFile)); 
     options.setExtractor(new FileImageExtractor(workingFolderFile)) 
     File htmlFile = new File(htmlPath); 
     OutputStream out = new FileOutputStream(htmlFile) 
     XHTMLConverter.getInstance().convert(document, out, options); 

     log.info("Converted to HTML file "+htmlPath) 

    } 
    catch(Exception e) 
    { 
     log.error("Exception :"+e.getMessage(),e) 
    } 
} 

Der Code richtig HTML-Ausgabe generiert.

Ich muss einige Parameter in das Dokument wie [[AGENT_NAME]], dass ich später im Code mit Regex ersetzen werde. Aber apache poi behandelt dieses Muster nicht als einzelnes Wort und spaltet manchmal "[[", "AGENT_NAME" & "]]" und fügt einige Tags mit Stilen dazwischen ein. Ich kann Regex nicht schreiben und die Parameter deshalb ersetzen.

Wie entscheidet Apache Poi über Wortgrenzen? Gibt es eine Möglichkeit, es zu kontrollieren?

+0

Apache POI entscheidet nicht über Grenzen Wort, es wird seine Wahl Microsoft Word bei der Generierung die Originaldatei ... – Gagravarr

+0

Kann mehr dazu erklären? Jeder Link wird hilfreich sein. Gibt es einen speziellen Charakter, der Teil der Wortgrenzen ist? – Fayaz

+0

Den Code debuggen (XWPFDocument.paragraphen) und OpenOffice-Spezifikationen durchgehen http://officeopenxml.com/WPparagrapha.php, ich habe verstanden, dass MsWord Text in Läufe irgendwo im Dokument teilen kann. Es kann sogar einen einfachen fortlaufenden Text aufteilen, der keine Sonderzeichen (wie AGENTNAME) enthält. Aber können wir dieses Verhalten kontrollieren? Wie kann man einen Text als einen einzigen Lauf betrachten? – Fayaz

Antwort

0

Nach all den Bemühungen, entschied ich mich endlich, Code zu schreiben, um Word Doc zu analysieren und geteilte Läufe zusammenzuführen. Hier ist der Code, hofft, dass es jemand anderes

Hinweis helfen: ich verwendet habe, Muster als ${pattern}

void mergeSplittedPatterns(XWPFDocument document) 
{ 
    List<XWPFParagraph> paragraphs = document.paragraphs 

    for(XWPFParagraph paragraph : paragraphs) 
    { 
     List<XWPFRun> runs = paragraph.getRuns() 

     int firstCharRun,closingCharRun 
     boolean firstCharFound = false; 
     boolean secondCharFoundImmediately = false; 
     boolean closingCharFound = false; 
     boolean gotoNextRun = true 

     boolean scan = (runs!=null && runs.size()>0) 
     int index = 0 

     while(scan) 
     { 
      gotoNextRun = true; 
      XWPFRun run = runs.get(index) 
      String runText = run.getText(0) 
      if(runText!=null) 
       for (int i = 0; i < runText.length(); i++) 
      { 
       char character = runText.charAt(i); 

       if(secondCharFoundImmediately) 
       { 
        closingCharFound = (character=="}") 
        if(closingCharFound) 
        { 
         closingCharRun = index 

         if(firstCharRun==closingCharRun) 
         { 
          firstCharFound = secondCharFoundImmediately = closingCharFound = false 
          continue; 
         } 
         else 
         { 
          String mergedText= "" 
          for(int j=firstCharRun;j<=closingCharRun;j++) 
          { 
           mergedText += runs.get(j).getText(0) 
          } 
          runs.get(firstCharRun).setText(mergedText,0) 

          for(int j=closingCharRun;j>firstCharRun;j--) 
          { 
           paragraph.removeRun(j) 
          } 
          firstCharFound = secondCharFoundImmediately = closingCharFound = gotoNextRun = false 
          index = firstCharRun 
          break; 
         } 
        } 
       } 
       else if(firstCharFound) 
       { 
        secondCharFoundImmediately = (character=="{") 
        if(!secondCharFoundImmediately) 
        { 
         firstCharFound = secondCharFoundImmediately = closingCharFound = false 
        } 
       } 
       else if(character=="\$") 
       { 
        firstCharFound = true; 
        firstCharRun = index 
       } 
      } 

      if(gotoNextRun) 
      { 
       index++; 
      } 

      if(index>=runs.size()) 
      { 
       scan = false; 
      } 
     } 
    } 
}