Loses the centering attribute from RTF to HTML Conversion

I am trying to use OO to convert RTF input (from MS Word 2000) to HTML. If I open the RTF file, everything will look exactly on the screen. If I save it as HTML, then open the HTML file in OO again, almost everything looks the same (exception: table). However, if I open the HTML file in Firefox, the text will be incorrect. In particular, paragraphs that were centered or right-aligned in RTF and viewed in OO HTML are now completely left-handed.

This is strange because the text of the HTML file

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

and the class is "western"

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

Does anyone know why centering does not work as expected? The next day I will consider problems with the table.

+3
source share
2 answers

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

: stylizeAligment fixCenterRightAlign String rtf html, html .

, javax.swing.text.rtf rtf html.

, css:

  p span u {
    text-decoration: underline;
  }
0
source

All Articles