tabla - generar pdf asp.net c#
Cómo crear una tabla de contenido en iTextSharp (2)
Probablemente lo haya implementado usted mismo por su nombre, pero yo mismo hice un pequeño ejemplo para completarlo.
Por favor, eche un vistazo al ejemplo CreateTOC . Crea un PDF con texto aleatorio:
Puede ver claramente los títulos y el contenido debajo de los títulos. Después de que hemos agregado todo nuestro contenido, comenzamos una página nueva, y agregamos una tabla de contenido:
La tabla de contenido está compuesta por una serie de pares clave-valor, donde la clave es el título y el valor es el número de página. Creamos esta lista en un evento de página:
public class TOCEvent extends PdfPageEventHelper {
protected List<SimpleEntry<String, Integer>> toc = new ArrayList<>();
@Override
public void onGenericTag(PdfWriter writer, Document document, Rectangle rect, String text) {
toc.add(new SimpleEntry(text, writer.getPageNumber()));
}
public List getTOC() {
return toc;
}
}
Usamos este evento de página así:
public void createPdf(String dest) throws IOException, DocumentException {
Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));
TOCEvent event = new TOCEvent();
writer.setPageEvent(event);
document.open();
for (int i = 0; i < 10; i++) {
String title = "This is title " + i;
Chunk c = new Chunk(title, titleFont);
c.setGenericTag(title);
document.add(new Paragraph(c));
for (int j = 0; j < 50; j++) {
document.add(new Paragraph("Line " + j + " of title " + i));
}
}
document.newPage();
document.add(new Paragraph("Table of Contents", titleFont));
Chunk dottedLine = new Chunk(new DottedLineSeparator());
List<SimpleEntry<String, Integer>> entries = event.getTOC();
Paragraph p;
for (SimpleEntry<String, Integer> entry : entries) {
p = new Paragraph(entry.getKey());
p.add(dottedLine);
p.add(String.valueOf(entry.getValue()));
document.add(p);
}
document.close();
}
Primero creamos una instancia del evento y lo declaramos al escritor:
TOCEvent event = new TOCEvent();
writer.setPageEvent(event);
setGenericTag()
los títulos usando setGenericTag()
:
String title = "This is title " + i;
Chunk c = new Chunk(title, titleFont);
c.setGenericTag(title);
document.add(new Paragraph(c));
Una vez que hemos terminado de agregar el contenido, obtenemos todas las entradas:
List<SimpleEntry<String, Integer>> entries = event.getTOC();
Revisamos esta lista y redactamos un Paragraph
para cada entrada:
for (SimpleEntry<String, Integer> entry : entries) {
p = new Paragraph(entry.getKey());
p.add(dottedLine);
p.add(String.valueOf(entry.getValue()));
document.add(p);
}
Nadie puede argumentar que esto fue difícil. La clase de evento toma menos de 10 líneas de código. Agregar soporte para subtítulos agregará un puñado de líneas, pero eso no debería ser difícil también. Se trata de construir una estructura de árbol e introducir alguna hendidura cuando sea necesario.
Necesito crear Table of Content con números de página, pero no sé cómo. Siguiente formato:
heading1 ----------------page number
subHeading1---------------page number
subHeading2---------------page number
heading2-----------------page number
Leí algunos artículos y no entendí. En particular, me refiero a este artículo, donde "Destinos con nombre" y "Acciones de GoTo" creo que es útil para mí, pero no sé cómo funciona en iTextSharp.
En mi código tengo pocos "Capítulo" y "Sección", y quiero tomarlo y crear TOC. Como lo entendí, necesito usar PdfPageEventHelper y OnChapter.
Gracias por el ejemplo, necesitaba esto en C # y con multicolumna, así que reescribí este ejemplo de la siguiente manera:
namespace GerarPDF
{
public class GerarPDF
{
public const String DEST = "results/example.pdf";
public GerarPDF()
{
FileInfo file = new FileInfo(String.Concat(AppDomain.CurrentDomain.BaseDirectory, @"/", DEST));
file.Directory.Create();
this.createPdf(file.FullName);
}
public void createPdf(String dest)
{
FileStream fs = new FileStream(dest, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);
Document document = new Document(PageSize.LETTER);
PdfWriter writer = PdfWriter.GetInstance(document, fs);
document.Open();
TOCEvent evento = new TOCEvent();
writer.PageEvent = evento;
for (int i = 0; i < 10; i++)
{
String title = "This is title " + i;
Chunk c = new Chunk(title, new Font());
c.SetGenericTag(title);
document.Add(new Paragraph(c));
for (int j = 0; j < 50; j++)
{
document.Add(new Paragraph("Line " + j + " of title " + i + " page: " + writer.PageNumber));
}
}
document.NewPage();
document.Add(new Paragraph("Table of Contents", new Font()));
Chunk dottedLine = new Chunk(new DottedLineSeparator());
List<PageIndex> entries = evento.getTOC();
MultiColumnText columns = new MultiColumnText();
columns.AddRegularColumns(72, 72 * 7.5f, 24, 2);
Paragraph p;
for (int i = 0; i < 10; i++)
{
foreach (PageIndex pageIndex in entries)
{
Chunk chunk = new Chunk(pageIndex.Text);
chunk.SetAction(PdfAction.GotoLocalPage(pageIndex.Name, false));
p = new Paragraph(chunk);
p.Add(dottedLine);
chunk = new Chunk(pageIndex.Page.ToString());
chunk.SetAction(PdfAction.GotoLocalPage(pageIndex.Name, false));
p.Add(chunk);
columns.AddElement(p);
}
}
document.Add(columns);
document.Close();
}
public class TOCEvent : PdfPageEventHelper
{
protected int counter = 0;
protected List<PageIndex> toc = new List<PageIndex>();
public override void OnGenericTag(PdfWriter writer, Document document, Rectangle rect, string text)
{
String name = "dest" + (counter++);
int page = writer.PageNumber;
toc.Add(new PageIndex() { Text = text, Name = name, Page = page });
writer.DirectContent.LocalDestination(name, new PdfDestination(PdfDestination.FITH, rect.GetTop(0)));
}
public List<PageIndex> getTOC()
{
return toc;
}
}
}
public class PageIndex
{
public string Text { get; set; }
public string Name { get; set; }
public int Page { get; set; }
}
}