Добавление новой строки в iTextSharp

Я пытался решить эту проблему какое-то время, но безрезультатно. У меня есть текст в iTextSharp Im, пытающийся надеть новую строку. Ive попытался использовать escape-символ \n, Environment.NewLine и document.Add(new Phrase(Environment.NewLine)) без каких-либо успехов. Так есть способ сделать это? Вот фрагмент моего кода Im, пытающегося сделать это (обратите внимание на строки, прокомментированные с помощью //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();

Любые предложения?

Изменить один:

По-прежнему не работает с document.Add(new Paragraph("\n"));. Я сделал это неправильно?

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();

Ответ 1

Есть два основных способа работы с текстом в iTextSharp, либо с помощью абстракций, таких как Paragraph и Phrase, либо путем выполнения команд вручную с помощью PdfContentByte. Абстракции будут обрабатывать такие вещи, как поля, разрывы строк и интервалы, в то время как ручной маршрут все зависит от вас. Вы не можете смешивать два, что вы делаете. Я настоятельно рекомендую использовать абстракции вместо ручного маршрута, если у вас нет необходимости в гранулированном управлении. Ниже приведен пример, показывающий оба.

Однако, чтобы ответить на ваш вопрос, необработанные команды PDF (которые вы используете) рисуете текст в определенных координатах x,y слева направо и не поддерживают концепцию "возврат" или "разрывы строк". Для этого вам нужно вручную переместить текущий текстовый курсор на новую строку. См. Приведенный ниже код для примера.

        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();
                }
            }
        }

Ответ 2

Попробуйте что-то вроде этого:

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

Ответ 3

document.Add(new Paragraph(" ")); работает хорошо для меня. Помните, оператор Paragraph автоматически добавляет фид строки. Все, что вам нужно сделать, это дать ему что-то сделать. В этом случае пробел будет отлично.

Ответ 4

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();

Ответ 5

С добавлением интервалов attriubtes вы можете точно установить высоту разрыва...

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

Ответ 6

Я просто пытаюсь использовать этот инструмент, и для добавления новой строки я просто добавил '\ r\n', и это действительно сработало. Как показано ниже.

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);

Затем добавлен абзац contentPtr в экземпляр моего документа.

Ответ 7

Я знаю, что это немного старо, но есть еще один способ. Вот немного из одного отчета, который я использовал.

            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)));

Как вы можете видеть, я сделал создание кусков. Это позволяет использовать "\n" для прерывных разрывов строк.

Ответ 8

Это прекрасно работает для меня.

Dim chunkNewLine As Chunk = New Chunk(Chunk.NEWLINE)
Dim addressPhrase As New Phrase
addressPhrase.Add(chunkNewLine)

Ответ 9

Для меня это сработало так:

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

работал нормально, но места оказалось больше, чем я ожидал. поэтому я пошел с этим:

document.Add(new Paragraph(" "));

Результатом стало хорошее и равномерное пространство между моими компонентами.