我需要一些帮助来调整我的 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/