如何使用poi XWPF API获取更具体的字体信息?当我使用一个Calibri字体文件进行测试时,我得到的fontName为null,fontsize为-1

时间:2017-07-28 09:20:41

标签: java fonts ms-word apache-poi xwpf

我使用此代码测试一个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();
        }
    }
}

Screenshot of Word

1 个答案:

答案 0 :(得分:0)

这是默认字体大小&amp;默认字体问题。使用方法可以直接获取默认布局xml文本,然后就可以知道默认字体大小,默认字体和默认对齐方式。

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;
}