Как извлечь семейство шрифтов из OO XML, используя Apache POI? - PullRequest
1 голос
/ 20 апреля 2020

Я пытаюсь извлечь стиль шрифта, который применяется к указанному c абзацу с Apache POI . Метод getStyle() возвращает ноль для объекта my XWPFParagraph.

Вызов метода getCTR().getRPr().getRStyle() для первого XWPFRun объекта также возвращает ноль.

Вызов метода getStyle().getDocDefaults().getRPrDefault() для моего XWPFDocument объекта возвращает это:

    <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:ascii в теге w:rFonts. Однако в теге объявлен атрибут w:asciiTheme. Как извлечь информацию по данной теме с помощью Apache POI?

Стиль шрифта для этого примера определяется как тема minorHAnsi, и тему можно найти в файле theme1. xml. Но как, например, извлечь атрибут под тегом a:latin, используя Apache POI? Вот пример того, как это выглядит в файле theme1. 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 Ответ

0 голосов
/ 20 апреля 2020

Если вопрос заключается в том, как извлечь /word/theme/theme1.xml из файловой системы *.docx, как ее проанализировать, а затем извлечь из нее <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();
...

К сожалению, нет API документации org.openxmlformats.schemas.* publi c. Итак, чтобы получить такое, нам нужно скачать источники 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();
 }

}
...