2017-07-28 79 views
0

我使用此代碼測試一個Times New Roman字體文件和一個Calibri字體文件。至於Times New Roman,代碼可以返回字體名稱而不是字體大小。至於Calibri,我無法獲取字體名稱或字體大小。我不知道發生了什麼錯誤發生了......我怎樣才能獲得更具體的字體信息使用poi XWPF API?當我使用一個Calibri字體文件進行測試時,我得到的fontName爲null,字體大小爲-1

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

+0

當我使用中文格式的默認字體大小時,代碼無法提取字體大小信息並返回-1。當我將文檔字體大小設置爲數字格式時,代碼可以獲得正確的字體大小。 當我使用任何其他字體,我真的可以得到字體信息。但是不管我如何將字體設置爲Calibri,代碼總是作爲字體提取結果返回null。 這可能會說明我上面所說的。 – 0x1309201

回答

0

這是一個默認的字體大小&默認字體的問題。使用該方法可以直接獲取默認佈局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; 
} 
+0

您可以將後綴更改爲.zip,打開壓縮文檔並找到styles.xml。您從此方法獲得的xml文本是該文件的摘錄。 – 0x1309201

相關問題