代码之家  ›  专栏  ›  技术社区  ›  Atefeh Rashidi

如何将某些字体设置为apache poi中样式的fontFamily?

  •  0
  • Atefeh Rashidi  · 技术社区  · 7 年前

    link this one ,但每次我运行它时,都会为这种样式的段落设置Arial(当我打开由apache poi创建的docx文件时,这种样式的段落具有来自主题字体而不是IRNazanin的“Arial(Body CS)”字体)。我应该做什么来修复它?并且未设置字体大小。

    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("!@#$%^&*()(*&^%$#@!");
                }
                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;
            }
    

    我从这里得到这个代码 链接 this one.

    1 回复  |  直到 7 年前
        1
  •  2
  •   Atefeh Rashidi    7 年前

    我找到了答案:

    我替换此代码,它可以工作:

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