当前位置: 首页 > 知识库问答 >
问题:

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

酆鸿哲
2023-03-14

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

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

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

    <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属性。如何使用ApachePOI提取给定主题下的信息?

本例的字体样式定义为主题minorHAnsi,主题可以在主题1中找到。xml文件。但是,例如,我如何使用ApachePOI提取a:latin标记下的属性呢?以下是主题1中的示例。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>

共有1个答案

刘兴修
2023-03-14

如果问题是如何获得/word/theme/theme1。xml超出了*。docx文件系统,然后如何解析它,然后获取

首先使用OPCPackage的方法获取包部分/word/主题/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();
 }

}

 类似资料:
  • 假设一个特定的样式应用于一个段落。我想知道这种风格的字体系列是什么。我试着打开文件。我找不到许多样式的属性集。例如,考虑样式<代码>标题1>代码>。与此样式对应的OOXML是 在标记中,没有属性来提取字体系列。该样式的字体系列详细信息存储在哪里?如何将其提取出来,以便在java应用程序中使用?我正在使用ApachePOI解析文档。

  • 我使用Apache pdfbox来提取文本。我可以从pdf中提取文本,但我不知道如何知道这个词是否加粗???(代码建议很好!!!)下面是从pdf中提取纯文本的代码,效果很好。

  • 问题内容: 我正在使用Apache pdfbox提取文本。我可以从pdf中提取文本,但我不知道该单词是否为粗体?(代码建议会很好!!!)这是从pdf提取纯文本的代码,可以正常工作。 问题答案: 的结果是纯文本。因此,将其提取后为时已晚。但是,您可以覆盖某些方法,只允许根据您的意愿格式化的文本通过。 在这种情况下,您必须覆盖 在您的替代中,您检查所讨论的文本是否满足您的要求(包含有关所讨论文本的很多

  • 问题内容: 我有一个网页,可以用来上传文件。 现在,我需要检查文件类型是否正确(zip,jpg,pdf,…)。 我可以使用请求随附的mimeType,但我不信任用户,并且说我想确保没有人能够上传在.jpg中重命名的.gif文件。 我认为在这种情况下,我应该检查魔术号码。我发现 这是一个Java库,似乎可以实现“从魔术数字中提取模仿类型”的功能。 这是正确的解决方案还是您建议什么? 更新: 我已经找

  • 现在我有一个docx文件,我加载到 我可以看到存储在style中的不同样式的当前字体大小。通过做xml 我想用poi更新字体大小,所以我试了一下 但是,在完成上述代码后,如果我使用第一段代码检查文档的字体大小(object),字体大小仍然是原始值,而不是我想要设置的12。 对于如何解决这个问题,有什么建议吗?

  • 问题内容: 例如: 如何提取“ http://www.google.com”? (每个链接的格式都相同,即“ http://”) 问题答案: 可能有几种方法可以做到这一点,但最干净的方法是使用正则表达式 如果可以有多个链接,则可以使用类似于以下内容的链接