2016-08-25 143 views
0

我想在PDF文档中的绝对位置放置一个表格,并让表格分解到下一页,但是,将表格添加到ColumnText似乎阻止了这一点,我怀疑这是因为我使用DirectContent编写的,但我无法确定。在iText中创建具有分页符的绝对定位表

下面是显示此代码片段。

void Main(string[] args) 
{ 
    new Splitting().manipulatePdf(Splitting.dest); 
} 

public class Splitting { 

    public static string dest = @"d:\\splitting.pdf"; 

    public void manipulatePdf(String dest) 
    { 

     var doc = new Document(PageSize.A4); 
     var ms = new MemoryStream(); 
     var writer = PdfWriter.GetInstance(doc, ms); 

     doc.Open(); 
     doc.NewPage(); 

     Paragraph p = new Paragraph("Test"); 
     var table = new PdfPTable(2); 
     for (int i = 1; i < 60; i++) { 
      table.AddCell("key " + i); 
      table.AddCell("value " + i); 
     } 

     doc.Add(table); 

     ColumnText ct = new ColumnText(writer.DirectContent); 
     ct.SetSimpleColumn(0, 0, 300, 300); 
     ct.AddElement(table); 
     ct.Go(); 

     doc.Close(); 

     File.WriteAllBytes(dest, ms.ToArray()); 
    } 
} 

回答

1

你有这样的代码:

ColumnText ct = new ColumnText(writer.DirectContent); 
ct.SetSimpleColumn(0, 0, 300, 300); 
ct.AddElement(table); 
ct.Go(); 

这增加了表测量300×300用户单位的矩形。返回值ct.Go()会通知您是否所有矩形都足够大以适应表格,或表格中是否有一些内容不合适。在后一种情况下,你必须定义一个新的列,可能在一个新的页面上。

请参阅官方文档中的ColumnTable示例(这是一个Java示例;可以在页面底部找到C#版本的链接)。

ColumnText column = new ColumnText(writer.DirectContent); 
float[][] x = { 
    new float[] { document.Left, document.Left + 380 }, 
    new float[] { document.Right - 380, document.Right } 
}; 
column.AddElement(GetTable(day)); 
int count = 0; 
int status = 0; 
// render the column as long as it has content 
while (ColumnText.HasMoreText(status)) { 
    column.SetSimpleColumn(
     x[count][0], document.Bottom, 
     x[count][1], document.Top 
    ); 
    // render as much content as possible 
    status = column.Go(); 
    // go to a new page if you've reached the last column 
    if (++count > 1) { 
     count = 0; 
     document.NewPage(); 
    } 
} 

这是代码,如果你坚持使用iTextSharp的5.如果你想升级到最新版本,iText的7为C#,你的代码会更容易阅读。在这种情况下,仅需要将DocumentRenderer更改为ColumnDocumentRenderer,如iText 7: Building Blocks教程的chapter 2中所述。渲染器的概念是iText 7的主要改进之一。如果您希望自己的代码能够适应未来,您应该考虑升级。

+0

非常感谢你。我可能会重新发布这个问题,但针对iText 7库。当然,我会尝试先回答我自己的问题:) –