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

时间:2014-04-25 05:04:32

标签: c# asp.net pdf printing itextsharp

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

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

  1. 页面宽度
  2. 保证金宽度
  3. 标题
  4. 页脚
  5. 文字区域
  6. margins

    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。更清晰HERE

    我按如下方式创建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 个答案:

答案 0 :(得分:8)

使用

初始化文档创建
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 一些距离看起来):

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

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

补充说明:

  • 不鼓励在OnStartPage中添加内容。您应该使用OnEndPage来处理内容,页眉,页脚,背景图片......

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

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