Повернуть текст / Вертикальный текст в itextsharp

Мне нужен вертикальный текст или просто способ повернуть ColumnText в ITextSharp.

(Это должно быть абсолютное положение)

До сих пор я пробовал много разных решений, но безуспешно.

Вот пара попыток:

1.

_cb.SetFontAndSize(BaseFont.CreateFont(), 12f);
_cb.ShowTextAligned(Element.ALIGN_CENTER, "Hello World", 50, 50, 90);

2.

var vt =  new VerticalText(_cb);
vt.SetVerticalLayout(50, 50, 400, 8, 30);            
vt.AddText(new Chunk("asdasd",_sf.ChildBackPageTextOneFont()));
vt.Go();

3.

System.Drawing.Drawing2D.Matrix foo = new System.Drawing.Drawing2D.Matrix();
foo.Rotate(90);
_cb.ConcatCTM(foo);

Я также пытался нарисовать его с помощью System.Drawing.Graphics, но качество ОЧЕНЬ плохое.

Любое решение? Спасибо.


person Luticka    schedule 08.12.2010    source источник


Ответы (3)


Я пробовал много методов из Интернета для этой проблемы с поворотом. Но ни один из них не работал. Наконец я нашел простое решение. Может быть, мы можем сделать это так. Мы можем нарисовать таблицу без границ и только с одной ячейкой. И мы добавляем текст в ячейку, наконец, поворачиваем ячейку. Тогда все в порядке.

        table = new PdfPTable(1);
        table.TotalWidth = 72;
        paragraph = new Paragraph("123");
        cell = new PdfPCell(paragraph);
        cell.Rotation = 270;
        cell.BorderWidth = 0;
        table.AddCell(cell);
        table.WriteSelectedRows(0, -1, 72, 72, writer.DirectContent);

Кроме того, метод WriteSelectedRows может позиционировать эту ячейку.

person Sun Robin    schedule 28.07.2014
comment
Это очень хороший ответ, и даже можно использовать выравнивание для ячейки, например cell.HorizontalAlignment = PdfContentByte.ALIGN_CENTER. Также можно установить шрифт для абзаца, например этот новый абзац (123, ‹ваш шрифт›). - person AH.; 25.02.2016
comment
Я использовал cell.Rotation = 270, чтобы сделать текст ячейки вертикальным. Спасибо. - person obaid; 09.12.2020

На самом деле самый простой способ похож на вашу первую попытку. Вам просто нужно было добавить вызов BeginText() и EndText() вот так

_cb.SetFontAndSize(BaseFont.CreateFont(), 12f);
_cb.BeginText();
_cb.ShowTextAligned(Element.ALIGN_CENTER, "Hello World", 50, 50, 90);
_cb.EndText();
_cb.Stroke();

Вот документация для ShowTextAligned

person Stefan Mihai Stanescu    schedule 27.07.2012

Нашел ответ:

Используйте что-то вроде этого:

Imports System.Drawing, System.Drawing.Drawing2D
Dim transf as new Matrix
transf.RotateAt(30,New PointF(100,100), MatrixOrder.Append)
writer.DirectContent.Transform(transf)

transf.Invert()
writer.DirectContent.Transform(transf)

Поверните холст, напишите какой-нибудь текст, поверните его обратно.

person Luticka    schedule 09.12.2010
comment
...и повернуть обратно. Вы также можете вызвать directContent.saveState(), преобразовать и нарисовать текст, а затем вызвать directContent.restoreState(). Меньше работы для компьютера, меньше байтов в вашем контенте и отсутствие математических ошибок с плавающей запятой, которые могут увеличиваться по мере того, как вы выполняете преобразование туда-сюда и обратно. - person Mark Storer; 10.12.2010
comment
Writer.DirectContent.SaveState(); Writer.DirectContent.Transform(transf);DrawSomething(); Writer.DirectContent.RestoreState(); - person Mark Storer; 01.07.2011