使用itextsharp和vb.net 2005为pdf文档创建具有pagenumbers的目录

时间:2011-04-07 08:43:50

标签: vb.net itextsharp


我正在尝试创建一个vb应用程序,它通过将xmls作为输入来创建pdf文档。我想获得以下列格式创建的pdf的目录

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

使用itextsharp的章节和章节功能,我能得到的只是

heading1  
  heading2  
heading3  

任何人都可以帮助我获取相应条目旁边的页码..!??

谢谢,
阿迪亚

2 个答案:

答案 0 :(得分:2)

这是C#中的代码,用于进一步解释Mark Storer上面提供的内容。

此代码段假定您循环遍历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);
        }

在构建文档的TOC protion之后,下一步是生成与TOC对应的实际内容。当您创建每个标题的实际页面时,您需要创建一个新的Chapter变量并将其添加到文档中。这将触发您将添加到OnChapter事件处理程序的自定义代码。

最后,在自定义页面eventhandler中,我们需要向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);

    }

我希望有所帮助!

答案 1 :(得分:0)

我很惊讶“Y页面X”这个问题尚未出现。但它显然没有,所以这里也是如此。

当您创建“标题”文本时,您还需要将PdfTemplate添加到TOC页面的“DirectContent”中,其中每个页码都会出现。

在PdfPageEvent类中,您需要使用OnChapterOnSection事件来确定当前页码,并将该数字写入该特定部分的PdfTemplate。

在这个问题中,您可以在C#中使用iTextSharp看到类似的内容:iTextSharp Creating a Footer Page # of #。你必须自己将它翻译成VB.net。他们不同于一个PdfTemplate,直到他们知道PDF中的页面总数,你会在TOC中为每个条目区分PdfTemplate,并在你知道他们在哪个页面时填写它们但是这个概念是一样的。