简体   繁体   中英

How set some kinds of font as fontFamily for styles in apache poi?

I want to create a new style for my docx file by Apache-poi and I want to set "IRnazanin" as fontFamily for this style (IRnazanin is a kind of persian fonts). I wrote this code from this link and this one , but every time that I run it, Arial is set for paragraphs with this style (when I open docx file that is created by apache-poi, paragraphs with this style have "Arial (Body CS)" font from Theme font not IRNazanin). what should I do to fix it? And also fontsize is not set.

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

I get this code from this link and this one.

I found answer:

I replace this code and it works:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM