проблема при рисовании линии в PDF-файле с использованием itextsharp - PullRequest
10 голосов
/ 24 февраля 2011

Я генерирую PDF-файл в asp.net c #, используя itextsharp.Я не могу нарисовать горизонтальную линию / линию вертикальной линии / пунктирную линию.

Я попытался нарисовать линию, используя следующий код, я не получаю ошибок, но линия также не отображается в файле PDF

    PdfContentByte cb = wri.DirectContent;
    cb.SetLineWidth(2.0f);   // Make a bit thicker than 1.0 default
    cb.MoveTo(20, pdfDocument.Top - 40f);
    cb.LineTo(400, pdfDocument.Top - 40f);
    cb.Stroke();

В чем проблема в коде. Это из-за положения координат xy?Я использовал грубые точки, чтобы узнать приблизительное положение в pdf, но в файле pdf строка никогда не появляется.

Вывод, который я ищу, показан на рисунке ниже. enter image description here

Ответы [ 7 ]

15 голосов
/ 09 апреля 2014
Paragraph p = new Paragraph(new Chunk(new iTextSharp.text.pdf.draw.LineSeparator(0.0F, 100.0F, BaseColor.BLACK, Element.ALIGN_LEFT, 1)));
document.Add(p);
5 голосов
/ 24 февраля 2011

Вы должны всегда устанавливать цвет для выполняемой операции, иначе вы не будете знать, что получите (это будет зависеть от того, какая предыдущая операция была выполнена).Попробуйте делать cb.setStrokeColor (255, 0, 0) (чисто красный), пока не получите свою строку там, где вы хотите.

4 голосов
/ 05 марта 2013

Рисование линий iTextsharp: -

Dim line1 As New iTextSharp.text.pdf.draw.LineSeparator(0.0F, 100.0F, BaseColor.Black, Element.ALIGN_LEFT, 1)
pdfDoc.Add(New Chunk(line1))
3 голосов
/ 24 февраля 2011

Вы уверены, что pdfDocument.Top возвращает значение?Я использовал PageSize.Width and PageSize.Height

iTextSharp.text.Document myDocument = new Document(PageSize.A4);
PdfContentByte contentByte = writer.DirectContent;
contentByte.SetLineWidth(1);
contentByte.MoveTo(0,  14);
contentByte.LineTo(myDocument.PageSize.Width,14);
contentByte.Stroke();
0 голосов
/ 07 октября 2014
Dim line1 As New iTextSharp.text.pdf.draw.LineSeparator(0.0F, 100.0F, BaseColor.Black, Element.ALIGN_LEFT, 1)
pdfDoc.Add(New Chunk(line1))
0 голосов
/ 01 августа 2013

Я закончил тем, что использовал комбинацию ответа, предоставленного плинтусом, с меньшим количеством сверху.Используя функции StringBuilder, вы можете заблокировать все, а затем вручную нарисовать линию, если у вас нет ячейки таблицы, которая занимает всю ширину тега TD вместе со словом.

StringBuilder chistHeader = new StringBuilder();
StringBuilder chistCourses = new StringBuilder();

HttpContext.Current.Response.ContentType = "application/pdf";
HttpContext.Current.Response.AddHeader("content-disposition", "inline;filename=CourseHistory.pdf");
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);

Document pdfDoc = new Document();
PdfWriter.GetInstance(pdfDoc, HttpContext.Current.Response.OutputStream);

pdfDoc.Open();

chistHeader = CourseHistoryHeader(Convert.ToInt32(hdUserID.Value), hdSystemPath.Value, "CourseHistory");
chistCourses = CourseHistoryCourses(Convert.ToInt32(hdUserID.Value), hdSystemPath.Value, "CourseHistory");



        //write header for the pdf
foreach (IElement element in HTMLWorker.ParseToList(new StringReader(chistHeader.ToString()), new StyleSheet()))
    {
        pdfDoc.Add(element);
    }

//have to manually draw a line this way as ItextSharp doesn't allow a <hr> tag....
iTextSharp.text.pdf.draw.LineSeparator line1 = new    iTextSharp.text.pdf.draw.LineSeparator(1f, 100f, BaseColor.BLACK, Element.ALIGN_LEFT, 1);
pdfDoc.Add(new Chunk(line1));

 //write out the list of courses
 foreach (IElement element in HTMLWorker.ParseToList(new StringReader(chistCourses.ToString()), new StyleSheet()))
    {
        pdfDoc.Add(element);
    }

 pdfDoc.Close();

 HttpContext.Current.Response.Write(pdfDoc);
 HttpContext.Current.Response.End();
0 голосов
/ 24 февраля 2011

Вы знаете, что в iTextsharp, система координат работает от нижнего левого угла вверх - вы уверены, что ваша линия не продвигается вниз по странице?

...