2016-06-20 2 views
0

Я использую ниже код для преобразования слова в файл HTMLапач пои слово HTML преобразования - слова 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) 
    } 
} 

код правильно генерации HTML вывода.

Мне нужно поставить некоторые параметры в документе, например [[AGENT_NAME]], что я буду заменять регулярным выражением позже в коде. Но apache poi не рассматривает этот шаблон как одно слово и когда-то раскалывает «[[», «AGENT_NAME» & «]]» и вставляет некоторые теги со стилями между ними. Я не могу написать регулярное выражение и заменить параметры из-за этого.

Как apache poi решает горизонтальность слов? есть ли способ контролировать это?

+0

Apache POI не решает на границах слов, это будет Microsoft Word, выбор при создании исходный файл ... – Gagravarr

+0

Можете объяснить на нем больше? Любая ссылка будет полезна. Есть ли какой-либо особый символ, который является частью границы слов? – Fayaz

+0

Отладка кода (XWPFDocument.paragraphs) и проверка спецификаций OpenOffice http://officeopenxml.com/WPparagraph.php, я понял, что MsWord может разделить текст на страницы в любом месте документа. Он может даже разбивать обычный непрерывный текст, не содержащий каких-либо специальных символов (например, AGENTNAME). Но можем ли мы контролировать это поведение? Как сделать текст считающимся одним прогоном? – Fayaz

ответ

0

После всех усилий я, наконец, решил написать код для разбора слова doc и слияния разделенных пробегов. Вот код, надеюсь, это поможет кому-то еще

Примечание: Я использовал шаблон, как ${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; 
      } 
     } 
    } 
} 
Смежные вопросы