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

时间:2017-09-20 17:43:16

标签: java apache-poi docx

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

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

我从此linkthis one.

获取此代码

1 个答案:

答案 0 :(得分:1)

我找到了答案:

我替换了这段代码并且有效:

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