2017-09-20 271 views
0

我想通过Apache-poi为我的docx文件创建一个新样式,并且我想为此样式设置“IRnazanin”作为fontFamily(IRnazanin是一种波斯语字体)。我从linkthis one编写了这段代码,但是每次运行它时,Arial都会为这个样式的段落设置(当我打开由apache-poi创建的docx文件时,此样式的段落具有“Arial(Body CS )“主题字体的字体不是IRNazanin)。我应该怎么做才能解决它?而且字体大小也没有设置。如何为apache poi中的样式设置某种字体作为fontFamily?

XWPFDocument docx = new XWPFDocument(OPCPackage.open("8.docx")); 
XWPFStyles styles = docx.getStyles(); 
     String heading1 = "My Heading 1"; 
     String heading4 = "My Heading 4"; 
     addCustomHeadingStyle(docx, styles, heading1, 1, 36, "4288BC"); 
     addCustomHeadingStyle(docx, styles, heading4, 4, 20, "000000"); 
     XWPFParagraph paragraph = docx.createParagraph(); 
     paragraph.setStyle(heading4); 
     XWPFRun run = paragraph.createRun(); 
     run.setText("سلااااام!"); 

     List<XWPFParagraph> xwpfparagraphs = docx.getParagraphs(); 
     System.out.println(); 
     for (int i = 0; i < xwpfparagraphs.size(); i++) { 
      if (xwpfparagraphs.get(i).getText().equals("اول")) { 
       xwpfparagraphs.get(i).setStyle(heading1); 
       System.out.println("[email protected]#$%^&*()(*&^%$#@!"); 
      } 
      System.out.println("paragraph style id " + (i + 1) + ":" + xwpfparagraphs.get(i).getStyleID()); 
      if (xwpfparagraphs.get(i).getStyleID() != null) { 
       String styleid = xwpfparagraphs.get(i).getStyleID(); 
       XWPFStyle style = styles.getStyle(styleid); 
       if (style != null) { 
        System.out.println(xwpfparagraphs.get(i).getText()); 
        System.out.println("Style name:" + style.getName()); 
        if (style.getName().startsWith("heading")) { 
         //this is a heading 
         System.out.println("@@@@@@@@@@@@@@@"); 
        } 
       } 

      } 

     } 

     docx.write(docxOut); 

     private static void addCustomHeadingStyle(XWPFDocument docxDocument, XWPFStyles styles, String strStyleId, int headingLevel, int pointSize, String hexColor) { 

      CTStyle ctStyle = CTStyle.Factory.newInstance(); 
      ctStyle.setStyleId(strStyleId); 

      CTString styleName = CTString.Factory.newInstance(); 
      styleName.setVal(strStyleId); 
      ctStyle.setName(styleName); 

      CTDecimalNumber indentNumber = CTDecimalNumber.Factory.newInstance(); 
      indentNumber.setVal(BigInteger.valueOf(headingLevel)); 

      // lower number > style is more prominent in the formats bar 
      ctStyle.setUiPriority(indentNumber); 

      CTOnOff onoffnull = CTOnOff.Factory.newInstance(); 
      ctStyle.setUnhideWhenUsed(onoffnull); 

      // style shows up in the formats bar 
      ctStyle.setQFormat(onoffnull); 

      // style defines a heading of the given level 
      CTPPr ppr = CTPPr.Factory.newInstance(); 
      ppr.setOutlineLvl(indentNumber); 
      ctStyle.setPPr(ppr); 

      XWPFStyle style = new XWPFStyle(ctStyle); 

      CTHpsMeasure size = CTHpsMeasure.Factory.newInstance(); 
      size.setVal(new BigInteger(String.valueOf(pointSize))); 
      CTHpsMeasure size2 = CTHpsMeasure.Factory.newInstance(); 
      size2.setVal(new BigInteger("24")); 


      CTFonts fonts = CTFonts.Factory.newInstance(); 

      fonts.setAscii("IRnazanin"); 
      fonts.setHAnsi("IRnazanin"); 

      CTRPr rpr = CTRPr.Factory.newInstance(); 
      rpr.setRFonts(fonts); 
      rpr.setSz(size); 
      rpr.setSzCs(size2); 

      CTColor color = CTColor.Factory.newInstance(); 
      color.setVal(hexToBytes(hexColor)); 
      rpr.setColor(color); 
      style.getCTStyle().setRPr(rpr); 
      // is a null op if already defined 

      style.setType(STStyleType.PARAGRAPH); 
      styles.addStyle(style); 

     } 

     public static byte[] hexToBytes(String hexString) { 
      HexBinaryAdapter adapter = new HexBinaryAdapter(); 
      byte[] bytes = adapter.unmarshal(hexString); 
      return bytes; 
     } 

我从这个linkthis one.

+0

如果复制代码或整个答案(https://stackoverflow.com/a/36649411/461499)至少链接到它或解释它的来源是一个好习惯。其他人可以按照链接进行更深入的浏览。不要声称它是'这是我的代码' – RobAu

+0

你说得对。我只是忘了它。谢谢。你能帮我解决我的问题吗? @RobAu –

+0

请提供[最小,完整和可验证示例](https://stackoverflow.com/help/mcve)。这可能会促使我和其他人在这个问题上得到关注。你目前显示的混乱的代码不会这样做。 –

回答

1

我找到答案得到这个代码:

我将这段代码和它的工作原理:

CTFonts fonts = CTFonts.Factory.newInstance(); 
fonts.setAscii("IRnazanin"); 
fonts.setHAnsi("IRnazanin"); 
fonts.setCs("IRnazanin"); 
rpr.setRFonts(fonts); 
相关问题