web-dev-qa-db-fra.com

Ajouter une nouvelle ligne dans iTextSharp

Cela fait un moment que je tente de résoudre ce problème sans succès. ITextSharp contient du texte que je tente d’ajouter à une nouvelle ligne. J'ai essayé d'utiliser le caractère d'échappement \n, Environment.NewLine et document.Add(new Phrase(Environment.NewLine)) sans succès. Alors, y a-t-il un moyen de faire cela? Voici le morceau de code dans lequel j'essaie de le faire (notez les lignes commentées avec //Doesn't work):

//Open the reader
PdfReader reader = new PdfReader(oldFile);
Rectangle size = reader.GetPageSizeWithRotation(1);
Document document = new Document(size);
// open the writer
FileStream fs = new FileStream(newFile, FileMode.Create, FileAccess.Write);
PdfWriter writer = PdfWriter.GetInstance(document, fs);
document.Open();

//Configure the content
PdfContentByte cb = writer.DirectContent;
// select the font properties
BaseFont bf = BaseFont.CreateFont("c:\\windows\\fonts\\calibri.ttf", BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
cb.SetColorFill(BaseColor.BLACK);
cb.SetFontAndSize(bf, 10);

//Write the text here
cb.BeginText();
text = "F\n";//Doesn’t work
document.Add(new Phrase(Environment.NewLine));//Doesn’t work
text += "o\n";
text += Environment.NewLine;//Doesn’t work
text += "o\n";
cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, text, 85, 311, 0);
cb.EndText();

//Create the new page
PdfImportedPage page = writer.GetImportedPage(reader, 1);
cb.AddTemplate(page, 0, 0);

//Close all streams
document.Close();
fs.Close();
writer.Close();
reader.Close();

Aucune suggestion?

Modifier un:

Ne fonctionne toujours pas avec document.Add(new Paragraph("\n"));. Est-ce que je l'ai mal fait?

cb.BeginText();
text = "F";
document.Add(new Paragraph("\n"));
text += "o";
document.Add(new Paragraph("\n"));
text += "o";
cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, text, 85, 311, 0);
cb.EndText();
12
Andrew De Forest

Il y a deux façons principales de travailler avec du texte dans iTextSharp, soit en utilisant des abstractions telles que Paragraph et Phrase, soit en exécutant manuellement des commandes à l'aide de PdfContentByte. Les abstractions gèrent des choses telles que les marges, les sauts de ligne et l’espacement, tandis que l’itinéraire manuel vous appartient. Vous ne pouvez pas vraiment mélanger les deux qui est ce que vous faites. Je recommande fortement d'utiliser les abstractions au lieu de la route manuelle, sauf si vous avez un besoin spécifique de contrôle granulaire. Vous trouverez ci-dessous un exemple montrant les deux.

Mais pour répondre spécifiquement à votre question, les commandes brutes PDF (que vous utilisez) dessinent le texte à certaines coordonnées x,y de gauche à droite et ne prennent pas en charge le concept de "retours" ou de "sauts de ligne". Pour ce faire, vous devez déplacer manuellement le curseur de texte actuel sur une nouvelle ligne. Voir le code ci-dessous pour un exemple.

        string outputFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "test.pdf");
        using (FileStream fs = new FileStream(outputFile, FileMode.Create, FileAccess.Write, FileShare.None)) {
            using (Document doc = new Document(PageSize.LETTER)) {
                using (PdfWriter writer = PdfWriter.GetInstance(doc, fs)) {
                    doc.Open();

                    //This creates two lines of text using the iTextSharp abstractions
                    doc.Add(new Paragraph("This is Paragraph 1"));
                    doc.Add(new Paragraph("This is Paragraph 2"));

                    //This does the same as above but line spacing needs to be calculated manually
                    PdfContentByte cb = writer.DirectContent;
                    cb.SaveState();
                    cb.SetColorFill(BaseColor.BLACK);
                    cb.SetFontAndSize(BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED), 12f);
                    cb.BeginText();
                    cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, "This is cb1", 20, 311, 0);
                    cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, "This is cb2", 20, 291, 0);//Just guessing that line two should be 20px down, will actually depend on the font
                    cb.EndText();
                    cb.RestoreState();
                    doc.Close();
                }
            }
        }
23
Chris Haas

Essayez quelque chose comme ça:

document.Add(new Chunk("\n"));
13
Pieter

document.Add(new Paragraph(" ")); fonctionne bien pour moi. N'oubliez pas que l'instruction Paragraph ajoute automatiquement un saut de ligne. Tout ce que vous avez à faire est de lui donner quelque chose à rendre. Dans ce cas, un espace fera l'affaire.

6
cjbarth
document.Add(new Paragraph("\n"));

MODIFIER:

cb.BeginText();
string text = "";
text = "F\n";           
text += "o\n";            
text += "o";
cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, text, 85, 311, 0);
cb.EndText();


//Create the new page
PdfImportedPage page = writer.GetImportedPage(reader, 1);
cb.AddTemplate(page, 0, 0);

Paragraph p = new Paragraph(text);
document.Add(p);

//Close all streams
document.Close();
fs.Close();
writer.Close();
reader.Close();
3
Kashif

Avec l'ajout des attributs d'espacement, vous pouvez définir avec précision la hauteur de la rupture ...

var spacerParagraph = new Paragraph();
spacerParagraph.SpacingBefore = 4f;
spacerParagraph.SpacingAfter = 0f;
document.Add(spacerParagraph);
2
spadelives

Je suis juste en train d'essayer cet outil et pour ajouter une nouvelle ligne, je viens d'ajouter '\ r\n' et cela a fonctionné . Comme ci-dessous.

String content01 = "Nulla condimentum dui lobortis risus viverra, eu pellentesque sem blandit.\r\nUt congue turpis quis sapien mollis, vitae rutrum mi consectetur. Integer maximus nisl sed tellus pharetra pharetra.";
Phrase contentPhrase = new Phrase(content01);
Paragraph contentPr = new Paragraph();
contentPr.Add(contentPhrase);

Puis ajouté le paragraphe contentPtr à mon instance de document.

0
El Bayames

Je sais que c'est un peu vieux, mais il y a encore un autre moyen. Voici un peu d'un rapport que j'ai utilisé. 

            var contents = new Paragraph();
            contents.Alignment = Element.ALIGN_CENTER;

            contents.Add(new Chunk(string.Format("{0} {1}\n", emp.FirstName, emp.LastName), new Font(baseFont, 11f, Font.BOLD)));
            contents.Add(new Chunk(string.Format("Dept: {0}\n", emp.Departments.Title), new Font(baseFont, 9f)));
            contents.Add(new Chunk(string.Format("Wk Ending:  {0}\n", _date), new Font(baseFont, 9f)));

Comme vous pouvez le constater, j'ai créé des morceaux. Cela vous permet d’utiliser "\ n" pour effectuer des sauts de ligne.

0
Pyromanci