J'ai besoin de créer une table des matières avec des numéros de page, mais je ne sais pas comment. Format suivant:
heading1 ----------------page number subHeading1---------------page number subHeading2---------------page number heading2-----------------page number
3 Réponses :
Vous avez probablement mis en place cela vous-même par votre nom, mais j'ai fait un petit exemple moi-même pour des raisons d'exhaustivité.
Veuillez consulter le Createetoc Exemple. Il crée un fichier PDF avec du texte aléatoire: P>
Vous pouvez clairement voir les titres et le contenu sous les titres. Après avoir ajouté tout notre contenu, nous commençons une nouvelle page et nous ajoutons une table des matières: p>
Le tableau de la table de Le contenu est composé d'une série de paires de la valeur clé, où la clé est le titre et la valeur est le numéro de page. Nous créons cette liste dans un événement de page: p> Nous utilisons cette page d'événement comme ceci: p> Nous créons d'abord une instance de l'événement et que nous le déclarons à l'écrivain: p> Nous marquons les titres en utilisant setgenerictag () code>: p>
for (SimpleEntry<String, Integer> entry : entries) {
p = new Paragraph(entry.getKey());
p.add(dottedLine);
p.add(String.valueOf(entry.getValue()));
document.add(p);
}
Je comprend. C'est à partir d'ici Développeurs .itextpdf.com / Exemples / ColonneText-Exemples-IText5 / ...
Oui, c'est le code Java. Vous devez porter cet exemple à C #. Cela ne devrait pas être difficile car Itext pour Java et IText pour C # sont conservés en synchronisation. Ils ont une fonctionnalité identique (mais les noms de méthodes peuvent être légèrement différents: certaines méthodes Java sont des propriétés en C #; méthodes commencent par un caractère minuscule en Java; ils commencent par un caractère majuscule en C #). Les classes telles que la liste code>,
simpleTryry code>, ... sont des cours de Java pure, mais je suis sûr qu'il y a des classes similaires en C #.
Désolé, j'ai une question. Si j'ai une classe itextevents, où j'ai des événements (ONENDPAGE, OnOpendocument, OnCloseDocument). Devrais-je ajouter des événements surgénerictag dans cette classe (Itextevents) ou mieux créer une nouvelle classe (TOCOUVANTS)?
Vous pouvez choisir, vous pouvez l'ajouter à un événement existant déclaré à l'écrivain ou vous pouvez déclarer plus d'un événement à l'auteur. Tout ce qui fonctionne le mieux pour vous.
Merci beaucoup, je l'ai fait. J'ai plusieurs questions. Comment puis-je faire TOC au début du document et avec des liens vers des chapitres? Devrais-je utiliser des événements pour créer des liens vers des chapitres ou non? Par exemple, comment cela a fait dans votre livre. C'est ce que je clique sur le chapitre de ToC, je vais au chapitre dans le texte. Ou devrais-je utiliser une étiquette générique pour créer des liens? Quel est la voie devrait être utilisé? Ou peut-être devrait utiliser des moyens de cet article: développeurs.itextpdf.com/content/itext-7-building-blocks/.../a> (actions goto, destinations nommées). Merci d'avance.
Ce sont trop de questions pour répondre dans un commentaire. Publiez une nouvelle question pour chacun d'entre eux, mais soyez conscient: Beaucoup de ces questions seront marquées comme duplicata, et je ne serais peut-être pas disposée à leur répondre car vous n'avez pas accepté cette réponse, qui était la réponse complète à votre question initiale. . La réponse est en effet de créer des destinations nommées, mais vous vous référez une fois de plus à la documentation IText 7 pendant que vous souhaitez réellement une réponse iText 5.
D'accord. Merci. Je comprend.
Merci d'avoir accepté la réponse. En récompense pour faire la bonne chose, j'ai créé Un exemple qui crée des destinations nommées et des liens avec eux . Les pages de réorganisation peuvent être effectuées dans une seconde Go: développeurs.itextpdf.com/ Question / comment réorganiser-pages-pdf-file (il y a aussi un moyen de le faire tout en créant le document, mais ce n'est pas très élégant.)
Merci beaucoup! Tu es juste saint!
Merci pour l'exemple, j'en avais besoin de cela en C # et avec Multicolumn, donc j'ai réécrit cet exemple comme ci-dessous:
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; } } }
Pour tous les Savants d'IText qui ont fourni du code de travail ici: merci pour les grands exemples, mais ... Que faire lorsque la table des matières doit être placée avant le contenu? Les noms et liens peuvent être configurés à l'avance .. Mais les numéros de page du contenu ne sont pas encore disponibles lorsque le TOC doit être signalé,
Ce sniplift peut-il être récursif, le concept de base est le suivant: et créer une nouvelle méthode, ceci crée un hyperlinkand que vous pouvez facturer quand vous voulez p> espoir aide quelqu'un p> p>
J'utiliserais ITEXT 7 et utilisiez l'un des exemples de TOC de Chapitre 6 dans le ITEXT 7: Blocs de construction Tutoriel. Si vous ne pouvez pas passer à IText 7, veuillez ne pas utiliser
chapitre code> et
section code>. La prise en charge de ces objets a été supprimée. Gardez une trace de la structure de la TOC d'une manière différente. Utilisez
OnGenericTag () Code> Pour obtenir le numéro de page et la destination pouvant être de lier une ligne dans la TOC au contenu correspondant.
Notez que "peut-être que quelqu'un peut me donner exemple?" n'est généralement pas autorisé comme une question sur le débordement de la pile. Nous nous référons souvent à de telles questions "Pouvez-vous faire mon travail à la maison?" des questions. Vous êtes censé montrer ce que vous avez essayé et expliquer le problème technique que vous avez expérimenté. Demander à quelqu'un d'autre de faire votre travail à votre place n'est pas apprécié de la plupart des cotisants de dépassement de pile. Lorsque vous dites "J'ai lu quelques articles et je n'ai pas compris", vous devriez au moins lier à ces articles, sinon vous obtiendrez des réponses telles que: "En savoir plus d'articles".
Merci. J'ai mis à jour ma question.
J'utilise ITEXTSHARP 5.5.9. Puis-je utiliser le chapitre et la section?
Oui, tu peux, mais je ne le ferais pas.
Vous avez mis à jour votre question en faisant référence à un exemple sur ITEXT 7. Vous ne pouvez pas utiliser ce code dans iText 5. Le chapitre
code> fr
section code> classe n'existe pas dans IText sept.
Ensuite, comment puis-je changer "chapitre et section" dans mon document? Que devrais-je utiliser dans iTextShaRP pour créer TOC? est ongenerictag ()? Avec quoi?
Cela nous conduirait à beaucoup de répondre à toutes ces questions. Vous m'avez dit que vous avez lu «IText in Action». L'exemple rapide FOX Brown Fox à la page 127-129 explique comment utiliser
onGenerictag code> pour créer un index. Les mots qui devaient être mentionnés dans un indice (qui est similaire à un TOC), sont marqués d'une étiquette générique. Cela déclenche la méthode
onGenerictag () code> dans la classe code> indexevents code>. Dans la méthode
OnGenericTag () Code>, vous pouvez demander au
écrivain code> pour le numéro de page en cours et stockez ces informations dans l'index. Vous devez faire quelque chose de similaire.
Si j'étais vous, je créerais un
Toclevents Code> classe dans laquelle je stocke une liste des titres et des numéros de page. Je marquerais chaque titre à l'aide d'une balise générique et, ce faisant, renseignez la liste des titres dans la classe code> code>. Une fois que vous avez terminé d'écrire le document, je tire la liste des titres et des numéros de page à partir de la classe CODE> TOCLEVENTS CODE> et utilisez cette liste pour écrire la TOC. C'est si simple. Fais-le!
Merci beaucoup! Je vais le faire!
J'ai trouvé cette question qui vous donne une idée: Stackoverflow.com / Questions / 29092738 / ... Mais ce que vous avez à faire est beaucoup plus facile. Cet exemple est trop complexe pour ce que vous essayez d'atteindre.
Merci. J'ai trouvé cela, mais j'ai pensé que ce n'est pas exactement ce dont j'avais besoin.