我有了一些大胆的文本文档DOCX。出于某种原因,run.isBold()方法返回false虽然运行itsel为黑体。什么可能是这里的问题?
该代码我使用读取文件:
XWPFDocument document = new XWPFDocument(fis);
for(XWPFParagraph paragraphs: document.getParagraphs()){
for(XWPFRun run: paragraphs.getRuns()){
System.out.println(run.isBold());
System.out.println(run.text());
}
文件内容如下:
奇怪的是它得到的是在文件的beginnign标题(HANKELEPINGUÜLDTINGIMUSED)是勇敢的,但没有什么后大胆。
我检查你的test.docx
文件后,我可以告诉你以下几点:
文本“Üldosa”和“Mõisted”是不够大胆,因为他们被格式化大胆,但因为是全款在风格上“Heading2”。而“汇集”也文本未格式化大胆而特殊字符样式“保克什”应用。因此,有人曾用字Styles广泛。一点也不差。就像HTML而应使用CSS样式表,而不是直接在Word中使用同样的风格被格式化应该是首选。但当然也是问题,而分析是相同的。如果没有额外的解析样式表一个不能确定文本应如何呈现。不幸的是apache poi
不约需风格很在意,直到如今。
一个人怎么能来这种洞察力?一个*.docx
文件只是一个ZIP
存档。因此,我们可以将它解压缩,并会找到:
/word/document.xml
:
<w:r ...>
<w:rPr>
...
<w:b/>
...
</w:rPr>
<w:t>HANKELEPINGU ÜLDTINGIMUSED</w:t>
</w:r>
这是一个文本运行真正格式化大胆直接。
但
<w:p ...>
<w:pPr>
<w:pStyle w:val="Heading2"/>
<w:numPr><w:ilvl w:val="0"/><w:numId w:val="2"/></w:numPr>
...
</w:pPr>
<w:r ...>
<w:t>Üldosa</w:t>
</w:r>
</w:p>
这是具有段落样式“Heading2”,并且是自动编号。
那么,为什么是文字加粗?在/word/styles.xml
我们发现:
<w:style w:type="paragraph" w:styleId="Heading2">
<w:name w:val="heading 2"/>
<w:basedOn w:val="Normal"/>
...
<w:link w:val="Heading2Char"/>
...
</w:style>
这是段落样式“Heading2”可链接到字符样式“Heading2Char”。
<w:style w:type="character" w:customStyle="1" w:styleId="Heading2Char">
<w:name w:val="Heading 2 Char"/>
...
<w:link w:val="Heading2"/>
...
<w:rPr>
...
<w:b/>
...
</w:rPr>
</w:style>
这是字符样式“Heading2Char”被设置粗体。
要回答这个问题如何使用apache poi
必须知道哪个来自apache poi
的XWPF
类,org.openxmlformats.schemas.wordprocessingml.x2006.main.*
ooxml-schemas.*.jar
基地进行。因此,我们需要这方面的信息。不幸的是,没有任何可用的API
文件公开。因此,我们需要下载源和做javadoc
我们的自我。
那么下一步该怎么做?遍历段落和运行,你已经做了。但更多的每个段落试图让风格本款。如果有一个,把它和它的字符样式,并检查哪些设置提供。此外每次运行尝试获得字符样式此运行。如果有一个,把它和检查哪些设置提供。
下面的代码是这样做的,但只检查风格是否提供了大胆的设置。因此,它是真的没有完成,并使其完全真的会贵多少。
import java.io.FileInputStream;
import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;
public class ReadWordHavingStyles {
public static void main(String[] args) throws Exception {
XWPFDocument document = new XWPFDocument(new FileInputStream("test.docx"));
XWPFStyles styles = document.getStyles();
XWPFStyle style = null;
boolean isPBold = false;
boolean isRBold = false;
String boldReasonP = "";
String boldReasonR = "";
CTRPr cTRPr = null;
for(XWPFParagraph paragraph : document.getParagraphs()) {
isPBold = false;
boldReasonP = "";
String pStyleId = paragraph.getStyleID();
if (pStyleId != null) {
style = styles.getStyle(pStyleId);
if (style != null) {
String linkStyleId = style.getLinkStyleID();
style = styles.getStyle(linkStyleId);
if (style != null) {
cTRPr = style.getCTStyle().getRPr();
if (cTRPr != null) {
if (!cTRPr.isSetB()) {
isPBold = false;
} else {
STOnOff.Enum val = cTRPr.getB().getVal();
isPBold = !((STOnOff.FALSE == val) || (STOnOff.X_0 == val) || (STOnOff.OFF == val));
}
}
boldReasonP = " whole P is " + ((isPBold)?"":"not ") + "bold because of style " + linkStyleId;
}
}
}
if (!isPBold) boldReasonP = " P is not bold";
for(XWPFRun run : paragraph.getRuns()){
isRBold = isPBold;
boldReasonR = "";
cTRPr = run.getCTR().getRPr();
if (cTRPr != null) {
CTString rStyle = cTRPr.getRStyle();
if (rStyle != null) {
String rStyleId = rStyle.getVal();
style = styles.getStyle(rStyleId);
if (style != null) {
cTRPr = style.getCTStyle().getRPr();
if (cTRPr != null) {
if (!cTRPr.isSetB()) {
isRBold = false;
} else {
STOnOff.Enum val = cTRPr.getB().getVal();
isRBold = !((STOnOff.FALSE == val) || (STOnOff.X_0 == val) || (STOnOff.OFF == val));
}
}
boldReasonR = " run is " + ((isRBold)?"":"not ") + "bold because of style " + rStyleId;
}
}
}
if (!isRBold) boldReasonR = " run is not bold";
cTRPr = run.getCTR().getRPr();
if (cTRPr != null) {
if (cTRPr.isSetB()) {
STOnOff.Enum val = cTRPr.getB().getVal();
isRBold = !((STOnOff.FALSE == val) || (STOnOff.X_0 == val) || (STOnOff.OFF == val));
boldReasonR = " run is " + ((isRBold)?"":"not ") + "bold because of direct formatting";
}
}
System.out.println(run.text() + " isBold:" + isRBold + ":" + boldReasonP + boldReasonR);
}
}
document.close();
}
}