设置PDF的边距,页眉和页脚而不重叠

div*_*diu 5 c# printing pdf asp.net itextsharp

我需要一些帮助来调整我的PDF页眉/页脚和我的文本区域.第一页看起来还不错,从那里开始变得更糟.页眉和页脚是否会占用我现有的边距空间?

我想知道出了什么问题以及我可以通过调整来设置以下内容:

  1. 页面宽度
  2. 边距宽度
  3. 页脚
  4. 文字区域

利润率

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

    }
}
Run Code Online (Sandbox Code Playgroud)

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();
Run Code Online (Sandbox Code Playgroud)

我在我的应用程序中使用iTextSharp,C#,Asp.net.

mkl*_*mkl 8

您使用初始化文档创建

Document pdfDoc = new Document(new Rectangle(288f, 144f), 10f, 10f, 30f, 30f);
Run Code Online (Sandbox Code Playgroud)

这尤其意味着您可以保留左右10个单位以及上下30个单位作为保证金.整个剩余的内部空间可以由自动内容布局机制使用.

因此,必须在该边缘区域绘制标题材料,否则它可能与页面内容重叠.

另一方面,您的代码创建了一个包含两行的段落,第一行设置为20个单位字体,第二个设置为10个单位字体,并将其包装在表格中.因此,该表具有超过30个单位的高度(这两个行的组合高度加上一些行间空间以及可能的一些表格单元边缘开销).然后它就像这样画出来

headerTbl.WriteSelectedRows(0, -1, 0, (doc.PageSize.Height - 10), writer.DirectContent);
Run Code Online (Sandbox Code Playgroud)

所以它在页面顶部下方开始10个单元.但是,您将首页边距定义为仅为30.因此,标题和页面内容重叠超过10个单位的条带.

因此,我建议你将上边距增加20(超过10加上一些距离):

Document pdfDoc = new Document(new Rectangle(288f, 144f), 10f, 10f, 50f, 30f);
Run Code Online (Sandbox Code Playgroud)

第一页看起来最可能的原因是你的HTML以一些空白空间开始(至少就所HTMLWorker涉及的而言).

补充说明:

  • OnStartPage不鼓励添加内容.你应该使用OnEndPage所有这些内容,页眉,页脚,背景图像的操作,...

  • HTMLWorker已弃用.你应该用XMLWorker.

  • 您有没有理由不从开头(in new Document)设置最终页面大小,而是单独设置?