在iTextSharp中添加新行

时间:2012-05-25 14:25:46

标签: c# itextsharp newline

我一直试图解决这个问题一段时间但无济于事。我在iTextSharp中有一些文字我试图换一个换行符。我尝试使用\n转义字符Environment.NewLinedocument.Add(new Phrase(Environment.NewLine))但没有成功。有没有办法做到这一点?以下是我正在尝试执行此操作的代码(注意用//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();

10 个答案:

答案 0 :(得分:23)

在iTextSharp中使用文本有两种主要方法,可以通过ParagraphPhrase这样的抽象,也可以使用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();
                }
            }
        }

答案 1 :(得分:13)

尝试这样的事情:

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

答案 2 :(得分:7)

document.Add(new Paragraph(" "));对我很有用。请记住,Paragraph语句会自动添加换行符。你所要做的就是给它渲染一些东西。在这种情况下,空间就可以了。

答案 3 :(得分:3)

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

修改

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

答案 4 :(得分:2)

通过添加间距attriubtes,您可以精确设置断点的高度......

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

答案 5 :(得分:0)

我正在尝试使用此工具并添加新行,我刚刚添加了' \ 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添加到我的Document实例。

答案 6 :(得分:0)

我知道这有点旧,但还有另一种方式。以下是我用过的一份报告中的一点。

            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"预先形成换行符。

答案 7 :(得分:0)

这对我来说非常有效。

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

答案 8 :(得分:0)

对我来说,它像这样工作:

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

工作正常,但是空间比我预期的要大。所以我去了:

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

结果是在我的组件之间有一个良好且规则的空间。

答案 9 :(得分:0)

也许这是iText 7(这是我正在使用的版本),但是上面的建议对我不起作用。什么是:

sanitizeHTML(data.emailbody)