首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >失去从RTF到HTML转换的居中属性

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

Stack Overflow用户
提问于 2012-05-11 20:45:03
回答 2查看 346关注 0票数 3

我正在尝试使用OO将RTF输入(从MS Word 2000)转换为HTML。如果我打开RTF文件,所有内容在屏幕上看起来都是正确的。如果我将其另存为HTML,然后在OO中重新打开HTML文件,几乎所有内容看起来都是一样的(例外:表)。但是,如果我在Firefox中打开HTML文件,则文本不正确。具体地说,在RTF中居中或右对齐的段落以及在OO中查看的段落现在都是左对齐的。

这很奇怪,因为HTML文件的文本是

代码语言:javascript
复制
<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>

“西方人”这门课是

代码语言:javascript
复制
P.western { font-size: 10pt; so-language: en-US }

有人知道为什么居中不能按预期工作吗?我改天再处理桌子的问题。网址:https://netsuite.folio3.com/

EN

Stack Overflow用户

发布于 2016-09-16 00:26:52

我创建了一个脚本来设置rtf到html转换后的中心对齐。我用javascript和Java写的。遵循以下代码:

两者都需要两个css类:

代码语言:javascript
复制
.wricent {
    text-align: center;
}
.wririgh {
    text-align: right;
}

JavaScript

代码语言: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

代码语言:javascript
复制
    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样式:

代码语言:javascript
复制
  p span u {
    text-decoration: underline;
  }
票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10551586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档