使用docx4j的本机方法查找文本并应用字符样式

时间:2016-07-07 08:06:43

标签: r docx4j paragraph

我已经提到过这个链接:apply-style-to-specific-text-in-a-styled-paragraph-using-docx4j。我采取了另一种方法。 以下是我使用docx4j查找和应用字符样式的步骤:

  1. 使用书签
  2. 获取段落
  3. 将该段落中的游戏按字符分割为字符
  4. 在拆分运行中查找文本并应用字符样式。
  5. 例如,我在下面的文本中搜索文本表1:

    II< 1(极低风险组)。两组的人群特征和术后即刻不良事件如表1所示。在术前特征中,在极低风险患者中没有活动性心内膜炎,透析或既往心脏手术(重做)的情况。在比较风险组时,低风险患者年龄越大,女性患病率越高,体外循环时间越长,交叉钳夹时间越长,冠状动脉手术的分离程度低于极低风险患者。

    在拆分运行内容之前:

      

    < w:r w:rsidRPr =" 00F83849"> < W:RPR> < W:朗   瓦特:VAL ="的en-US" /> < / W:RPR> < W:T>&的EuroSCORE LT; / W:T>   < / W:R> < w:proofErr w:type =" spellEnd" /> < W:R t   瓦特:rsidRPr =" 00F83849"> < W:RPR> < w:lang w:val =" en-US" />   < / W:RPR> < w:t xml:space ="保留"> II< 1(非常   低风险群体)。人口特征和即时   两组术后不良事件见表1。   在术前特征中,没有活动的情况   心内膜炎,透析或先前的心脏手术(重做)非常   低风险患者。在比较风险组时,低风险患者是   年龄较大,女性患病率较高,体外循环较长   和交叉钳夹时间,以及较少孤立的冠状动脉手术   非常低风险的患者。< / w:t> < / W:R>

    分割后(我只是复制部分文字):

      

    < W:R>                   < W:RPR>                       < w:lang w:val =" en-US" />                   < / W:RPR>                   < w:t xml:space ="保留"> E< / w:t>               < / W:R>               < W:R>                   < W:RPR>                       < w:lang w:val =" en-US" />                   < / W:RPR>                   < w:t xml:space ="保留"> u< / w:t>               < / W:R>               < W:R>                   < W:RPR>                       < w:lang w:val =" en-US" />                   < / W:RPR>                   < w:t xml:space ="保留"> r< / w:t>               < / W:R>               < W:R>                   < W:RPR>                       < w:lang w:val =" en-US" />                   < / W:RPR>                   < w:t xml:space ="保留"> o< / w:t>               < / W:R>               < W:R>                   < W:RPR>                       < w:lang w:val =" en-US" />                   < / W:RPR>                   < w:t xml:space ="保留"> S< / w:t>               < / W:R>               < W:R>                   < W:RPR>                       < w:lang w:val =" en-US" />                   < / W:RPR>                   < w:t xml:space ="保留"> C< / w:t>               < / W:R>               < W:R>                   < W:RPR>                       < w:lang w:val =" en-US" />                   < / W:RPR>                   < w:t xml:space ="保留"> O< / w:t>               < / W:R>               < W:R>                   < W:RPR>                       < w:lang w:val =" en-US" />                   < / W:RPR>                   < w:t xml:space ="保留"> R< / w:t>               < / W:R>               < W:R>                   < W:RPR>                       < w:lang w:val =" en-US" />                   < / W:RPR>                   < w:t xml:space ="保留"> E< / w:t>               < / W:R>               < w:proofErr w:type =" spellEnd" />

    我能够提取" 表1 "使用以下代码:

    public static P ApplyCharStyleOccurBaseInParagraph(P p,ObjectFactory factory, String search,
            String CharStyle, boolean matchCase, int occurence) throws Exception 
    {
    
        String[] searchArray = search.split("(?!^)");
        int occurCount = 0;
    
        ClassFinder runs = new ClassFinder(R.class);
        new TraversalUtil(p,runs);
        ClassFinder texts = new ClassFinder(Text.class);
        new TraversalUtil(p,texts);
        StringBuilder sb = new StringBuilder();
    
        for (Object text : texts.results) 
        {
            sb.append(((Text)text).getValue());
        }
    
    
        if (sb.toString().contains(search)|| (!matchCase && sb.toString().toUpperCase().contains(search.toUpperCase()))) 
        {
            System.out.println("Strings Match !!");
    
            boolean cont = false;
            for (int i = 0; i <= (runs.results.size()) - searchArray.length; ++i)
            {
                boolean match = true;
                for (int c = 0; c < searchArray.length; ++c)
                {
                    R CurrRunNode = (R) runs.results.get(i + c);
                    String textElement = "";
                    String nextTextElement = "";
                    R nextRunNode = null;
                    int nextRunIndex = c + 1;
    
                    ClassFinder Currtext = new ClassFinder(Text.class);
                    new TraversalUtil(CurrRunNode,Currtext);
    
    
    
                    if (Currtext.results.size()> 0) 
                    {
                        for(Object txt : Currtext.results)
                        {
                            textElement += ((Text)txt).getValue();
                        }
                    }
    
                    if (textElement == "") 
                    {
                        ClassFinder currTempText = new ClassFinder(Text.class);
                        new TraversalUtil(CurrRunNode,currTempText);
                        if(CurrRunNode != null && currTempText.results.size() == 0)
                        {
                            i++;
                            c--;
                            continue;
                        }
                        else
                        {
                            match = false;
                            cont = true;
                            break;
                        }
                    }
    
                    if (textElement.equals(searchArray[c].toString())) 
                    {
                        logger.info("Match String run index :"+((ContentAccessor) ((R) runs.results.get(i + c)).getParent()).getContent().indexOf((R) runs.results.get(i + c)));
                        if(nextRunIndex < searchArray.length)
                        {
                            nextRunNode = (R) runs.results.get(i + nextRunIndex);
                            ClassFinder nextRuntext = new ClassFinder(Text.class);
                            new TraversalUtil(nextRunNode,nextRuntext);
    
                            if (nextRunNode != null && nextRuntext.results.size()> 0) 
                            {
                                /*For testing purpose*/
    
                                /*For testing purpose*/
                                for(Object txt1 : nextRuntext.results)
                                {
                                    nextTextElement += ((Text)txt1).getValue();
                                }
                            }
    
    
                            if(nextTextElement == "") {
                                //For testing purpose
                                if(nextRunNode != null && nextRuntext.results.size() == 0)
                                {                                   
                                    continue;
                                }
                                else
                                {
                                match = false;
                                cont = true;
                                break;
                                }
                            }
                            if (nextTextElement.equals(searchArray[nextRunIndex].toString()))
                            {
                                continue;
                            }
                            else
                            {
                                match = false;
                                cont = true;
                                break;
                            }
                        }
                        else
                        {
                        continue;
                        }
                    }
    
                    if (!matchCase && textElement.toUpperCase()
                            .equals(searchArray[c].toString().toUpperCase())) {
                        continue;
                    }
                    match = false;
                    cont = true;
                    break;
                }
    
    
                if (match) 
                {
                    if (occurence == occurCount) 
                    {
                        for (int c = 0; c < searchArray.length; c++) 
                        {
                            R CurrRunNode = (R) runs.results.get(i + c);
                            RPr runProps = CurrRunNode.getRPr();
    
                            if (runProps != null) 
                            {
                                if(runProps.getRStyle() != null)
                                {
                                    runProps.getRStyle().setVal(CharStyle);
                                }
                                else
                                {
                                    RStyle rstyle = factory.createRStyle();
                                    rstyle.setVal(CharStyle);
                                    runProps.setRStyle(rstyle);
                                }
                            }
                            else if (runProps == null) 
                            {
                                RPr rPr = factory.createRPr();
                                RStyle rstyle = factory.createRStyle();
                                rstyle.setVal(CharStyle);
                                rPr.setRStyle(rstyle);
                                CurrRunNode.setRPr(rPr);
                            }
                            /*
                             * Find and apply character style for the first
                             * occurence
                             */
                            cont = false;
                            /*For testing purpose*/
                            logger.info("char currRun"+c+": "+((ContentAccessor) (CurrRunNode).getParent()).getContent().indexOf(CurrRunNode)+XmlUtils.marshaltoString(CurrRunNode));
                        }
                    }
                    occurCount++;
                }
                if (!cont) 
                {
                    break;
                }
            }
        }
        return p;
    }
    

    上面的代码本身应该能够应用于找到的文本的字符样式。但它在这个w:r的分割形式

    中应用整个文本的字符样式
      

    &lt; w:r w:rsidRPr =&#34; 00F83849&#34;&gt; &LT; W:RPR&GT; &LT; W:朗   瓦特:VAL =&#34;的en-US&#34; /&GT; &LT; / W:RPR&GT; &lt; w:t xml:space =&#34;保留&#34;&gt; II   &LT; 1(极低风险组)。人口特征与   两组患者的术后即刻不良事件均显示于   表1.在术前特征中,没有任何病例   非常活跃的心内膜炎,透析或先前的心脏手术(重做)   低风险患者。在比较风险组时,低风险患者是   年龄较大,女性患病率较高,体外循环较长   和交叉钳夹时间,以及较少孤立的冠状动脉手术   非常低风险的患者。&lt; / w:t&gt; &LT; / W:R&GT;

    而不仅仅适用于这些w:r​​ s(运行):

      

    &LT; W:R&GT;                   &LT; W:RPR&GT;                       &lt; w:rStyle w:val =&#34; TableCitation&#34; /&gt;                       &lt; w:lang w:val =&#34; en-US&#34; /&gt;                   &LT; / W:RPR&GT;                   &lt; w:t xml:space =&#34;保留&#34;&gt; T&lt; / w:t&gt;               &LT; / W:R&GT;               &LT; W:R&GT;                   &LT; W:RPR&GT;                       &lt; w:rStyle w:val =&#34; TableCitation&#34; /&gt;                       &lt; w:lang w:val =&#34; en-US&#34; /&gt;                   &LT; / W:RPR&GT;                   &lt; w:t xml:space =&#34;保留&#34;&gt; a&lt; / w:t&gt;               &LT; / W:R&GT;               &LT; W:R&GT;                   &LT; W:RPR&GT;                       &lt; w:rStyle w:val =&#34; TableCitation&#34; /&gt;                       &lt; w:lang w:val =&#34; en-US&#34; /&gt;                   &LT; / W:RPR&GT;                   &lt; w:t xml:space =&#34;保留&#34;&gt; b&lt; / w:t&gt;               &LT; / W:R&GT;               &LT; W:R&GT;                   &LT; W:RPR&GT;                       &lt; w:rStyle w:val =&#34; TableCitation&#34; /&gt;                       &lt; w:lang w:val =&#34; en-US&#34; /&gt;                   &LT; / W:RPR&GT;                   &lt; w:t xml:space =&#34;保留&#34;&gt; l&lt; / w:t&gt;               &LT; / W:R&GT;               &LT; W:R&GT;                   &LT; W:RPR&GT;                       &lt; w:rStyle w:val =&#34; TableCitation&#34; /&gt;                       &lt; w:lang w:val =&#34; en-US&#34; /&gt;                   &LT; / W:RPR&GT;                   &lt; w:t xml:space =&#34;保留&#34;&gt; e&lt; / w:t&gt;               &LT; / W:R&GT;               &LT; W:R&GT;                   &LT; W:RPR&GT;                       &lt; w:rStyle w:val =&#34; TableCitation&#34; /&gt;                       &lt; w:lang w:val =&#34; en-US&#34; /&gt;                   &LT; / W:RPR&GT;                   &lt; w:t xml:space =&#34;保留&#34;&gt; &LT; / W:T&GT;               &LT; / W:R&GT;               &LT; W:R&GT;                   &LT; W:RPR&GT;                       &lt; w:rStyle w:val =&#34; TableCitation&#34; /&gt;                       &lt; w:lang w:val =&#34; en-US&#34; /&gt;                   &LT; / W:RPR&GT;                   &lt; w:t xml:space =&#34;保留&#34;&gt; 1&lt; / w:t&gt;               &LT; / W:R&GT;

    我也在这里复制我用于拆分运行的代码:

    public static P SplitRuns(P paragraph, ObjectFactory factory,WordprocessingMLPackage wordMLPackage,File outputFile) throws Exception
    {
        ClassFinder runs = new ClassFinder(R.class);
        new TraversalUtil(paragraph, runs);
        for (Object r : runs.results) 
        {
            R run = (R)r;
            ContentAccessor parent = (ContentAccessor)run.getParent(); 
            List<Object> childElements = getAllchildObj(run);
            /*For testing purpose*/
            /*For testing purpose*/
            if (childElements.size() > 0) 
            {
                logger.info("Origianl Run Index before splitting: "+parent.getContent().indexOf(run));
                for(Object child : childElements)
                {
                    int currentRunIndex = parent.getContent().indexOf(run);
                    if(child.getClass().getName() == "org.docx4j.wml.RPr")
                    {
                        continue;
                    }
                    if(child.getClass().getName() == "org.docx4j.wml.Text")
                    {
                        String[] textElementString = ((Text)child).getValue().split("(?!^)");
                        for(int i = 0; i <= textElementString.length - 1; i++)
                        {
                            currentRunIndex = parent.getContent().indexOf(run);
                            R newRun = factory.createR();
                            RPr runProps = factory.createRPr();
                            runProps = run.getRPr();
                            if(runProps != null)
                            {
                                newRun.setRPr(runProps);
                            }
                            Text t = factory.createText(); 
                            JAXBElement<org.docx4j.wml.Text> textWrapped = factory.createRT(t); 
                            t.setSpace("preserve");
                            t.setValue(textElementString[i]);
                            newRun.getContent().add(t);
    
                            /*For testing purpose*/
                            logger.info("Newly created run Index: " + currentRunIndex);
                            /*For testing purpose*/
    
                            parent.getContent().add(currentRunIndex, newRun);
                            parent.getContent().set(currentRunIndex, newRun);
    
                        }
                    }
                    else
                    {
                        currentRunIndex = parent.getContent().indexOf(run);
                        R newRun = factory.createR();
                        RPr runProps = factory.createRPr();
                        runProps = run.getRPr();
                        if(runProps != null)
                        {
                            newRun.setRPr(runProps);
                        }
                        newRun.getContent().add(child);
    
                        /*For testing purpose*/
    
                        logger.info("Newly created run Index: " + currentRunIndex);
    
                        /*For testing purpose*/
    
                        parent.getContent().add(currentRunIndex, newRun);
                        parent.getContent().set(currentRunIndex, newRun);
    
                    }
    
                }
            }
            logger.info("Original run Index before Deleting: " + parent.getContent().indexOf(run));
            parent.getContent().remove(run);
        }
        return paragraph;
    }
    

    有人可以帮我解决这个问题吗?

0 个答案:

没有答案