Page 1 of 1

Font issue when using non standard

PostPosted: Tue Oct 02, 2012 7:31 am
by jallen
Hi Jason,

I am having an issue setting fonts. It only happens when I use a custom font 'MyFont'. The font was created using a font generating tool. If I use a standard font like Arial Bold no problem.
I am basically modifying the font on a content control using the following code:

Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
       
                // Build a new RFont object
                        org.docx4j.wml.ObjectFactory factory = new org.docx4j.wml.ObjectFactory();
                        RFonts rfonts = factory.createRFonts();
                        rfonts.setAscii(sFontName);
                        rfonts.setCs(sFontName);
                        rfonts.setHAnsi(sFontName);

                // Locate RPr object inside SdtElement 
                        SdtPr sdtPr = sdtElement.getSdtPr();
                        RPr rpr = null;
                        List<Object> aList = sdtPr.getRPrOrAliasOrLock();
                        for (int i = 0; i < aList.size(); i++) {
                                Object o1 = XmlUtils.unwrap(aList.get(i));     
                                if (o1 instanceof RPr) {
                                        rpr = (RPr) o1;
                                        break;
                                }
                        }
                       
                // Create new rpr if not found
                        if(rpr == null) {
                                rpr = factory.createRPr();
                                sdtPr.getRPrOrAliasOrLock().add(rpr);
                        }
                       
                // Set fonts   
                        rpr.setRFonts(rfonts);

                // Locate the run inside the SdtContect
                        R sdtR = null;
                        List<Object> sdtContent = sdtElement.getSdtContent().getContent();
                        for(Object o1 : sdtContent) {
                                if (o1 instanceof P) {
                                       
                                        List<Object> pContent = ((P)o1).getContent();
                                        for(Object o2 : pContent) {
                                                if(o2 instanceof R) {
                                                        sdtR = (R) o2;
                                                        break;
                                                }
                                        }
                                       
                                        break;
                                }
                        }
                       
                // locate the rpr object inside the run
                        rpr = sdtR.getRPr();
                       
                // Add RPr element if not found
                        if(rpr == null) {
                                rpr = factory.createRPr();     
                        }

                // Set the signature font
                        rpr.setRFonts(rfonts);
                        sdtR.setRPr(rpr);
 
Parsed in 0.017 seconds, using GeSHi 1.0.8.4


For some reason it sets all the fonts correctly on the rPr, but not on the run. when setting fonts on the run it only sets the w:cs correctly. w:ascii and w:hAnsi are not changed. Please see generated XML.

Syntax: [ Download ] [ Hide ]
Using xml Syntax Highlighting
<w:sdt>
  <w:sdtPr>
    <w:rPr>
      <w:rFonts w:ascii="MyFont" w:hAnsi="MyFont" w:cs="MyFont"/>
      <w:color w:val="000000"/>
      <w:sz w:val="96"/>
    </w:rPr>
    <w:alias w:val="Signature"/>
    <w:tag w:val="#Signature"/>
    <w:id w:val="37793253"/>
    <w:dataBinding w:xpath="//document//signature" w:storeItemID="{CD59EE91-E450-47CD-B5B3-94785B5201F1}"/>
    <w:text w:multiLine="1"/>
  </w:sdtPr>
  <w:sdtEndPr/>
  <w:sdtContent>
    <w:p w:rsidR="00D34090" w:rsidRDefault="00B4607B">
      <w:pPr>
        <w:spacing w:after="0" w:line="240" w:lineRule="auto"/>
      </w:pPr>
      <w:r>
        <w:rPr>
          <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman" w:cs="MyFont"/>
          <w:color w:val="000000"/>
          <w:sz w:val="96"/>
        </w:rPr>
        <w:t>A</w:t>
      </w:r>
    </w:p>
  </w:sdtContent>
</w:sdt>
 
Parsed in 0.003 seconds, using GeSHi 1.0.8.4


Any ideas?

Thanks,
Jeff

Re: Font issue when using non standard

PostPosted: Tue Oct 02, 2012 9:00 pm
by jason
That seems strange.

Can I suggest:

Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
                System.out.println(
                                XmlUtils.marshaltoString(sdtElement, true, true) );
 
Parsed in 0.013 seconds, using GeSHi 1.0.8.4


immediately after the code you posted, to confirm nothing is being changed later.

Re: Font issue when using non standard

PostPosted: Wed Oct 03, 2012 8:48 am
by jallen
You were right Jason. docx4j was setting the properties fine. They were being changed by Word when the document was open. I attempted to add the font to the font table but that did not work. There was something about the font being inside a content control that Word didn't like. After a lot of head banging I just decided to replace the entire content control with a new paragraph object.

Here is the new code for anyone interested:

Syntax: [ Download ] [ Hide ]
Using java Syntax Highlighting
                        // Get content control
                        SdtElement sdtElement = aSdtElement.get(nPos);
                        if(sdtElement == null) {return;}

                        // Create object factory
                        org.docx4j.wml.ObjectFactory factory = new org.docx4j.wml.ObjectFactory();

                        // Add font to fonts part
                        Font font = factory.createFontsFont();
                        font.setName(sFontName);
                        FontFamily family = factory.createFontFamily();
                        family.setVal("auto");
                        font.setFamily(family);
                        FontPitch pitch = factory.createFontPitch();
                        pitch.setVal(STPitch.VARIABLE);
                        font.setPitch(pitch);
                        CTUcharHexNumber charset = factory.createCTUcharHexNumber();
                        charset.setVal("02");
                        font.setCharset(charset);
                        FontTablePart fontPart = mainPart.getFontTablePart();
                        fontPart.getJaxbElement().getFont().add(font);

                        // Build a new RFont object
                        RFonts rfonts = factory.createRFonts();
                        rfonts.setAscii(sFontName);
                        rfonts.setCs(sFontName);
                        rfonts.setHAnsi(sFontName);

                        // Build a Color object
                        if(sFontColor.equals("") || sFontColor.equals("Black") || sFontColor.equals("Blank")) {
                                sFontColor = "000000";
                        } else if(sFontColor.equals("Blue")) {
                                sFontColor = "0000FF";
                        } else if(sFontColor.equals("Red")) {
                                sFontColor = "FF0000";
                        } else if(sFontColor.equals("Green")) {
                                sFontColor = "00FF00";
                        }
                        Color color = factory.createColor();
                        color.setVal(sFontColor);

                        // Create a new size object
                        if(sFontSize.equals("")) {sFontSize = "12";}
                        BigInteger nFontSize = new BigInteger(sFontSize);
                        nFontSize = nFontSize.multiply(BigInteger.valueOf(2));
                        HpsMeasure hps = factory.createHpsMeasure();
                        hps.setVal(nFontSize);

                        // #######  Par  #######
                        // Create ParaRPr
                        ParaRPr paraRPr = factory.createParaRPr();
                        paraRPr.setRFonts(rfonts);

                        // Create PPr
                        PPr ppr = factory.createPPr();
                        ppr.setRPr(paraRPr);

                        // Create new par              
                        org.docx4j.wml.P par;
                        par = factory.createP();
                        par.setPPr(ppr);

                        // #######  Run  ########
                        // Create Text
                        Text text = factory.createText();
                        text.setValue("A");

                        // Create new rpr if not found
                        RPr rpr = factory.createRPr();
                        rpr.setRFonts(rfonts);
                        rpr.setColor(color);
                        rpr.setSz(hps);

                        // Create run
                        org.docx4j.wml.R run;
                        run = factory.createR();
                        run.setRPr(rpr);

                        // Add Text
                        run.getContent().add(text);

                        // Add run to par
                        par.getContent().add(run);  

                        // Replace content control with new paragraph
                        List mainContent = wordMLPackage.getMainDocumentPart().getContent();
                        mainContent.set(aSdtIndex.get(nPos),par);
 
Parsed in 0.020 seconds, using GeSHi 1.0.8.4