我正在尝试使用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 }
有人知道为什么定心不按预期工作?我将在另一天处理表问题。
答案 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;
}