使用itextsharp(c#)将标题添加到PDF文件 - 只是新的章节页面

时间:2016-07-04 11:48:29

标签: c# itext

我的代码被阻止了,因为我无法在任何地方找到这个主题的答案。所以我想做的是在新的章节页面添加一个Header。我已经实现了这一点,但在添加需要两个或更多页面的新表时,我无法将标题添加到我想要的页面中。我有以下代码:

我的主要功能中的某处:

            document.NewPage();
            writer.PageEvent = null;
            addHeader(writer, document, chapter3, title3);
            addFooter(writer, document, chapter3, title3);
            table = createVariablesTable();                
            headerOffsetSpace(document);
            addTableHeader(table);
            addTableBody(table, firsPage);
            document.Add(table);

            document.NewPage();
            writer.PageEvent = null;
            addFooter(writer, document, chapter3, title3);
            table = createVariablesTable();
            addTableHeader(table);
            firstPage = false;
            addTableBody(table, firstPage);
            document.Add(table);

其中:

        private void addHeader(PdfWriter writer, Document document, String chapterText, String titleText)
    { 
        Font ArialBold = new Font(Font.FontFamily.HELVETICA, 24, Font.BOLD);
        Font ArialItalic = new Font(Font.FontFamily.HELVETICA, 24, Font.ITALIC);

        Chunk headerChapterChunk = new Chunk(chapterText, ArialItalic);
        Chunk headerTitleChunk = new Chunk(titleText, ArialBold);
        Phrase headerText = new Phrase();
        headerText.Add(headerChapterChunk);
        headerText.Add(headerTitleChunk);

        HeaderPageEvent headerEvent = new HeaderPageEvent() { header = headerText };
        writer.PageEvent = headerEvent;
    }

    private void addFooter(PdfWriter writer, Document document, String chapterText, String titleText)
    {
        Font TimesNewRomanNormal = new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL);
        Font TimesNewRomanItalic = new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.ITALIC);

        Chunk footerChapterChunk = new Chunk(chapterText, TimesNewRomanItalic);
        Chunk footerTitleChunk = new Chunk(titleText, TimesNewRomanNormal);
        Phrase footerText = new Phrase();
        footerText.Add(footerChapterChunk);
        footerText.Add(footerTitleChunk);

        FooterPageEvent footerEvent = new FooterPageEvent() { footer = footerText };
        writer.PageEvent = footerEvent;
    }

并且PageEvent类是:

class HeaderPageEvent : PdfPageEventHelper
    {
        float marginHorizontal = 42.6f;
        float marginTop = 777;
        float marginTopHeaderSeparator = 738.1f;
        float indentHeaderSeparator = 1.3f;
        float headerLeading = 27.6f;

        public Phrase header { get; set; }

        public override void OnEndPage(PdfWriter writer, Document document)
        {
            iTextSharp.text.Rectangle pageSize = document.PageSize;

            PdfContentByte cb = writer.DirectContent;

            ColumnText columnHeader = new ColumnText(cb);
            columnHeader.SetSimpleColumn(header, marginHorizontal, marginTop + headerLeading, pageSize.Width - 2 * marginHorizontal, 0, headerLeading, Element.ALIGN_LEFT);
            columnHeader.Go();

            ColumnText columnHeaderSeparator = new ColumnText(cb);
            Phrase headerSeparator = new Phrase(new Chunk(new iTextSharp.text.pdf.draw.LineSeparator(0.25f, 100.0f, BaseColor.BLACK, Element.ALIGN_LEFT, 0)));
            columnHeaderSeparator.SetSimpleColumn(headerSeparator, marginHorizontal - indentHeaderSeparator, marginTopHeaderSeparator, pageSize.Width - marginHorizontal, 0, 0, Element.ALIGN_LEFT);
            columnHeaderSeparator.Go();
        }
    }

    class FooterPageEvent : PdfPageEventHelper
    {
        float marginHorizontal = 42.6f;
        float indentFooterSeparator = 1.5f;
        float marginBottomFooter = 37.9f;
        float marginBottomFooterSeparator = 48.2f;

        float pageNumberEvenOffset = 35.4f;
        float pageNumberOddOffset = 28.4f;

        public Phrase footer { get; set; }

        Font TimesNewRomanNormal = new Font(Font.FontFamily.TIMES_ROMAN, 10, Font.NORMAL);

        public override void OnEndPage(PdfWriter writer, Document document)
        {
            iTextSharp.text.Rectangle pageSize = document.PageSize;

            PdfContentByte cb = writer.DirectContent;

            ColumnText columnFooterSeparator = new ColumnText(cb);
            Phrase footerSeparator = new Phrase(new Chunk(new iTextSharp.text.pdf.draw.LineSeparator(0.25f, 100.0f, BaseColor.BLACK, Element.ALIGN_LEFT, 0)));
            columnFooterSeparator.SetSimpleColumn(footerSeparator, marginHorizontal - indentFooterSeparator, 0, pageSize.Width - marginHorizontal + indentFooterSeparator, marginBottomFooterSeparator, 0, Element.ALIGN_LEFT);
            columnFooterSeparator.Go();

            ColumnText columnPageNumber = new ColumnText(cb);
            int pageN = writer.PageNumber;
            Phrase pageNumber = new Phrase(pageN.ToString(), TimesNewRomanNormal);

            ColumnText columnFooter = new ColumnText(cb);

            switch(pageN % 2)
            {
                case 0:
                    columnPageNumber.SetSimpleColumn(pageNumber, marginHorizontal, 0, pageSize.Width, marginBottomFooter, 0, Element.ALIGN_LEFT);
                    columnPageNumber.Go();

                    columnFooter.SetSimpleColumn(footer, marginHorizontal + pageNumberEvenOffset, 0, pageSize.Width, marginBottomFooter, 0, Element.ALIGN_LEFT);
                    columnFooter.Go();
                    break;

                case 1:
                    columnPageNumber.SetSimpleColumn(pageNumber, 0, 0, pageSize.Width - marginHorizontal, marginBottomFooter, 0, Element.ALIGN_RIGHT);
                    columnPageNumber.Go();

                    columnFooter.SetSimpleColumn(footer, 0, 0, pageSize.Width - marginHorizontal - pageNumberOddOffset, marginBottomFooter, 0, Element.ALIGN_RIGHT);
                    columnFooter.Go();
                    break;
            }
        }
    }

所以...像这样做我的代码,它可以正常工作。我将页眉和页脚事件添加到新章节页面。然后,我将事件设置为null并在下一页上再次添加页脚事件,对于后续页面,文档将始终具有页脚事件。这可以解决我的问题,但有时候" addTableBody"函数大于一页,因此文档自动添加新页面而不清除页面事件,因此页面需要显示的页面数量很多。谁能帮我?我只想将Header事件添加到新的章节页面。

提前致谢

1 个答案:

答案 0 :(得分:0)

HeaderPageEvent添加额外参数:

class HeaderPageEvent : PdfPageEventHelper
{
    boolean ignoreHeader = true;
    float marginHorizontal = 42.6f;
    float marginTop = 777;
    // rest of your code...
}

使用这样的额外参数:

public override void OnEndPage(PdfWriter writer, Document document)
{
    if (ignoreHeader) return;
    ignoreHeader = true;
    // rest of your code...
}

通过这样做,如果ignoreHeader的值为false,则告诉事件仅显示标题,如果它为假,则将其设置为{{1立即。

默认情况下,永远不会显示标题,这就是您想要的。您只想在需要时显示标题您可以通过将此方法添加到true来完成此操作:

HeaderPageEvent

您不再需要将页面事件设置为void ShowHeader() { ignoreHeader = false; } 。现在,您可以在每次要打开标题时触发null方法。

showHeader()

如果您希望标题显示在第一页上,则需要将HeaderPageEvent event = new HeaderPageEvent(); writer.PageEvent = event; // Add stuff, no header will be added event.ShowHeader(); document.NewPage(); // A header will be shown, but only on one page document.Add(table); 的默认值更改为ignoreHeader