我需要使用索引和页码生成 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的正确方法先谢谢。
答案 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