I’ve been trying to solve this problem for a while now to no avail. I have some text in iTextSharp I’m trying to put on a newline. I’ve tried using the \\n
escape c
Try something like this:
document.Add(new Chunk("\n"));
With the addition of the spacing attriubtes, you can precisely set the height of the break...
var spacerParagraph = new Paragraph();
spacerParagraph.SpacingBefore = 4f;
spacerParagraph.SpacingAfter = 0f;
document.Add(spacerParagraph);
This works perfectly for me.
Dim chunkNewLine As Chunk = New Chunk(Chunk.NEWLINE)
Dim addressPhrase As New Phrase
addressPhrase.Add(chunkNewLine)
There's two main ways to work with text in iTextSharp, either through the abstractions like Paragraph
and Phrase
or by manually executing commands using a PdfContentByte
. The abstractions will handle things like margins, line breaks and spacing while the manual route is all up to you. You can't really mix the two which is what you are doing. I'd highly recommend using the abstractions instead of the manual route unless you have a specific need for granular control. Below is a sample showing both off.
But to answer your question specifically, raw PDF commands (which you are using) draw text at certain x,y
coordinates from left to right and they do not support the concept of "returns" or "line breaks". To do this you need to manually move the current text cursor to a new line. See the code below for a sample of that.
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();
}
}
}
document.Add(new Paragraph("\n"));
EDIT:
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();
Maybe it's an iText 7 thing (which is the version I am using), but the suggestions above did not work for me. What did was:
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(dest));
Document doc = new Document(pdfDoc);
Paragraph p = new Paragraph();
. . .
p.Add("WHEELWORK!");
p.Add("\n\n"); // break two lines
p.Add("Ezekiel's Vision");
p.Add("\n"); // break one line
. . .
doc.Add(p);