iText C#精确文本显示

iText C#精确文本显示,c#,itext7,C#,Itext7,我试图在行首插入带有空格的精确文本,但是iText会吃掉第一个可见符号之前的所有空格(制表也不起作用) 我正在使用iText 7社区版 C#代码: 该代码将output.pdf文档中的文本显示为 Test Test Test Test 1 2 3 每行的第一个可见符号前没有任何制表符和空格 如何更改代码以获得 Test Test Test Test 1 2 3 在输出文档中?您应该使用块向段落添加文本 然后您应该设置选项卡设置并使用特定

我试图在行首插入带有空格的精确文本,但是iText会吃掉第一个可见符号之前的所有空格(制表也不起作用)

我正在使用iText 7社区版

C#代码:

该代码将output.pdf文档中的文本显示为

Test
Test
Test
Test   1 2      3
每行的第一个可见符号前没有任何制表符和空格

如何更改代码以获得

Test
    Test
  Test
        Test   1 2      3

在输出文档中?

您应该使用块向段落添加文本

然后您应该设置选项卡设置并使用特定的Chunk.tabing

p = new Paragraph();
p.setTabSettings(new TabSettings(56f));
p.add(Chunk.TABBING);
p.add(new Chunk("Hello World with tab."));
此示例位于代码示例中的

,(嵌入式)选项卡在
iTextSharp
5.xx.xx中也不起作用,尽管空格是受尊重的。正如您已经证明的,有一点令人惊讶的是iText7会在换行符后剥离空格。不确定您是否需要支持其中一种或两种,因此将给出一个单独处理每种情况的示例:

首先,保留选项卡:

Paragraph p = new Paragraph("Line 0\n")
    .AddTabStops(new TabStop(8f))
    // change to your needs  ^^
    .Add(new Tab())
    .Add("Line 1");
doc.Add(p);
第二,在换行后立即保留空格:

string[] lines = "0\n1\n    2\n        3\n".Split(
    new string[] { "\n" }, 
    StringSplitOptions.RemoveEmptyEntries
);
p = new Paragraph().AddStyle(
    new Style().SetFont(PdfFontFactory.CreateFont(FontConstants.COURIER))
);
foreach (var l in lines)
{
    if (Regex.IsMatch(l, @"^\s+"))
    {
        p.Add(" ")  // all spaces stripped, whether one or more characters
            .Add(l) // now leading whitespace preserved
            .Add("\n");
    }
    else
    {
        p.Add(l).Add("\n");
    }
}
doc.Add(p);
<>这是我第一次看/写<强>任何< /强> iTest7,所以可能有一种不同的更好的方式,我不认为这只是一种解决方法。奇怪的是,如果在换行符之后添加任意数量的空格字符,然后立即添加前面也有空格字符的字符串,则第一个调用会去掉空格,但第二个调用会保留空格

作为旁注,我马上注意到了一件事,并且非常喜欢这个新API,那就是您可以到处使用方法链接。:)

结果如下:

试试这个

Font bodyFont = FontFactory.GetFont("Times New Roman", 10, Font.NORMAL);
file.Directory.Create();
//Initialize PDF writer
PdfWriter writer = new PdfWriter(DEST);
//Initialize PDF document
PdfDocument pdf = new PdfDocument(writer);
// Initialize document
Document doc = new Document(pdf); 

doc.Add(new Paragraph("Test", bodyFont));
doc.Add(new Paragraph("    Test", bodyFont));
doc.Add(new Paragraph("  Test", bodyFont));
doc.Add(new Paragraph("        Test 1 2   2", bodyFont));
doc.Close();

你试过不间断空格(0xA0)吗?@mkl,是的,我试过在维基百科
段落p=新段落中找到的各种空格(“Test\r\tTest\r Test\n\u0020\u2000\u2001\u002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u202f\u205f\u2060\u3000\u0020\u0020\u0020\u00203”)但它不起作用。仍然是相同的结果,
段落.setFirstLineIndent(x)
会产生一个可接受的解决方案吗?
Font bodyFont = FontFactory.GetFont("Times New Roman", 10, Font.NORMAL);
file.Directory.Create();
//Initialize PDF writer
PdfWriter writer = new PdfWriter(DEST);
//Initialize PDF document
PdfDocument pdf = new PdfDocument(writer);
// Initialize document
Document doc = new Document(pdf); 

doc.Add(new Paragraph("Test", bodyFont));
doc.Add(new Paragraph("    Test", bodyFont));
doc.Add(new Paragraph("  Test", bodyFont));
doc.Add(new Paragraph("        Test 1 2   2", bodyFont));
doc.Close();