Как вы подчеркиваете текст пунктирной линией в ITEXT PDF

Я подчеркнул "Некоторый текст"

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

Можно ли просто подчеркнуть "какой-то текст" пунктирной линией (не абзац)?

Спасибо

1 ответ

Решение

Этот ответ говорит вам, как это сделать, но, к сожалению, не предоставляет никакого кода, поэтому я предоставил его ниже.

Насколько я знаю, в iTextSharp нет прямого способа добиться этого, просто установив простое свойство. Вместо этого вам нужно использовать PageEvent и вручную нарисуйте линию.

Сначала вам нужно создать подкласс PdfPageEventHelper:

private class UnderlineMaker : PdfPageEventHelper {
}

Затем вы хотите переопределить OnGenericTag() метод:

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

text переменная будет содержать произвольное значение, которое вы установите позже. Вот полный рабочий пример с комментариями:

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);
    }
}

И ниже - реализация этого:

//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();
        }
    }
}

Если вы хотите получить фантазию, вы можете передать строку с разделителями SetGenericTag() лайк dashed-black-2x4 или что-то и разобрать это в OnGenericTag событие.

Другие вопросы по тегам