主要内容在页脚部分PDF文档iTextSharp上重叠

时间:2014-01-08 12:37:35

标签: c# pdf-generation itextsharp

我正在使用itextsharp来创建文档。我在文档中创建了一个页脚部分,但页脚顶部的内容重叠。

我该如何解决这个问题?

我想在每个页面上添加页码,我该怎么办?

请检查此链接 Pdf document Image

 public class PdfNote
 {
    public int Create(int id, string path)
    {
        try
        {
            var file = path;

            if (System.IO.File.Exists(file))
                System.IO.File.Delete(file);

            Document document = new Document(PageSize.A4, 10, 10, 10, 10);

            var writer = iTextSharp.text.pdf.PdfWriter.GetInstance(document, new System.IO.FileStream(file, FileMode.Create));
            document.Open();

            writer.PageEvent = new Footer();

            // main content

            document.Close();

            return 1;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    public partial class Footer : PdfPageEventHelper
    {
        public override void OnEndPage(PdfWriter writer, Document doc)
        {
            PdfPTable fTbl = new PdfPTable(1);
            fTbl.TotalWidth = 550;
            fTbl.DefaultCell.Border = 0;

            PdfPTable line = new PdfPTable(1);
            line.DefaultCell.Border = 0;
            line.DefaultCell.BorderWidthBottom = 0.2f;
            line.DefaultCell.Padding = 5;
            line.AddCell("");

            fTbl.AddCell(line);

            PdfPTable footerTbl = new PdfPTable(3);
            footerTbl.TotalWidth = 550;
            footerTbl.DefaultCell.Column.Alignment = 1;
            footerTbl.HorizontalAlignment = Element.ALIGN_CENTER;
            footerTbl.DefaultCell.Border = 0;

            footerTbl.AddCell("Print Name:");
            footerTbl.AddCell("Signature:");
            footerTbl.AddCell("Date:");


            PdfPCell cell = new PdfPCell();
            cell.Padding = 20;
            cell.Border = 0;
            cell.BorderWidthBottom = 1;

            footerTbl.AddCell(cell);
            footerTbl.AddCell(cell);
            footerTbl.AddCell(cell);

            fTbl.AddCell(footerTbl);
            fTbl.AddCell(line);

            fTbl.WriteSelectedRows(0, -1, 15, 110, writer.DirectContent);

        }
    }
}

1 个答案:

答案 0 :(得分:7)

简而言之:

Document document = new Document(PageSize.A4, 10, 10, 10, 10);

你告诉iText几乎不留任何余量(例如用于页脚行)。因此,您的页脚就不足为奇了

fTbl.WriteSelectedRows(0, -1, 15, 110, writer.DirectContent);

经常与内容重叠。

因此,只需调整边距(尤其是底部边距)和页脚位置,使其不会相互重叠。

更详细:

您使用的Document构造函数记录为

/// <summary>
/// Constructs a new Document-object.
/// </summary>
/// <param name="pageSize">the pageSize</param>
/// <param name="marginLeft">the margin on the left</param>
/// <param name="marginRight">the margin on the right</param>
/// <param name="marginTop">the margin on the top</param>
/// <param name="marginBottom">the margin on the bottom</param>
public Document(Rectangle pageSize, float marginLeft, float marginRight, float marginTop, float marginBottom) {

因此,您的new Document(PageSize.A4, 10, 10, 10, 10)指示iText创建A4尺寸的文档,并在填充内容时仅在每个方向留下10个点的可用边距空间。 10点并不多。

您使用的PdfPTable表编写方法记录为

/**
 * Writes the selected rows to the document.
 *
 * @param rowStart the first row to be written, zero index
 * @param rowEnd   the last row to be written + 1. If it is -1 all the
 *                 rows to the end are written
 * @param xPos     the x write coordinate
 * @param yPos     the y write coordinate
 * @param canvas   the <CODE>PdfContentByte</CODE> where the rows will
 *                 be written to
 * @return the y coordinate position of the bottom of the last row
 */
public float WriteSelectedRows(int rowStart, int rowEnd, float xPos, float yPos, PdfContentByte canvas)

因此,您的代码

fTbl.WriteSelectedRows(0, -1, 15, 110, writer.DirectContent);

开始在坐标(15,110)处绘制表格---原点(0,0)在这里是文档的左下角。

因此,显然,页面内容区域和页脚区域在条带10中重叠&lt; = y&lt; = 110.您应该增加底部边距(Document构造函数中的最后一个参数)并减小y表绘图调用的位置不再重叠。