我正在尝试使用Apache POI提取应用于特定段落的字体样式。在my XWPFParagraph对象上,方法getStyle()返回null。
对第一个XWPFRun对象调用方法getCTR().getRPr().getRStyle()也会返回null。
在我的XWPFDocument对象上调用getStyle().getDocDefaults().getRPrDefault()方法将返回以下内容:
<w:rPr>
<w:rFonts w:asciiTheme="minorHAnsi"/>
<w:sz w:val="22"/>
<w:szCs w:val="22"/>
<w:lang w:val="en-GB" w:eastAsia="en-US" w:bidi="ar-SA"/>
</w:rPr>其中在w:rFonts标记中没有w:ascii属性。但是,在标记中声明了一个w:asciiTheme属性。如何使用Apache POI提取给定主题下的信息?
本例的字体样式被定义为主题minorHAnsi,主题可以在teme1.xml文件中找到。但是,例如,我如何使用Apache POI提取a:latin标记下的属性?下面是一个示例,它来自teme1.xml文件中的内容:
<a:minorFont>
<a:latin typeface="Calibri"/>
<a:ea typeface=""/>
<a:cs typeface=""/>
<a:font script="Jpan" typeface="MS 明朝"/>
<a:font script="Hang" typeface="맑은 고딕"/>
<a:font script="Hans" typeface="宋体"/>
...
<a:font script="Viet" typeface="Arial"/>
<a:font script="Uigh" typeface="Microsoft Uighur"/>
<a:font script="Geor" typeface="Sylfaen"/>
</a:minorFont>发布于 2020-04-20 23:19:28
如果问题是如何从*.docx文件系统中获取/word/theme/theme1.xml,那么如何解析它,然后从其中获取<a:minorFont><a:latin...,那么可以这样解决:
首先,使用OPCPackage的方法来获取包部分的/word/theme/theme1.xml。
...
XWPFDocument document = new XWPFDocument(new FileInputStream("./WordExample.docx"));
OPCPackage oPCPackage = document.getPackage();
PackagePartName partName = PackagingURIHelper.createPartName("/word/theme/theme1.xml");
PackagePart themePart = oPCPackage.getPart(partName);
...然后,如果我们有这个PackagePart,就把它解析成一个org.openxmlformats.schemas.drawingml.x2006.main.ThemeDocument。然后使用org.openxmlformats.schemas.drawingml.x2006.main.ThemeDocument的方法来获取它的子元素。
...
ThemeDocument themeDocument = ThemeDocument.Factory.parse(themePart.getInputStream());
CTOfficeStyleSheet theme = themeDocument.getTheme();
CTBaseStyles themeElements = theme.getThemeElements();
CTFontScheme fontScheme = themeElements.getFontScheme();
CTFontCollection minorFont = fontScheme.getMinorFont();
CTTextFont latin = minorFont.getLatin();
...不幸的是,目前还没有公开的org.openxmlformats.schemas.*的API文档。因此,要获得这样的文档,我们需要下载ooxml-schemas的源代码(例如从https://repo1.maven.org/maven2/org/apache/poi/ooxml-schemas/1.4/下载),然后使用javadoc从源代码创建API文档。
完整示例:
import java.io.FileInputStream;
import org.apache.poi.xwpf.usermodel.*;
import org.apache.poi.openxml4j.opc.*;
import org.openxmlformats.schemas.drawingml.x2006.main.*;
public class WordGetThemeDocument {
public static void main(String[] args) throws Exception {
XWPFDocument document = new XWPFDocument(new FileInputStream("./WordExample.docx"));
OPCPackage oPCPackage = document.getPackage();
PackagePartName partName = PackagingURIHelper.createPartName("/word/theme/theme1.xml");
PackagePart themePart = oPCPackage.getPart(partName);
System.out.println(themePart);
ThemeDocument themeDocument = ThemeDocument.Factory.parse(themePart.getInputStream());
CTOfficeStyleSheet theme = themeDocument.getTheme();
CTBaseStyles themeElements = theme.getThemeElements();
CTFontScheme fontScheme = themeElements.getFontScheme();
CTFontCollection minorFont = fontScheme.getMinorFont();
CTTextFont latin = minorFont.getLatin();
System.out.println(latin);
String typeFace = latin.getTypeface();
System.out.println(typeFace);
document.close();
}
}https://stackoverflow.com/questions/61322009
复制相似问题