Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
677 views
in Technique[技术] by (71.8m points)

itextsharp - How do you underline text with dashedline in ITEXT PDF

I have underlined "Some text" by

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

It is possible underline just "Some text" with dashed line (not the paragraph)?

Thanks

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...