繁体   English   中英

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

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

我想通过Apache-poi为我的docx文件创建一种新样式,并且想将“ IRnazanin”设置为该样式的fontFamily(IRnazanin是一种波斯字体)。 我写的这个这个代码链接这一个 ,但每次我运行它时,Arial字体设置为段落这种风格(当我打开由Apache的POI创建的docx文件,这种风格的段落有“宋体(正文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;
        }

我从此链接 链接获得此代码

我找到答案:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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