首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Apache POI从OOXML中提取字体系列?

如何使用Apache POI从OOXML中提取字体系列?
EN

Stack Overflow用户
提问于 2020-04-20 20:00:20
回答 1查看 257关注 0票数 1

我正在尝试使用Apache POI提取应用于特定段落的字体样式。在my XWPFParagraph对象上,方法getStyle()返回null。

对第一个XWPFRun对象调用方法getCTR().getRPr().getRStyle()也会返回null。

在我的XWPFDocument对象上调用getStyle().getDocDefaults().getRPrDefault()方法将返回以下内容:

代码语言:javascript
复制
    <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文件中的内容:

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

回答 1

Stack Overflow用户

发布于 2020-04-20 23:19:28

如果问题是如何从*.docx文件系统中获取/word/theme/theme1.xml,那么如何解析它,然后从其中获取<a:minorFont><a:latin...,那么可以这样解决:

首先,使用OPCPackage的方法来获取包部分的/word/theme/theme1.xml

代码语言:javascript
复制
...
  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的方法来获取它的子元素。

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

完整示例:

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

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61322009

复制
相关文章

相似问题

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