Уменьшить высоту разрыва строки абзаца на iTextSharp - PullRequest
4 голосов
/ 01 февраля 2012

Как я могу уменьшить высоту разрыва строки, которая возникает, когда длина абзаца слишком велика для ширины ColumnText?

Я пробовал следующее, так как видел другие вопросы, которыеответил так:

p.Leading = 0

Но это никак не повлияло.

Я также попытался увеличить Leading до 100, чтобы посмотреть, добавлен ли разрыв строки большего размера,но ни одна из них не работает.

SpacingBefore / SpacingAfter тоже не помогает:

p.SpacingBefore = 0
p.SpacingAfter = 0

Как я могу уменьшить это?

Ответы [ 2 ]

8 голосов
/ 01 февраля 2012

При использовании таблицы вам нужно установить ведущую на самой ячейке. Однако вы увидите, что свойство Leading доступно только для чтения, поэтому вместо этого вам нужно будет использовать метод SetLeading(), который принимает два значения: первое - фиксированное, а второе - умноженное. Согласно этому посту здесь :

Умножение в основном означает, что чем больше шрифт, тем больше ведущий. Фиксированный означает одинаковое начисление для любого размера шрифта.

Чтобы сократить лидерство до 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)

EDIT

Извините, я увидел "Колонну", и мой мозг с недостатком кофе пошел к столам.

Для ColumnText вы должны быть в состоянии использовать начальные значения абзаца очень хорошо.

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, получаются две строки текста, которые слегка сдвинуты вместе.

4 голосов
/ 01 февраля 2012

Ну, кажется, вы наткнулись на разницу между текстовым режимом и композитным режимом :

  • текстовый режим => вызов ColumnText.AddText() с использованием «встроенных» объектов Chunk и Phrase.
  • составной режим => вызов ColumnText.AddText() с использованием объектов-контейнеров, таких как Paragraph, Image и т. Д.

Когда вы находитесь в текстовом режиме , вы добавляете пробел между «абзацами», устанавливая 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 WILL , удалите интервалы между абзацами. Или установите все, что вы хотите вместо Paragraph.Leading.

...