С iTextSharp, как выровнять контейнер текста по правому краю (но оставив отдельные строки по левому краю) - PullRequest
3 голосов
/ 12 января 2012

Я не знаю ширину текстов в текстовом блоке заранее, и я хочу, чтобы текстовый блок был выровнен по правому краю, как это, при этом отдельные строки выравнивались по левому краю:

                                Mr. Petersen      |
                                Elmstreet 9       |
                                888 Fantastic City|

(| обозначает правый край документа)

Это должно быть просто, но я не могу понять.

Я попытался поместить весь текст в абзаци установите параметр para.Alignment = Element.ALIGN_RIGHT, но это приведет к выравниванию отдельных строк по правому краю.

Я пытался поместить абзац в ячейку внутри таблицы и по правому краю, но эта ячейка просто беретполная ширина таблицы.

Если бы я мог просто создать контейнер, который бы занимал только необходимую ширину, я мог бы просто правильно выровнять этот контейнер, так что, возможно, это действительно мой вопрос.

1 Ответ

10 голосов
/ 12 января 2012

Просто установите свойство Paragraph.Align:

using (Document document = new Document()) {
  PdfWriter.GetInstance(
    document, STREAM
  );
  document.Open();
  for (int i = 1; i < 11; ++i) {
    Paragraph p = new Paragraph(string.Format(
      "Paragraph {0}", i
    ));
    p.Alignment = Element.ALIGN_RIGHT;
    document.Add(p);
  } 
}

Он работает даже с такой длинной строкой:

string longString = @"
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.
";
Paragraph pLong = new Paragraph(longString);
pLong.Alignment = Element.ALIGN_RIGHT;
document.Add(pLong);

enter image description here

EDIT : Посмотрев на «картинку», вы нарисовали ...

Не соответствует названию. только способ, которым вы можете выровнять отдельные Paragraph объекты, как на вашей картинке, если "абзац" НЕ превышает поле "content" объекта Document (из-за отсутствия лучший срок). Другими словами, вы не сможете получить такой тип выравнивания, если объем текста превышает тот, который будет помещаться на одной строке.

С учетом сказанного, если вы хотите такой тип выравнивания, вам нужно:

  1. Рассчитайте самое широкое значение из набора строк, которые вы намереваетесь использовать.
  2. Используйте это значение для установки общего значения левого отступа для Paragraph с.

Примерно так:

using (Document document = new Document()) {
  PdfWriter.GetInstance(
    document, STREAM
  );
  document.Open();
  List<Chunk> chunks = new List<Chunk>();
  float widest = 0f;
  for (int i = 1; i < 5; ++i) {
    Chunk c = new Chunk(string.Format(
      "Paragraph {0}", Math.Pow(i, 24)
    ));
    float w = c.GetWidthPoint();
    if (w > widest) widest = w;
    chunks.Add(c);
  } 
  float indentation = document.PageSize.Width
    - document.RightMargin
    - document.LeftMargin
    - widest
  ;
  foreach (Chunk c in chunks) {
    Paragraph p = new Paragraph(c);
    p.IndentationLeft = indentation;
    document.Add(p);
  }
}

enter image description here

ОБНОВЛЕНИЕ 2 :

После прочтения обновленного вопроса, вот еще один вариант, который позволяет добавить текст в левую часть «контейнера»:

string textBlock = @"
Mr. Petersen
Elmstreet 9
888 Fantastic City  
".Trim();
// get the longest line to calcuate the container width  
var widest = textBlock.Split(
    new string[] {Environment.NewLine}
    , StringSplitOptions.None
  )
  .Aggregate(
    "", (x, y) => x.Length > y.Length ? x : y
  )
;
// throw-away Chunk; used to set the width of the PdfPCell containing
// the aligned text block
float w = new Chunk(widest).GetWidthPoint();
PdfPTable t = new PdfPTable(2);
float pageWidth = document.PageSize.Width 
  - document.LeftMargin 
  - document.RightMargin
;
t.SetTotalWidth(new float[]{ pageWidth - w, w });
t.LockedWidth = true;  
t.DefaultCell.Padding = 0;
// you can add text in the left PdfPCell if needed
t.AddCell("");
t.AddCell(textBlock);
document.Add(t);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...