создание оглавления с номерами страниц для PDF-документа с использованием itextsharp и vb.net 2005 - PullRequest
1 голос
/ 07 апреля 2011


Я пытаюсь создать приложение vb, которое создает документы pdf, принимая xmls в качестве входных данных. Я хочу получить оглавление для файла pdf, создаваемого в следующем формате

heading1 ----------------page number  
  heading2---------------page number  
heading3-----------------page number  

используя главы и функции секций itextsharp, все, что я могу получить, это

heading1  
  heading2  
heading3  

Может кто-нибудь помочь мне получить номера страниц рядом с соответствующей записью ..! ??

Спасибо,
Адитья

Ответы [ 2 ]

2 голосов
/ 11 декабря 2012

Вот код на C # для дальнейшего объяснения того, что Марк Сторер предоставил выше.

В этом фрагменте предполагается, что вы перебираете xmlHeaders для построения раздела оглавления:

        PdfContentByte cb = writer.DirectContent;
        MyCustomPageEventHandler pageEventHandler

        foreach (string headerStr in xmlHeaders)
        {
            PdfTemplate currChapTemplate = cb.CreateTemplate(50, 50);


            Paragraph titlePhrase = new Paragraph();
            titlePhrase.Add(headerStr);
            titlePhrase.IndentationLeft = 150f;
            pdfDoc.Add(titlePhrase);

            float curY = writer.GetVerticalPosition(false);
            float x = 450;
            //here we add the template to the pdf content byte
            cb.AddTemplate(currChapTemplate, x, curY);

            //Now we have to send the template object to our custom eventhandler 
            //method that will store a template for each item in our TOC
            pageEventHandler.addChapTemplateList(currChapTemplate);
        }

После того, как вы построите содержание документа, следующим шагом будет создание фактического содержимого, соответствующего содержанию. Когда вы создаете фактическую страницу для каждого из заголовков, вам нужно будет создать новую переменную Chapter и добавить ее в документ. Это запустит пользовательский код, который вы добавите в обработчик событий OnChapter.

Наконец, в обработчике событий пользовательской страницы нам нужно добавить код к методу OnChapter и создать собственный метод для хранения списка шаблонов.

    int chapTemplateCounter = 0;
    public override void OnChapter(PdfWriter writer, Document document, float paragraphPosition, Paragraph title)
    {
        base.OnChapter(writer, document, paragraphPosition, title);

        BaseFont bfTimes = BaseFont.CreateFont(BaseFont.TIMES_ROMAN, BaseFont.CP1252, false);

        tableOfContentsTemplateList[chapTemplateCounter].BeginText();
        tableOfContentsTemplateList[chapTemplateCounter].SetFontAndSize(bfTimes, 12);
        tableOfContentsTemplateList[chapTemplateCounter].SetTextMatrix(0, 0);
        tableOfContentsTemplateList[chapTemplateCounter].ShowText("" + writer.PageNumber);
        tableOfContentsTemplateList[chapTemplateCounter].EndText();

        chapTemplateCounter++;
    }

Массив шаблонов:

    List<PdfTemplate> tableOfContentsTemplateList = new List<PdfTemplate>();
    public void addChapTemplateList(PdfTemplate chapTemplate)
    {

        tableOfContentsTemplateList.Add(chapTemplate);

    }

Надеюсь, это поможет!

0 голосов
/ 07 апреля 2011

Я удивлен, что этот вариант вопроса «Страница X из Y» еще не подошел.Но это явно не так, вот так.

Когда вы создаете текст «заголовка», вам также необходимо добавить шаблон PdfTemplate к «DirectContent» страницы оглавления, где будет отображаться каждый номер страницы.

В классе PdfPageEvent вам необходимо использовать события OnChapter и OnSection, чтобы определить номер текущей страницы, и записать это число в шаблон PDF для этого конкретного раздела.

Вы можетеувидеть что-то подобное, сделанное в C # с iTextSharp в этом вопросе: iTextSharp Создание страницы нижнего колонтитула # из # .Вам придется самостоятельно перевести его на VB.net.Они различают один шаблон PDF, пока не узнают общее количество страниц в PDF, где вы будете различать шаблон PDF для каждой записи в вашем оглавлении и заполнять их, когда будете знать, на какой странице они находятся ... ноконцепция та же самая.

...