How do you underline text with dashedline in ITEXT PDF

后端 未结 1 659
情歌与酒
情歌与酒 2020-12-21 17:55

I have underlined \"Some text\" by

var  par = new Paragraph();
par.Add(new Chunk(\"Some text\", CreateFont(12, Font.UNDERLINE))); 
document.Add(par);
         


        
相关标签:
1条回答
  • 2020-12-21 18:48

    This answer tells you how to do it but unfortunately doesn't provide any code so I've provided it below.

    To the best on my knowledge there isn't a direct way to achieve this in iTextSharp by just setting a simple property. Instead, you need to use a PageEvent and manually draw the line yourself.

    First you need to subclass PdfPageEventHelper:

    private class UnderlineMaker : PdfPageEventHelper {
    }
    

    You then want to override the OnGenericTag() method:

    public override void OnGenericTag(PdfWriter writer, Document document, iTextSharp.text.Rectangle rect, string text) {
    }
    

    The text variable will hold an arbitrary value that you set later on. Here's a full working example with comments:

    private class UnderlineMaker : PdfPageEventHelper {
        public override void OnGenericTag(PdfWriter writer, Document document, iTextSharp.text.Rectangle rect, string text) {
            switch (text) {
                case "dashed":
                    //Grab the canvas underneath the content
                    var cb = writer.DirectContentUnder;
    
                    //Save the current state so that we don't affect future canvas drawings
                    cb.SaveState();
    
                    //Set a line color
                    cb.SetColorStroke(BaseColor.BLUE);
    
                    //Set a dashes
                    //See this for more details: http://api.itextpdf.com/itext/com/itextpdf/text/pdf/PdfContentByte.html#setLineDash(float)
                    cb.SetLineDash(3, 2);
    
                    //Move the cursor to the left edge with the "pen up"
                    cb.MoveTo(rect.Left, rect.Bottom);
    
                    //Move to cursor to the right edge with the "pen down"
                    cb.LineTo(rect.Right, rect.Bottom);
    
                    //Actually draw the lines (the "pen downs")
                    cb.Stroke();
    
                    //Reset the drawing states to what it was before we started messing with it
                    cb.RestoreState();
                    break;
            }
    
            //There isn't actually anything here but I always just make it a habit to call my base
            base.OnGenericTag(writer, document, rect, text);
        }
    }
    

    And below is an implementation of it:

    //Create a test file on the desktop
    var testFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "test.pdf");
    
    //Normal iTextSharp boilerplate, nothing special here
    using (var fs = new FileStream(testFile, FileMode.Create, FileAccess.Write, FileShare.None)) {
        using (var doc = new Document()) {
            using (var writer = PdfWriter.GetInstance(doc, fs)) {
                doc.Open();
    
                //Bind our helper class
                writer.PageEvent = new UnderlineMaker();
    
                //Create a new paragraph
                var p = new Paragraph();
    
                //Add a normal chunk
                p.Add(new Chunk("This is a "));
    
                //Create another chunk with an arbitrary tag associated with it and add to the paragraph
                var c = new Chunk("dashed underline test");
                c.SetGenericTag("dashed");
                p.Add(c);
    
                //Add the paragraph to the document
                doc.Add(p);
    
                doc.Close();
            }
        }
    }
    

    If you wanted to get fancy you could pass a delimited string to SetGenericTag() like dashed-black-2x4 or something and parse that out in the OnGenericTag event.

    0 讨论(0)
提交回复
热议问题