丢失从RTF到HTML转换的居中属性

时间:2012-05-11 12:45:03

标签: html rtf

我正在尝试使用OO将RTF输入(从MS Word 2000)转换为HTML。 如果我打开RTF文件,屏幕上的所有内容看起来都完全正确。 如果我将其保存为HTML,然后在OO中重新打开HTML文件,几乎所有内容看起来都相同(例外:表格)。 但是,如果我在Firefox中打开HTML文件,则文本不正确。具体来说,在RTF中居中或右对齐的段落以及在OO 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 }

有人知道为什么定心不按预期工作?我将在另一天处理表问题。

2 个答案:

答案 0 :(得分:1)

这里有一个非常有用的链接来解决这个问题

http://user.services.openoffice.org/en/forum/viewtopic.php?f=30&t=46850

答案 1 :(得分:0)

我创建了一个脚本,用于在rtf到html转换后设置 center right 对齐。我用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;
}

<强> 爪哇

    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;
    }

如何使用:方法 stylizeAligment fixCenterRightAlign 接收字符串rtf及其html转换后,返回的是带对齐的html固定的。

我需要创建它,因为我使用javax.swing.text.rtf来将rtf转换为html。

在我的情况下,带下划线的文本也不起作用,所以要修复它只是放css样式:

  p span u {
    text-decoration: underline;
  }