2015-07-15 2 views
1

Я пытаюсь использовать ItextSharp для создания pdf-файла из своего веб-приложения. , чтобы создать раздел заголовка на каждой странице моего pdf-файла, я создаю частичный класс, где я переопределяю метод OnEndPage. Все работает отлично, за одним исключением. Я сконструировал свой заголовок как таблицу с двумя столбцами, вначале я разместил логотип, а во втором я хочу показать некоторый текст на нескольких строках; поэтому во второй ячейке я создал подтаблицу с 1 столбцом и несколькими строками, но эта подтаблица всегда показывает внешнюю черную границу, которую я не могу удалить. Вот код:iTextSharp добавить подтаблицу без внешней границы

Public Overrides Sub OnEndPage(writer As PdfWriter, document As Document) 
    Dim headerIMG As Image = Image.GetInstance(HttpContext.Current.Server.MapPath(logoPath)) 
    Dim pageSize As Rectangle = document.PageSize 
    Dim headerTbl As New PdfPTable(2) 
    headerTbl.TotalWidth = 600 
    headerTbl.HorizontalAlignment = Element.ALIGN_CENTER 

    Dim cell As New PdfPCell(headerIMG) 
    cell.Border = 0 
    cell.PaddingLeft = 10 
    cell.PaddingBottom = 10 
    headerTbl.AddCell(cell) 

    Dim subTable = New PdfPTable(1) 
    For Each s As String In HeaderText 
     Dim myCell As New PdfPCell(New Paragraph(s)) 
     myCell.Border = 0 
     subTable.AddCell(myCell) 
    Next 
    subTable.DefaultCell.BorderWidth = 0 
    headerTbl.AddCell(subTable) 

    headerTbl.WriteSelectedRows(0, -1, 0, pageSize.GetTop(5), writer.DirectContent) 
End Sub 

Любой человек может помочь? Большое спасибо

+0

Я заменил 'OnStartPage' на' OnEndPage', потому что вы никогда не должны добавлять контент в метод 'OnStartPage' (как задокументировано). –

+0

Одно предложение и вопрос: можете ли вы избежать подтаблицы? Вместо подтаблицы просто добавьте контент в правую ячейку. 'DIm ss As String =" ": для каждого s As String В HeaderText: ss + = s + vbCrLf: Next: cell = New PdfPCell (новый абзац (ss)): cell.BorderWidth =" 0 ": headerTbl.AddCell (ячейка) '... просто хранить' ss' в правой ячейке. Если у вас должен быть подтаблик, то ничего. И, конечно же, это то, что написал Бруно. – nelek

ответ

1

В вашем коде несколько ошибок. Например: вы создаете новый объект headerIMG для каждой страницы. Это означает, что одни и те же байты изображения будут добавлены в PDF снова и снова. Вы должны объявить headerIMGснаружиOnStartPage метод.

Кроме того: вы определяете BorderWidth из 0. Как определено в спецификации PDF, ширина строки 0 не означает, что линии нет. Пожалуйста, ознакомьтесь с ISO-32000-1, раздел 8.4.3.2 «Ширина линии»:

Ширин линии 0 будет обозначать самую тонкую линию, которая может быть предоставлена ​​при разрешении устройства: 1 пиксель устройства широкого.

Если вы не хотите границу, скажите IText, что вы не хотите границу:

Dim headerIMG As Image = Image.GetInstance(HttpContext.Current.Server.MapPath(logoPath)) 

Public Overrides Sub OnStartPage(writer As PdfWriter, document As Document) 
    Dim pageSize As Rectangle = document.PageSize 
    Dim headerTbl As New PdfPTable(2) 
    headerTbl.TotalWidth = 600 
    headerTbl.HorizontalAlignment = Element.ALIGN_CENTER 

    Dim cell As New PdfPCell(headerIMG) 
    cell.Border = PdfPCell.NO_BORDER 
    cell.PaddingLeft = 10 
    cell.PaddingBottom = 10 
    headerTbl.AddCell(cell) 

    Dim subTable = New PdfPTable(1) 
    For Each s As String In HeaderText 
     Dim myCell As New PdfPCell(New Paragraph(s)) 
     myCell.Border = PdfPCell.NO_BORDER 
     subTable.AddCell(myCell) 
    Next 
    subTable.DefaultCell.Border = PdfPCell.NO_BORDER 
    headerTbl.AddCell(subTable) 
    headerTbl.WriteSelectedRows(0, -1, 0, pageSize.GetTop(5), writer.DirectContent) 
End Sub 

Вы видите, что я изменил?

Также, пожалуйста, прочитайте комментарий от nelek. Зачем вам нужен вспомогательный стол? Вы можете легко определить строку rowspan для ячейки, содержащей изображение.

+0

Спасибо за ответы! Используя постоянный PdfPCell.NoBorder, он работает так же, как и 0, так как он является значением constat = 0. Поэтому я использовал метод nelek, и теперь я получаю то, что искал. Спасибо вам большое за вашу помощь !!! – Diego

+0

Также благодарим за то, что он советовал мне создать объект логотипа только один раз для всех страниц – Diego

Смежные вопросы