在 iTextSharp 中添加一个新行
本文关键字:一个 新行 iTextSharp 添加 | 更新日期: 2023-09-27 18:35:17
我一直在尝试解决这个问题一段时间,但无济于事。我在iTextSharp中有一些文本,我正在尝试放在换行符上。我尝试使用'n
转义字符、Environment.NewLine
和 document.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();
在 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();
}
}
}
尝试这样的事情:
document.Add(new Chunk("'n"));
document.Add(new Paragraph(" "));
对我来说效果很好。请记住,Paragraph
语句会自动添加换行符。您所要做的就是给它一些渲染的东西。在这种情况下,空格就可以了。
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();
通过添加间距属性,您可以精确设置中断的高度...
var spacerParagraph = new Paragraph();
spacerParagraph.SpacingBefore = 4f;
spacerParagraph.SpacingAfter = 0f;
document.Add(spacerParagraph);
它的工作原理是这样的:
document.Add(new Chunk("'n"));
工作正常,但空间比我预期的要大。 所以我选择了这个:
document.Add(new Paragraph(" "));
结果是我的组件之间有一个精细而规则的空间。
我只是在尝试这个工具,为了添加新行,我只是添加了"''r'",它确实有效。像下面这样。
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);
然后将段落内容PTR添加到我的文档实例中。
这有点旧,但还有另一种方法。这是我使用的一份报告中的一点。
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)));
如您所见,我所做的是创建块。这允许您使用"'"来执行换行符。
对我来说非常有效。
Dim chunkNewLine As Chunk = New Chunk(Chunk.NEWLINE)
Dim addressPhrase As New Phrase
addressPhrase.Add(chunkNewLine)
也许这是iText 7的东西(这是我正在使用的版本),但上面的建议对我不起作用。所做的是:
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);