2010-09-21 5 views
1

J'essaye de mettre en place une simple page de 2 colonnes, écrire dans la première colonne, puis la seconde. Cependant, le code ci-dessous place les deux paragraphes dans la deuxième colonne. La trace de la colonne actuelle semble être correcte (d'abord 0, puis 1)itextsharp nextcolumn ne fonctionne pas

Des idées que je fais mal?

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); 

Un grand merci

Oliver

Répondre

2

Je ne pouvais pas NextColumn() travailler wih un objet MultiColumnText et je ne pouvais pas trouver des échantillons (.NET) qui le font. Un MultiColumnText permet de créer des colonnes dans un document relativement facilement, mais en échange, vous perdez beaucoup de contrôle sur la mise en page. Vous pouvez utiliser l'objet ColumnText qui vous donne beaucoup de contrôle sur la disposition des colonnes mais nécessite plus de code.

Voici un exemple simple mais complète de ce que vous essayez de faire en utilisant 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(); 
     } 
    } 

Attention: Comme je l'ai mentionné, ceci est un exemple simple et servira même pas comme départ point pour vous dans ce que vous essayez de faire. Les échantillons sur les sites ci-dessous (en particulier le premier) vous aidera à:

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

1

Comme je l'ai constaté que les dernières versions de iTextSharp ne comprennent pas la classe MultiColumnText j'ai créé un de mes propres de trie.

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 

Cela pourrait facilement être étendu à Shadow les autres fonctions ColumnText.

0

Merci cjbarth, c'était utile. J'ai fait une version similaire en C# si cela aide quelqu'un.

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++; 
     } 
    } 
} 

J'ai ajouté une méthode distincte pour ProduceColumns car cela permet d'appeler plusieurs fois AddElement. ProduceColumns doit ensuite être appelé une fois que tout le contenu a été ajouté.