减少iTextSharp上的段落线高度

时间:2012-02-01 10:44:22

标签: itextsharp line-breaks paragraph

当段落长度对于ColumnText的宽度太长时,如何减少换行符的高度?

我尝试了以下内容,因为我已经看到了其他问题,这些问题已经回答了这个问题:

p.Leading = 0

但这没有任何影响。

我还尝试将Leading增加到100以查看是否添加了更大的换行符,但都没有效果。

SpacingBefore / SpacingAfter也没有帮助:

p.SpacingBefore = 0
p.SpacingAfter = 0

我该如何减少这个?

2 个答案:

答案 0 :(得分:8)

使用表格时,需要在单元格上设置前导。但是,你会看到Leading属性是只读的,所以你需要使用SetLeading()方法,它取两个值,第一个是固定前导,第二个是乘法领导。根据{{​​3}}:

  

乘法基本上意味着,字体越大,前导越大。固定意味着与任何字体大小相同。

要将前导缩小至80%,请使用:

Dim P1 As New Paragraph("It was the best of times, it was the worst of times")
Dim C1 As New PdfPCell(P1)
C1.SetLeading(0, 0.8)

修改

抱歉,我看到了“专栏”,而我缺乏咖啡的大脑也进了桌子。

对于ColumnText,您应该可以正确使用Paragraph的主要值。

Dim cb = writer.DirectContent
Dim ct As New ColumnText(cb)

ct.SetSimpleColumn(0, 0, 200, 200)
Dim P1 As New Paragraph("It was the best of times, it was the worst of times")
''//Disable fixed leading
P1.Leading = 0
''//Set a font-relative leading
P1.MultipliedLeading = 0.8
ct.AddElement(P1)
ct.Go()

在我运行iTextSharp 5.1.2.0的机器上,这会产生两行文字,这些文字略微挤压在一起。

答案 1 :(得分:4)

好吧,你似乎偶然发现了文本模式复合模式之间的区别:

  • text mode =>使用“内联”块和短语对象调用ColumnText.AddText()
  • 复合模式=>使用段落,图像等“容器”对象调用ColumnText.AddText()

当您处于文字模式时,可以通过设置ColumnText属性在“段落”之间添加空格。

当您处于复合模式时,您可以像往常一样在“容器”对象之间添加空格 - 即如果不使用ColumnText那样。

这是一个显示两种模式::

之间差异的例子
int status = 0;
string paragraph ="iText ® is a library that allows you to create and manipulate PDF documents. It enables developers looking to enhance web- and other applications with dynamic PDF document generation and/or manipulation.";
using (Document document = new Document()) {
  PdfWriter writer = PdfWriter.GetInstance(document, STREAM);
  document.Open();
  ColumnText ct = new ColumnText(writer.DirectContent);
  ct.SetSimpleColumn(36, 36, 400, 792);
/*
 * "composite mode"; use AddElement() with "container" objects
 * like Paragraph, Image, etc
 */
  for (int i = 0; i < 4; ++i) {
    Paragraph p = new Paragraph(paragraph);
// space between paragraphs
    p.SpacingAfter = 0;
    ct.AddElement(p);
    status = ct.Go();
  }

/*
 * "text mode"; use AddText() with the "inline" Chunk and Phrase objects
 */
  document.NewPage();
  status = 0;
  ct = new ColumnText(writer.DirectContent);
  for (int i = 0; i < 4; ++i) {
    ct.AddText(new Phrase(paragraph));
// Chunk and Phrase are "inline"; explicitly add newline/break
    ct.AddText(Chunk.NEWLINE);
  }
// set space between "paragraphs" on the ColumnText object!
  ct.ExtraParagraphSpace = 6;
  while (ColumnText.HasMoreText(status)) {
    ct.SetSimpleColumn(36, 36, 400, 792);
    status = ct.Go();
  }  
}

现在您已经更新了代码并使用了AddElement()的复合模式,p.SpacingAfter = 0 删除段落之间的间距。或者将其设置为您想要的任何内容,而不是Paragraph.Leading