Как получить более конкретную информацию о шрифте, используя API-интерфейс poi XWPF? когда я использую один файл шрифта Calibri для проверки, fontName, который я получаю, равен нулю, а размер шрифта равен -1

Я использую этот код для тестирования одного файла шрифта Times New Roman и одного файла шрифта Calibri. Что касается Times New Roman, код может возвращать имя шрифта, но не размер шрифта. Что касается Calibri, я не могу получить ни имя шрифта, ни размер шрифта. Я не знаю, что случилось...

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;

import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;

public class test1 {

    public static void main(String[] args) {
        File file = new File("F:\\workspace\\zExtractInformationTest2\\bold.docx");
        XWPFDocument document;
        try {
            document = new XWPFDocument(new FileInputStream(file));
            List<XWPFParagraph> paraList = document.getParagraphs();

            for (int index = 0; index < paraList.size(); index++) {
                XWPFParagraph para = paraList.get(index);
                for (XWPFRun run : para.getRuns()) {
                    String font = run.getFontName();
                    int fontSize = run.getFontSize();
                    String text = run.text();
                    boolean isBold = run.isBold();
                    System.out.println("run:        "+font+"\t"+fontSize+"\t"+text+"\t"+isBold);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Скриншот Word

1 ответ

Это размер шрифта по умолчанию и проблема шрифта по умолчанию. Используйте следующий метод, чтобы получить текст макета по умолчанию напрямую, а затем узнать размер шрифта по умолчанию, шрифт по умолчанию и выравнивание по умолчанию.

private String[] getDefault() {
    String[] defaultAttibts = new String[] { "", "", "" };
    try {
        CTStyles styles = document.getStyle();
        if (styles.isSetDocDefaults()) {
            String docDefaults = styles.getDocDefaults().xmlText();
            if (docDefaults.contains("jc")) {
                docDefaults = docDefaults.substring(docDefaults.indexOf("jc"));
                docDefaults = docDefaults.substring(docDefaults.indexOf("=\"") + 2);
                defaultAttibts[0] = docDefaults.substring(0, docDefaults.indexOf("\"")).toUpperCase();
            }
            if (docDefaults.contains("sz")) {
                docDefaults = docDefaults.substring(docDefaults.indexOf("sz"));
                docDefaults = docDefaults.substring(docDefaults.indexOf("=\"") + 2);
                defaultAttibts[1] = docDefaults.substring(0, docDefaults.indexOf("\""));
            }
            if (docDefaults.contains("rFonts")) {
                docDefaults = docDefaults.substring(docDefaults.indexOf("rFonts"));
                docDefaults = docDefaults.substring(docDefaults.indexOf("=\"") + 2);
                defaultAttibts[2] = docDefaults.substring(0, docDefaults.indexOf("\""));
            }
        }
        CTStyle[] style = styles.getStyleArray();
        for (CTStyle s : style) {
            if (s.isSetDefault() && s.isSetType()) {
                if (s.getType().toString().equals("paragraph") && s.getDefault().toString().equals("1")) {
                    String text = s.xmlText();
                    if (defaultAttibts[1] == "") {
                        text = text.substring(text.indexOf("sz"));
                        text = text.substring(text.indexOf("=\"") + 2);
                        defaultAttibts[1] = text.substring(0, text.indexOf("\""));
                    }
                }
            }
        }
    } catch (XmlException | IOException e) {
        e.printStackTrace();
    }
    return defaultAttibts;
}
Другие вопросы по тегам