C# 设置PDF页边距、页眉和页脚而不重叠

C# 设置PDF页边距、页眉和页脚而不重叠,c#,asp.net,pdf,printing,itextsharp,C#,Asp.net,Pdf,Printing,Itextsharp,我需要一些帮助来调整文本区域旁边的PDF页眉/页脚。第一页看起来不错,但从那以后情况就更糟了。页眉和页脚是否占用了我现有的页边空白 我想知道哪里出了问题,我可以调整什么来设置以下值: 页宽 边距宽度 标题 页脚 文本区 我的标题覆盖功能如下: public partial class Header : PdfPageEventHelper { public override void OnStartPage(PdfWriter writer, Document doc) {

我需要一些帮助来调整文本区域旁边的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。

    您可以使用

    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(超过10倍,再加上一些外观距离):

    第一页看起来很好的原因很可能是HTML开头有一些空白(至少就
    HTMLWorker
    而言)

    补充说明:


    • 不鼓励在起始页的
      中添加内容。您应该使用
      OnEndPage
      对内容、页眉、页脚、背景图像等进行所有此类操作

    • HTMLWorker
      已被弃用。您应该使用
      XMLWorker

    • 您为什么不从一开始就设置最终页面大小(在
      新文档
      中),而是单独设置


    不鼓励在开始页面的
    中添加内容。您应该使用
    OnEndPage
    HTMLWorker
    已被弃用。您应该使用
    XMLWorker
    。您为什么不从一开始就设置最终页面大小(在
    新文档
    中),而是单独设置?请提供PDF输出示例。@mkl我应该使用
    OnEndPage
    作为标题吗?我从各种教程中的代码中编译了它。请帮我做这个?我已经在3页中提供了我的PDF页眉的屏幕截图。我是否应该使用
    onedpage
    作为页眉-是的,对于所有这些内容、页眉、页脚、背景图像的操作。。。我已经提供了我的PDF标题的3页截图-它们看起来像你的
    新文档的上下页边距参数太小了。@mkl你看到第一页打印得很好了吗,第二页刚刚被压缩,第三页被覆盖了吗?为什么会这样?让我尝试添加您要求我添加的内容。@mkl您能帮我完成一个教程吗?我需要为每一页的文本标题几行。机构名称和一些联系方式。我懂了。我真的不明白发生了什么事。非常感谢你的回答。太完美了!1.当我在
    OnEndPage
    上添加标题内容时,它在
    pdfwriter.PageEvent=newheader()上抛出一个错误
    “iTextSharp.text.Header”不包含接受0个参数的构造函数
    为什么会发生这种情况?2.将改用
    XMLWorker
    。3.不,我也没有理由这么做。将对此进行更改。当我在
    OnEndPage
    上添加标题内容时,它在
    pdfwriter.PageEvent=new header()上抛出一个错误:“iTextSharp.text.Header”不包含接受0个参数的构造函数-是否应将
    pdfwriter.PageEvent
    设置为页面事件侦听器
    iTextSharp.text.Header
    很可能不是你的类。你能给我链接到一个教程吗?iText站点显示part1.chapter05.MovieHistory2、part1.chapter05.MovieCountries1和part2.chapter06.twopass都是很好的示例。iTextSharp等同物可以找到,例如。
    Document pdfDoc = new Document(new Rectangle(288f, 144f), 10f, 10f, 50f, 30f);