c# - 为 PDF 设置页边距、页眉和页脚而不重叠

标签 c# asp.net pdf printing itextsharp

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

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

  1. 页面宽度
  2. 边距宽度
  3. 标题
  4. 页脚
  5. 文本区域

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。

最佳答案

你初始化文档创建

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

这尤其意味着您要在左侧和右侧预留 10 个单位,在顶部和底部预留 30 个单位作为边距。自动内容布局机制可以使用整个剩余的内部空间。

因此,页眉 Material 必须绘制在该边距区域中,否则它可能会与页面内容重叠。

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

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

所以它从页面顶部下方 10 个单位开始。不过,您将首页页边距定义为仅为 30。因此,页眉和页面内容以超过 10 个单位高的 strip 重叠。

因此,我建议您将顶部边距增加 20(超过 10 再加上 一些看起来的距离):

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

第一页看起来没问题的原因很可能是您的 HTML 以一些空白开始(至少就 HTMLWorker 而言)。

补充说明:

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

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

  • 为什么您不从一开始就设置最终页面大小(在 new Document 中)而是单独设置?

关于c# - 为 PDF 设置页边距、页眉和页脚而不重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23284550/

相关文章:

c# - C#中的线程

c# - 根据文化信息使用正确的 ".resx"文件

c# - 从 SqlDataReader 获取 byte[]?

c# - 在 asp.net 中使用文本框拆分单词

css - ASP.NET DefaultButton 专注于页面加载

python - PyPDF2:在内存中连接pdf

javascript - 如何使 form.submit 在 Javascript 引用中分隔发布数据的名称和值

c# - 快速构建整数前导 0 的字符串的方法?

php - CakePdf 生成奇怪的代码而不是 pdf

java - 如何打开 PDF 文件