设置PDF文件的页面边距、页眉和页脚,避免重叠。

5
我需要在调整PDF页眉/页脚和文本区域方面得到一些帮助。第一页看起来还好,但之后就越来越糟了。是页眉和页脚侵入了现有的边距空间吗?
我想知道出了什么问题,并且要调整以下内容:
1.页面宽度 2.边距宽度 3.页眉 4.页脚 5.文本区域
我的页眉覆盖函数如下:
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技术。


OnStartPage 中添加内容是不被鼓励的。您应该使用 OnEndPageHTMLWorker 已经过时。您应该使用 XMLWorker。您为什么不在 new Document 中从一开始就设置最终页面大小,而是分别设置呢?请提供一个样例 PDF 输出。 - mkl
@mkl 我应该使用OnEndPage来设置页眉吗?我从各种教程的代码片段中编译了它。请帮帮我,我已经提供了我的 PDF 文件头的 3 页截图。 - divinediu
1
我应该在页眉中使用 OnEndPage 吗?是的,对于所有这样的内容操作,包括页眉、页脚、背景图像等等。我已经提供了我的 PDF 页眉的截图,它们看起来像你的 new Document 的顶部和底部边距参数太小了。 - mkl
@mkl 你看到了吗?第一页打印得很完美,第二页只是挤了一下,第三页被覆盖了。这是为什么呢?让我试着添加你要求我的内容。 - divinediu
@mkl,你能帮我写个教程吗?我需要在每一页上添加几行文本头。包括机构名称和联系方式。我看到了这个链接(http://forums.asp.net/t/1591421.aspx?iTextSharp+Add+image+to+page+header),但是我不太明白里面的内容。 - divinediu
1个回答

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个单位(比十个更多 加上 某些距离用于外观):

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

第一页看起来正常的原因可能是您的HTML以一些空白开始(至少就HTMLWorker而言如此)。
其他说明:
- 不建议在OnStartPage中添加内容。应该使用OnEndPage进行所有这样的内容、标题、页脚、背景图像等的操作。 - HTMLWorker已经被弃用。应该使用XMLWorker。 - 您为什么不在new Document中设置最终页面大小,而是单独设置呢?

非常感谢你那个出色的答案,太完美了!
  1. 当我在OnEndPage中添加标题内容时,会在pdfwriter.PageEvent = new Header();处引发错误:'iTextSharp.text.Header'不包含0个参数的构造函数。为什么会这样?
  2. 将改用XMLWorker
  3. 不,我没有任何理由这样做。我会修改它。
- divinediu
当我在OnEndPage上添加页眉内容时,它会在pdfwriter.PageEvent = new Header();上抛出错误:'iTextSharp.text.Header'不包含一个不带参数的构造函数 - 你不应该将pdfwriter.PageEvent设置为你的页面事件监听器吗?iTextSharp.text.Header很可能不是你的类。 - mkl
请问您能否给我提供一个教程的链接? - divinediu
iText网站的关键字页眉/页脚显示part1.chapter05.MovieHistory2、part1.chapter05.MovieCountries1和part2.chapter06.TwoPasses是很好的示例。相应的iTextSharp版本可以在这里找到e.g. - mkl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接