Настройка полей, верхних и нижних колонтитулов для PDF без наложения

Мне нужна помощь с настройкой верхнего / нижнего колонтитула PDF рядом с текстовыми областями. Первая страница выглядит хорошо, и от этого становится только хуже. Заголовок и нижний колонтитул поглощают мои существующие поля полей?

Я хотел бы знать, что идет не так, и что я могу настроить, чтобы установить следующее:

  1. Ширина страницы
  2. Ширина полей
  3. заголовок
  4. нижний колонтитул
  5. Текстовая область

поля

PDF

Моя функция переопределения заголовка выглядит так:

public partial class Header : PdfPageEventHelper
{
public override void OnStartPage(PdfWriter writer, Document doc)
    {
    PdfPTable headerTbl = new PdfPTable(2);
    headerTbl.SetWidths(new float[] { 4, 1 });
    headerTbl.TotalWidth = doc.PageSize.Width;

    iTextSharp.text.Image logo = iTextSharp.text.Image.GetInstance(HttpContext.Current.Server.MapPath("~/Images/view.gif"));
    logo.ScalePercent(5);
    PdfPCell cell = new PdfPCell(logo);
    cell.HorizontalAlignment = Element.ALIGN_RIGHT;
    cell.PaddingRight = 20;
    cell.Border = Rectangle.NO_BORDER;


    Font timesH = new Font(Font.FontFamily.TIMES_ROMAN, 20);
    Font times = new Font(Font.FontFamily.TIMES_ROMAN, 10);
    Chunk c1= new Chunk("THIS IS MY HEADER TEXT", timesH);
    Chunk c = new Chunk("\n", times);
    Chunk c2=new Chunk("PLEASE HAVE A NICE DAY", times);
    Phrase p = new Phrase();
    p.Add(c1);
    p.Add(c);
    p.Add(c2);
    PdfPCell cell2 = new PdfPCell(p);
    cell2.Border = Rectangle.NO_BORDER;

    headerTbl.AddCell(cell2);
    headerTbl.AddCell(cell);

    headerTbl.WriteSelectedRows(0, -1, 0, (doc.PageSize.Height - 10), writer.DirectContent);

    }
}

stringWrite является StringWriter, который содержит кучу данных. Больше ясности ЗДЕСЬ.

Я создаю PDF следующим образом:

    StringReader sr = new StringReader(stringWrite.ToString());
    Document pdfDoc = new Document(new Rectangle(288f, 144f), 10f, 10f, 30f, 30f);
    pdfDoc.SetPageSize(PageSize.A4.Rotate());
    HTMLWorker htmlparser = new HTMLWorker(pdfDoc);
    PdfWriter pdfwriter = PdfWriter.GetInstance(pdfDoc, HttpContext.Current.Response.OutputStream);
    pdfwriter.PageEvent = new Footer();
    pdfwriter.PageEvent = new Header();
    pdfDoc.Open();
    htmlparser.Parse(sr);
    pdfDoc.Close();
    HttpContext.Current.Response.Write(pdfDoc);
    HttpContext.Current.Response.End();

Я использую iTextSharp, C#, Asp.net в моем приложении.

1 ответ

Решение

Вы инициализируете создание документа с помощью

Document pdfDoc = new Document(new Rectangle(288f, 144f), 10f, 10f, 30f, 30f);

Особенно это означает, что вы резервируете 10 единиц слева и справа и 30 единиц сверху и снизу в качестве поля. Все оставшееся внутреннее пространство может быть использовано механизмами автоматического размещения контента.

Поэтому материал заголовка должен быть нарисован в этой области полей, иначе он может перекрываться с содержимым страницы.

Ваш код, с другой стороны, создает абзац с двумя строками, первая из которых имеет шрифт размером 20 единиц, вторая - шрифтом размером 10 единиц, и помещает его в таблицу. Таким образом, эта таблица имеет высоту более 30 единиц (объединенная высота этих двух строк плюс некоторое пространство между строками и, возможно, некоторые накладные расходы на ячейки таблицы). Тогда он рисует это так

headerTbl.WriteSelectedRows(0, -1, 0, (doc.PageSize.Height - 10), writer.DirectContent);

Таким образом, он начинается на 10 единиц ниже верхней части страницы. Вы определили верхнее поле страницы как 30. Таким образом, заголовок и содержимое страницы перекрываются полосой высотой более 10 единиц.

Таким образом, я бы предложил вам увеличить верхнее поле на 20 (более десяти плюс некоторое расстояние для его внешнего вида):

Document pdfDoc = new Document(new Rectangle(288f, 144f), 10f, 10f, 50f, 30f);

Причина, по которой первая страница выглядела нормально, скорее всего, в том, что ваш HTML начинается с некоторого пустого места (по крайней мере, до HTMLWorker обеспокоен).

Дополнительные замечания:

  • Добавление контента в OnStartPage обескуражен. Вы должны использовать OnEndPage для всех таких манипуляций с контентом, колонтитулами, фоновыми изображениями,...

  • HTMLWorker устарела. Вы должны использовать XMLWorker,

  • Есть ли причина, по которой вы не устанавливаете окончательный размер страницы с самого начала (в new Document) а вместо отдельно?

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