如何使用itextshap添加带页码的索引?

时间:2016-09-26 11:32:17

标签: c# jquery linq model-view-controller itext

我需要使用索引和页码生成 PDF 文件。我使用 ItextSharp 生成PDF。该文件可能包含数百页。 PDF文档中的数据将是动态数据。 这是我生成PDF的代码:

Rectangle rec2 = new Rectangle(PageSize.A4);
using (FileStream fs = new FileStream("D:/Sample1.pdf", FileMode.Create, FileAccess.Write, FileShare.None))
using (Document doc = new Document(PageSize.A4, 10f, 10f, 10f, 10f))
using (PdfWriter writer = PdfWriter.GetInstance(doc, fs))
{
       PdfPageEventHelper pageEventHelper = new PdfPageEventHelper();
       writer.PageEvent = pageEventHelper;
       doc.SetMargins(20, 20, 50, 50);
       doc.NewPage();
       doc.Open();
       var Content = writer.DirectContent;
       var pageBorderRect = new Rectangle(doc.PageSize);
       ………..
       ………………..
       ………………..
       ………..
       doc.Close();
}

添加 页码到生成的文档,我使用了以下方法

public void AddPageNumber(string BidNumber)
        {
            byte[] bytes = System.IO.File.ReadAllBytes(@"D:\Sample1.pdf");
            Font blackFont = FontFactory.GetFont("Arial", 12, Font.NORMAL, BaseColor.BLACK);
            Font boldfont = FontFactory.GetFont("Arial", 14, Font.BOLD, BaseColor.BLACK);
            using (MemoryStream stream = new MemoryStream())
            {
                PdfReader reader = new PdfReader(bytes);
                using (PdfStamper stamper = new PdfStamper(reader, stream))
                {
                    int pages = reader.NumberOfPages;
                   for (int j = 2; j <= pages; j++)
                    {
                        ColumnText.ShowTextAligned(stamper.GetUnderContent(j), Element.ALIGN_RIGHT, new Phrase((j - 1).ToString(), blackFont), 568f, 15f, 0);
                    }
                }
                bytes = stream.ToArray();
            }
            System.IO.File.WriteAllBytes(@"D:\newPDF.pdf", bytes);
        }

现在,我需要为此文档创建并添加索引与页码。这里我的问题是索引内容也是动态数据,它将是文档中的一些数据。 在搜索我的要求时,我找到了这个,

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++;
    }

我认为它对静态标头很有用。如何使用此代码在文档中添加带有页码的索引,或者使用 Itextsharp

生成PDF的正确方法

先谢谢。

1 个答案:

答案 0 :(得分:1)

请查看IndexWords示例。

在这个例子中,我们创建了一个IndexEvents类的实例,我们将该实例用作页面事件:

PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));
IndexEvents index = new IndexEvents();
writer.setPageEvent(index);

现在,当我们向文档添加内容时,我们会像这样标记要编制索引的单词:

Paragraph p = new Paragraph("Quick brown fox ");
p.add(index.create("jumps", "Jump"));
p.add(" over the lazy dog.");
document.add(p);

在这一段中,我们标记了“#34; jumps&#34;所以它在索引中列为&#34; Jump&#34;。

或者我们标记这样的字词:

p = new Paragraph();
p.add(index.create("Quick brown fox", "Fox", "quick, brown"));
p.add(new Chunk(" jumps over "));
p.add(index.create("the lazy dog.", "Dog", "lazy"));
p.add(index.create(" ", "Jumping"));
document.add(p);

在这种情况下,我们已经标记了&#34; Quick brown fox&#34;关键字&#34; Fox&#34;我们添加了一个规范:&#34; quick,brown&#34;。我们还添加了一个关键字&#34; Dog&#34;和规范&#34;懒惰&#34;。最后,我们还添加了一个关键词&#34; Jumping&#34;。

或者我们标记这样的字词:

p = new Paragraph();
p.add(new Chunk("The fox is "));
p.add(index.create("brown", "Color", "brown"));
p.add(index.create(" ", "Brown", "color", "see Color; brown"));
p.add(Chunk.NEWLINE);
document.add(p);

我们标记&#34; brown&#34;作为&#34;颜色&#34;我们指定&#34; brown&#34;。我们还添加了一个参考。当人们搜索或索引单词&#34; Brown&#34;时,我们会引用&#34; Color&#34;。

一旦我们添加了所需的所有内容,我们就会转到新页面,然后创建索引:

document.newPage();
// we add the index
document.add(new Paragraph("Index:"));
List<Entry> list = index.getSortedEntries();
for (Entry entry : list) {
    Paragraph in = new Paragraph();
    in.add(new Chunk(entry.getIn1()));
    if (entry.getIn2().length() > 0) {
        in.add(new Chunk("; " + entry.getIn2()));
    }
    if (entry.getIn3().length() > 0) {
        in.add(new Chunk(" (" + entry.getIn3() + ")"));
    }
    List<Integer> pages = entry.getPagenumbers();
    List<String> tags = entry.getTags();
    in.add(": ");
    for (int i = 0, x = pages.size(); i < x; i++) {
        Chunk pagenr = new Chunk(" p" + pages.get(i));
        pagenr.setLocalGoto((String) tags.get(i));
        in.add(pagenr);
    }
    document.add(in);
}

您可以在此处查看结果:index_words.pdf

enter image description here