itextsharp следующая колонка не работает

Я пытаюсь настроить простую страницу с двумя столбцами, пишу в первый столбец, затем во второй. Однако приведенный ниже код помещает оба абзаца во второй столбец. Трассировка текущего столбца кажется правильной (сначала 0, затем 1)

Любые идеи, что я делаю неправильно?

MultiColumnText columns = new MultiColumnText();

columns.AddSimpleColumn(0, 200);
columns.AddSimpleColumn(200, 400);

Paragraph para1 = new Paragraph("Para1");
columns.AddElement(para1);

Response.Write(columns.CurrentColumn);//traces 0

columns.NextColumn();

Response.Write(columns.CurrentColumn);//traces 1

Paragraph para2 = new Paragraph("Para2");
columns.AddElement(para2);

doc.Add(columns);

Большое спасибо

Оливер


person user219313    schedule 21.09.2010    source источник


Ответы (3)


Мне не удалось заставить NextColumn() работать с объектом MultiColumnText, и я не смог найти никаких примеров (в .NET), которые бы это делали.

MultiColumnText делает создание столбцов в документе относительно простым, но взамен вы отказываетесь от большого контроля над макетом. Вы можете использовать объект ColumnText, который дает вам большой контроль над расположением столбцов, но требует больше кода.

Вот простой, но полный пример того, что вы пытаетесь сделать с помощью ColumnText:

    private void TestColumnText() {
        using (FileStream fs = new FileStream("ColumnTest.pdf", FileMode.Create)) {
            Document doc = new Document();
            PdfWriter writer = PdfWriter.GetInstance(doc, fs);
            doc.Open();

            PdfContentByte cb = writer.DirectContent;
            ColumnText ct = new ColumnText(cb);

            float columnWidth = 200f;
            float[] left1  = { doc.Left + 90f, doc.Top - 80f, doc.Left + 90f, doc.Top - 170f, doc.Left, doc.Top - 170f, doc.Left, doc.Bottom };
            float[] right1 = { doc.Left + columnWidth, doc.Top - 80f, doc.Left + columnWidth, doc.Bottom };
            float[] left2  = { doc.Right - columnWidth, doc.Top - 80f, doc.Right - columnWidth, doc.Bottom };
            float[] right2 = { doc.Right, doc.Top - 80f, doc.Right, doc.Bottom };

            // Add content for left column.
            ct.SetColumns(left1, right1);
            ct.AddText(new Paragraph("Para 1"));
            ct.Go();

            // Add content for right column.
            ct.SetColumns(left2, right2);
            ct.AddText(new Paragraph("Para 2"));
            ct.Go();

            doc.Close();
        }
    }

Предупреждение. Как я уже говорил, это простой пример, который даже не послужит вам отправной точкой в ​​том, что вы пытаетесь сделать. Вам помогут образцы на сайтах ниже (особенно первый):

http://www.mikesdotnetting.com/Article/89/iTextSharp-Page-Layout-with-Columns http://www.devshed.com/c/a/Java/Adding-Columns-With-iTextSharp

person Jay Riggs    schedule 01.10.2010

Поскольку я обнаружил, что последние версии iTextSharp не включают класс MultiColumnText, я создал один из своих собственных видов.

Public Class SimpleColumnText
    Inherits ColumnText

    Dim workingDocument As Document
    Dim columns As New List(Of Rectangle)
    Dim currentColumn As Integer = 0

    Public Sub New(content As PdfContentByte, columnCount As Integer, columnSpacing As Single, document As Document)
        MyBase.New(content)

        workingDocument = document
        CalculateColumnBoundries(columnCount, columnSpacing)
    End Sub

    Private Sub CalculateColumnBoundries(columnCount As Integer, columnSpacing As Single)
        Dim columnWidth As Single
        Dim columnHeight As Single

        With workingDocument
            columnWidth = ((.PageSize.Width - .LeftMargin - .RightMargin) - (columnSpacing * (columnCount - 1))) / columnCount
            columnHeight = (.PageSize.Height - .TopMargin - .BottomMargin)
        End With

        For x = 0 To columnCount - 1
            Dim llx As Single = ((columnWidth + columnSpacing) * x) + workingDocument.LeftMargin
            Dim lly As Single = workingDocument.BottomMargin
            Dim urx As Single = llx + columnWidth
            Dim ury As Single = columnHeight

            Dim newRectangle As New Rectangle(llx, lly, urx, ury)

            columns.Add(newRectangle)

        Next
    End Sub

    Public Shadows Sub AddElement(element As IElement)
        MyBase.AddElement(element)

        'we have to see if there is a column on the page before we begin
        Dim status As Integer

        If currentColumn = 0 Then
            status = ColumnText.NO_MORE_COLUMN
        End If

        Do
            If status = ColumnText.NO_MORE_COLUMN Then
                If currentColumn = columns.Count Then
                    'we need a new page
                    workingDocument.NewPage()
                    'reset column count
                    currentColumn = 0
                End If
                MyBase.SetSimpleColumn(columns(currentColumn))
                currentColumn += 1
            End If

            status = MyBase.Go()
        Loop While ColumnText.HasMoreText(status)
    End Sub
End Class

Это может быть легко расширено до Shadow других функций в ColumnText.

person cjbarth    schedule 08.02.2013

Спасибо cjbarth, это было полезно. Я сделал аналогичную версию на С#, если это кому-то поможет.

public class ColumnTextSimple : ColumnText
{
    Document document;
    Rectangle[] columns;

    public ColumnTextSimple(PdfContentByte writer, Document workingDocument, int columnCount, float columnSpacing) : base(writer)
    {
        document = workingDocument;
        CalculateColumns(columnCount, columnSpacing);
    }

    private void CalculateColumns(int columnCount, float columnSpacing)
    {
        float columnWidth;
        float columnHeight;

        columnWidth = ((document.PageSize.Width - document.LeftMargin - document.RightMargin) - (columnSpacing * (columnCount - 1))) / columnCount;
        columnHeight = (document.PageSize.Height - document.TopMargin - document.BottomMargin);

        columns = new Rectangle[columnCount];

        for (int c = 0; c < columnCount; c++)
        {
            float llx  = ((columnWidth + columnSpacing) * c) + document.LeftMargin;
            float lly  = document.BottomMargin;
            float urx  = llx + columnWidth;
            float ury  = columnHeight;

            columns[c] = new Rectangle(llx, lly, urx, ury);
        }
    }

    public void produceColumns()
    {
        int column = 0;
        int status = 0;

        while (ColumnText.HasMoreText(status))  // same as while(status != 1)
        {
            if (column >= columns.Length)
            {
                column = 0;
                document.NewPage();
            }
            this.SetSimpleColumn(columns[column]);
            status = this.Go();
            column++;
        }
    }
}

Я добавил отдельный метод для ProduceColumns, так как это позволяет вызывать AddElement более одного раза. После добавления всего контента необходимо вызвать ProduceColumns.

person JHW    schedule 16.07.2014