проблема с рисованием линии в файле pdf с помощью itextsharp

Я создаю файл PDF в asp.net С#, используя 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();

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

Результат, который я ищу, показан на изображении ниже. введите описание изображения здесь


person Ishan    schedule 24.02.2011    source источник
comment
На всякий случай: вы не пытаетесь записать строки в PDF для редактирования информации? Вам нужно будет фактически удалить текстовое содержимое под строками, иначе люди все равно смогут извлечь его из PDF.   -  person Rup    schedule 24.02.2011


Ответы (6)


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

person plinth    schedule 24.02.2011
comment
Работает на меня. Ты подтолкнул меня на это. - person ; 24.02.2011
comment
Ошибка: нет перегрузки для метода «SetColorStroke», который принимает «3» аргумента. - person Ishan; 28.02.2011
comment
Начиная с версии 5.3.2.0 вы можете использовать cb.SetColorStroke(new BaseColor(255,0,0)); - person Maciej; 13.09.2012

Вы уверены, что 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();
person JoR    schedule 24.02.2011

Рисование линии 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))
person lessly    schedule 05.03.2013

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

person Paddy    schedule 24.02.2011
comment
Да, я знаю, что в iTextsharp система координат работает от нижнего левого угла вверх, и да, я проверил всю страницу. - person Ishan; 24.02.2011

В итоге я использовал комбинацию ответа, предоставленного плинтусом, и меньше сверху. Используя функции 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();
person user1143550    schedule 01.08.2013

person    schedule
comment
Это не мой отрицательный голос, но разве это не идентично ответуless? Почему это лучше? - person Rup; 07.10.2014