2012-05-11 39 views
3

我試圖使用OO將RTF輸入(從MS Word 2000)轉換爲HTML。 如果我打開RTF文件,屏幕上的所有內容都看起來完全正確。 如果我將它另存爲HTML,然後重新打開OO中的HTML文件,幾乎所有東西看起來都是相同的(例外:表格)。 但是,如果我在Firefox中打開HTML文件,則文本不正確。具體來說,在RTF中以及在​​OO HTML中查看時,居中或右對齊的段落現在都是左對齊的。失去從RTF到HTML轉換的集中屬性

這是奇怪的,因爲HTML文件的文本是

<P CLASS="western" ALIGN=CENTER STYLE="text-indent: 0in; margin-bottom: 0in"> 
<FONT COLOR="#000000"><FONT FACE="Verdana, sans-serif"><FONT SIZE=4 STYLE="font-size: 16pt"><B>Some text that should be centered</B></FONT></FONT></FONT></P> 

和類「西方」是

P.western { font-size: 10pt; so-language: en-US } 

有人知道爲什麼如預期的那樣定心不工作?我將在另一天處理桌子問題。

回答

0

我創建了一個腳本來設置中心 aligment RTF格式後的HTML皈依。我用javascript和Java製作了它。按照代碼:

兩個需要兩個CSS類:

.wricent { 
    text-align: center; 
} 
.wririgh { 
    text-align: right; 
} 

的JavaScript

function fixCenterRightAlign(rtf, html) { 
    html = fixAlign(rtf, html, 'qc'); 
    return fixAlign(rtf, html, 'qr'); 
} 

function fixAlign(rtf, html, align) { 
    let lastCountParBeforePard = 0; 
    let countParBeforePard = 0; 
    let indexPard = 0; 
    let iqc = 0; 
    let toContinue = true; 
    let firstCicle = true; 
    const p_class = '<p class='; 
    const c_class = align === 'qc' ? '<p class=wricent' : '<p class=wririgh'; 
    while(toContinue) { 
    let indexNextP = 0; 
    iqc = rtf.substr(indexPard).indexOf('\\' + align); 
    if (iqc > -1) { 
     iqc += indexPard; 
     let parQtLeft = getParQt(rtf.substr(0, iqc)); 
     let rtfFirstQc = rtf.substr(iqc); 
     indexPard = rtfFirstQc.indexOf('\\pard'); 
     if (indexPard > -1) { 
     rtfFirstQc = rtfFirstQc.substr(0, indexPard); 
     countParBeforePard = getParBeforePard(rtfFirstQc, indexPard); 
     } else { 
     toContinue = false; 
     indexPard = 0; 
     countParBeforePard = 0; 
     } 
     let parQt = getParQt(rtfFirstQc) + (lastCountParBeforePard - countParBeforePard); 
     firstCicle && parQt++; 
     indexPard += iqc; 

     if (parQt > 0) { 
     for (let i = 0; i < (parQtLeft + parQt); i++) { 
      let actualIdexNextP = html.substr(indexNextP).indexOf(p_class); 

      if ((i + 1) > parQtLeft && actualIdexNextP > -1) { 
      html = replaceAt(html, indexNextP + actualIdexNextP, c_class); 
      } 
      indexNextP += c_class.length + actualIdexNextP; 
     } 
     } 
     lastCountParBeforePard = angular.copy(countParBeforePard); 
    } else { 
     toContinue = false; 
    } 
    firstCicle = false; 
    } 
    return html; 
} 
function replaceAt(text, index, character) { 
    return text.substr(0, index) + character + text.substr(index + character.length); 
} 

function getParBeforePard(rtfFirstQc, indexPard) { 
    let text = rtfFirstQc.substr(indexPard - 6, indexPard); 
    return getParQt(text); 
} 

function getParQt(text) { 
    let pardQt = text.match(new RegExp('\\\\pard', "g")); 
    let parQt = text.match(new RegExp('\\\\par', "g")); 
    pardQt = pardQt ? pardQt.length : 0; 
    return (parQt ? parQt.length : 0) - pardQt; 
} 

的Java

private final String RTF_CENTER_TAG = "qc"; 
    private final String RTF_RIGHT_TAG = "qr"; 

    /** 
    * Fix the alignment center and right of the html template 
    * @param rtf String containing the <b>rtf template</b> 
    * @param html String containing the <b>html template from the rtf convertion</b> 
    * @author desilva 
    * @return String with the html template with the center/right align fixed 
    */ 
    private String stylizeAligment(String rtf, String html) { 
     html = fixAlign(rtf, html, this.RTF_CENTER_TAG); 
     return fixAlign(rtf, html, this.RTF_RIGHT_TAG); 
    } 

    /** 
    * Fix the align of the html template based on the rtf and the rtf tag to fix 
    * @param rtf String containing the <b>rtf template</b> 
    * @param html String containing the <b>html template from the rtf convertion</b> 
    * @param tagAlign 
    * @return 
    */ 
    private String fixAlign(String rtf, String html, String tagAlign) { 
     Integer parQt = 0; 
     Integer pardQt = 0; 
     Integer lastCountParBeforePard = 0; 
     Integer countParBeforePard = 0; 
     Integer indexPard = 0; 
     Integer iqc = 0; 
     boolean toContinue = true; 
     boolean firstCicle = true; 
     String pClass = "<p class="; 
     String cClass = (tagAlign.equals(this.RTF_CENTER_TAG) ? "<p class=wricent" : "<p class=wririgh"); 
     while(toContinue) { 
      int indexNextP = 0; 
      iqc = rtf.substring(indexPard).indexOf("\\" + tagAlign); 
      if (iqc > -1) { 
      iqc += indexPard; 
      Integer pardQtLeft = this.getMatches(rtf.substring(0, iqc), "\\\\pard"); 
      Integer parQtLeft = this.getMatches(rtf.substring(0, iqc), "\\\\par") - pardQtLeft; 
      String rtfFirstQc = rtf.substring(iqc); 
      indexPard = rtfFirstQc.indexOf("\\pard"); 
      if (indexPard > -1) { 
       rtfFirstQc = rtfFirstQc.substring(0, indexPard); 
       countParBeforePard = this.getParBeforePard(rtfFirstQc, indexPard); 
      } else { 
       toContinue = false; 
       indexPard = 0; 
       countParBeforePard = 0; 
      } 
      pardQt = this.getMatches(rtfFirstQc,"\\\\pard"); 
      parQt = this.getMatches(rtfFirstQc,"\\\\par") - pardQt; 
      parQt += (lastCountParBeforePard - countParBeforePard); 
      if(firstCicle) parQt++; 
      indexPard += iqc; 

      if (parQt > 0) { 
       for (int i = 0; i < (parQtLeft + parQt); i++) { 
       Integer actualIdexNextP = html.substring(indexNextP).indexOf(pClass); 

       if ((i + 1) > parQtLeft && actualIdexNextP > -1) { 
        html = this.replaceAt(html, indexNextP + actualIdexNextP, cClass); 
       } 
       indexNextP += cClass.length() + actualIdexNextP; 
       } 
      } 
      lastCountParBeforePard = countParBeforePard; 
      } else { 
      toContinue = false; 
      } 
      firstCicle = false; 
     } 
     return html; 
    } 

    private String replaceAt(String text, int index, String character) { 
     return text.substring(0, index) + character + text.substring(index + character.length()); 
    } 

    private int getParBeforePard(String rtfFirstQc, int indexPard) { 
     String text = rtfFirstQc.substring(indexPard - 6, indexPard); 
     int pardQt = this.getMatches(text, "\\\\pard"); 
     return this.getMatches(text, "\\\\par") - pardQt; 
    } 

    private Integer getMatches(String input, String regex) { 
     Pattern pattern = Pattern.compile(regex); 
     Matcher matcher = pattern.matcher(input); 
     int from = 0; 
     int count = 0; 
     while(matcher.find(from)) { 
      count++; 
      from = matcher.start() + 1; 
     } 

     return count; 
    } 

使用方法:方法stylizeAligmentfixCenterRightAlign接收字符串RTF和它的HTML變換,返回的是具有固定對準的HTML。

我需要創建它,因爲我使用javax.swing.text.rtf將rtf轉換爲html。

在我的情況下加下劃線的文本不工作了,所以要修復它只是把CSS樣式:

p span u { 
    text-decoration: underline; 
    }