C# 设置PDF页边距、页眉和页脚而不重叠
我需要一些帮助来调整文本区域旁边的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) {
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);