我正在尝试创建一个vb应用程序,它通过将xmls作为输入来创建pdf文档。我想获得以下列格式创建的pdf的目录
heading1 ----------------page number heading2---------------page number heading3-----------------page number
使用itextsharp的章节和章节功能,我能得到的只是
heading1 heading2 heading3
任何人都可以帮助我获取相应条目旁边的页码..!??
谢谢,
阿迪亚
答案 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类中,您需要使用OnChapter
和OnSection
事件来确定当前页码,并将该数字写入该特定部分的PdfTemplate。
在这个问题中,您可以在C#中使用iTextSharp看到类似的内容:iTextSharp Creating a Footer Page # of #。你必须自己将它翻译成VB.net。他们不同于一个PdfTemplate,直到他们知道PDF中的页面总数,你会在TOC中为每个条目区分PdfTemplate,并在你知道他们在哪个页面时填写它们但是这个概念是一样的。