Question

After 2 years I just returned to do a few things with MigraDoc & PDFsharp. To make life easier I have created a helper function for styles and I wonder why this doesn't work as expected?

All font assignments work just fine: Font family, size and type as well as colors come out right. Also the links get created and they work, too.

But all paragraph styles are ignored. They are assigned to the new styles, as I can see in the debugger, but they are not rendered.

It is probably a rule about paragraphs and sections, which I don't know.

Can somebody enlighten me?

// all styles by name/definition
public string allStyles = "";

private string style(string styleName)
      {
          if (allStyles.IndexOf(" " + styleName + " ") < 0)  // the stylename is new, so we create it..
          {
                string style = styleName + "   ";
                string fontChar = style[0].ToString();
                string fs = "";
                if (style[1] >= '0' & style[1] <= '9') fs += style.Substring(1, 1);
                if (style[2] >= '0' & style[2] <= '9') fs += style.Substring(2, 1);
                if (style[3] >= '0' & style[3] <= '9') fs += style.Substring(3, 1);
                int fontSize = Convert.ToInt32(fs);
// now digits after position 2 may be ignored
// we use the rest of the stylename for the rest of the style details..
                string styleName2 = styleName.Substring(1);
// add base style to the document style cache       
                Style newStyle = document.AddStyle(styleName, "Normal");
// now we modify the new style..:
                newStyle.Font.Bold = styleName.IndexOf("B") >= 0;
                newStyle.Font.Italic = styleName.IndexOf("I") >= 0;
                if (fontChar == "A") newStyle.Font.Name = "Arial";                
// .. 25 more fonts omitted..
// ..
                if (styleName.IndexOf("a") >= 0) newStyle.Font.Color = MigraDoc.DocumentObjectModel.Colors.AntiqueWhite;
// .. 25 more colors omitted..
// ..
// .. here a a few ParagraphFormat styles, all of which don't work!!
                if (styleName2.IndexOf("L") >= 0) newStyle.ParagraphFormat.Alignment = ParagraphAlignment.Left;
                else if (styleName2.IndexOf("R") >= 0) newStyle.ParagraphFormat.Alignment = ParagraphAlignment.Right;
                else if (styleName2.IndexOf("C") >= 0) newStyle.ParagraphFormat.Alignment = ParagraphAlignment.Center;
                else if (styleName2.IndexOf("J") >= 0) newStyle.ParagraphFormat.Alignment = ParagraphAlignment.Justify;
                if (styleName2.IndexOf("____") >= 0) newStyle.ParagraphFormat.SpaceAfter = 15;
                else if (styleName2.IndexOf("___") >= 0) newStyle.ParagraphFormat.SpaceAfter = 10;
                else if (styleName2.IndexOf("__") >= 0) newStyle.ParagraphFormat.SpaceAfter = 6;
                else if (styleName2.IndexOf("_") >= 0) newStyle.ParagraphFormat.SpaceAfter = 3;

// add stylename to the collection string
                allStyles += "  " + styleName + "  ";
            }
// return the name after creating and modifying the style
            return styleName;                


// a plain FT output function           
        public void writeFT(Section currentSection, string text, string styl, bool newParagraph)
        {
            Paragraph currentParagraph;
            if (newParagraph) currentParagraph = currentSection.AddParagraph();
            else currentParagraph = currentSection.LastParagraph;
            currentParagraph.AddFormattedText(text, style(styl));
        }    



 // an function to output a hyperlink               
         public void writeLink(Section currentSection, string text, string link, string styl, bool newParagraph)
        {
            Paragraph currentParagraph;
            if (newParagraph) currentParagraph = currentSection.AddParagraph();
            else  currentParagraph = currentSection.LastParagraph;
            Hyperlink HL = currentParagraph.AddHyperlink(link, HyperlinkType.Bookmark);
            HL.AddFormattedText(text, style(styl));
        }               

 // and one for anchors

        public void writeAnchor(Section currentSection, string text, string anchor, string styl, bool newParagraph)
        {
            Paragraph currentParagraph;
            if (newParagraph ) currentParagraph = currentSection.AddParagraph();
            else currentParagraph = currentSection.LastParagraph;
            currentParagraph.AddFormattedText(   text, style(styl)); 
            currentParagraph.AddBookmark(anchor);
        }                


// an example call
            writeFT(somesection, "This should be BIG & BLUE ", "A16b",true);
            writeFT(somesection, "This should be BIG & RED  ", "A16r",true);
            writeFT(somesection, "GREEN but not spaced out", "A16g---___",true);
            writeFT(somesection, "This should be BIG & BLACK", "A16k",true);
            writeFT(somesection, "This should be BIG & BLUE ", "A16b",true);
            writeFT(somesection, "This should be BIG & BLUE ", "A16b",true);
Was it helpful?

Solution

To set Paragraph styles, just use currentParagraph.Style = style(styl);. You can add text using AddText() instead of AddFormattedText() if you want to use that style for the paragraph (and you can still call AddFormattedText() to add text with a different character format).

AddFormattedText only supports character formats (not paragraph formats). Logical as it is part of a paragraph.

Your API should take that into account.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top