2017-05-19 101 views
1

我已经用itextsharp创建了pdf文件,并且创建了标题确定但是当我创建包含两列的表时。我没有从头间距我的两列Itextsharp包含多列的标题间距

Images itextsharp

代码

PdfPTable table1 = new PdfPTable(2); 
table1.DefaultCell.Border = Rectangle.NO_BORDER; 
table1.WidthPercentage = 100; 

PdfPCell cell11 = new PdfPCell(); 
Paragraph UniName = new Paragraph(@"TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI", fontBold); 
UniName.Alignment = Element.ALIGN_CENTER; 
Paragraph paragraph = new Paragraph(@"PHÒNG ĐÀO TẠO", times); 
paragraph.Alignment = Element.ALIGN_CENTER; 
cell11.AddElement(UniName); 
cell11.AddElement(paragraph); 
cell11.BorderColor = BaseColor.WHITE; 

PdfPCell cell12 = new PdfPCell(); 
Paragraph QH1 = new Paragraph(@"CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM", fontBold); 
QH1.Alignment = Element.ALIGN_CENTER; 
Paragraph QH = new Paragraph(@"Độc lập - Tự do - Hạnh phúc", fontBold); 
QH.Alignment = Element.ALIGN_CENTER; 
Paragraph Symbol = new Paragraph(@"----------oOo----------", fontBold); 
Symbol.Alignment = Element.ALIGN_CENTER; 
cell12.AddElement(QH1); 
cell12.AddElement(QH); 
cell12.AddElement(Symbol); 
cell12.BorderColor = BaseColor.WHITE; 
table1.AddCell(cell11); 
table1.AddCell(cell12); 

Paragraph TitleReport = new Paragraph(@"TỔNG HỢP COI CHẤM THI", titleFont); 
TitleReport.Alignment = Element.ALIGN_CENTER; 

Paragraph Info = new Paragraph(string.Format(@"Từ ngày: {0}  đến ngày: {1}  Đơn vị: {2}", DateTime.Now.AddDays(-2).ToString("dd/MM/yyyy"), DateTime.Now.ToString("dd/MM/yyyy"), "Trung tâm quản lý chất lượng"), normalFont); 

Info.Alignment = Element.ALIGN_LEFT; 
Info.SpacingBefore = 20; 
Info.SpacingAfter = 200; 
PdfContentByte canvas = writer.DirectContent; 
ColumnText ct = new ColumnText(canvas); 
int side_of_the_page = 0; 
ct.SetSimpleColumn(COLUMNS[side_of_the_page]); 
int paragraphs = 0; 
while (paragraphs < 28) 
{ 
    PdfPTable table = new PdfPTable(5); 
    table.AddCell("STT"); 
    table.AddCell("Số Phách"); 
    table.AddCell("Điểm bằng số"); 
    table.AddCell("Điểm bằng chữ"); 
    table.AddCell("Ghi chú"); 

    for (int i = 0; i < 33; i++) 
    { 
     table.AddCell((i + 1).ToString()); 
     table.AddCell("209292"); 
     table.AddCell("4"); 
     table.AddCell("Điểm bằng chữ"); 
     table.AddCell(""); 
     ++paragraphs; 
    } 
    table.HeaderRows = 1; 

    //table.LockedWidth = true; 
    ct.AddElement(table); 
    //ct.AddElement(new Paragraph(String.Format("Paragraph {0}: {1}", , TEXT))); 
    while (ColumnText.HasMoreText(ct.Go())) 
    { 
     if (side_of_the_page == 0) 
     { 
      side_of_the_page = 1; 
      canvas.MoveTo(297.5f, 36); 
      canvas.LineTo(297.5f, 806); 
      canvas.Stroke(); 
     } 
     else 
     { 
      side_of_the_page = 0; 
      doc.NewPage(); 

     } 
     ct.SetSimpleColumn(COLUMNS[side_of_the_page]); 
    } 
} 

doc.Add(table1); 
doc.Add(TitleReport); 
doc.Add(Info); 

Also here

+2

请显示关键代码。 – mkl

+0

我的代码在这里:https://gist.github.com/anonymous/4ad2bf982a84342ae3b4d5ef527829c5 –

+0

尽可能多的堆栈溢出问题应该是有道理的,而不需要咨询外部资源。因此,我将你的代码复制到你的问题中。 – mkl

回答

0

问题的原因是,你混的自动布局由iText(当您使用doc.Add添加文档标题和标题时)和手动布局(当您使用ColumnText添加内容时)。

iText的自动布局不会将通过手动布局添加的任何内容考虑在内。因此,必须将通过自动布局添加的内容考虑到你的手动布局(可能它甚至会更容易使用手动布局来实现)。

此外,您在所有内容之后添加文档标题有点令人惊讶。给定足够的内容,这会将你的标题推到第一页以外的页面上!

而您的while (paragraphs < 28)没有任何意义,因为在第一次运行while正文时,您立即将该变量推到内部循环for (int i = 0; i < 33; i++) { ...; ++paragraphs; }以上的28以上。

由于在您的代码中只添加标头(table1,TitleReport, Info),我假设您只想在第一页上使用此标头。

我通过改变您的代码:

  • 添加报头添加到Document第一,

  • 请求来自PdfWriter当前ÿ位置,

    float afterHeaderY = writer.GetVerticalPosition(true); 
    

    假设PdfWriter被命名为writer

  • 使用该ý位置作为顶部ÿ列的坐标和第一页上的中心线恢复到上后页的硬编码806和

  • 除去while环和代码在评论中。

新代码:

PdfPTable table1 = new PdfPTable(2); 
table1.DefaultCell.Border = Rectangle.NO_BORDER; 
table1.WidthPercentage = 100; 

PdfPCell cell11 = new PdfPCell(); 
Paragraph UniName = new Paragraph(@"TRƯỜNG ĐẠI HỌC CÔNG NGHỆ ĐỒNG NAI", fontBold); 
UniName.Alignment = Element.ALIGN_CENTER; 
Paragraph paragraph = new Paragraph(@"PHÒNG ĐÀO TẠO", times); 
paragraph.Alignment = Element.ALIGN_CENTER; 
cell11.AddElement(UniName); 
cell11.AddElement(paragraph); 
cell11.BorderColor = BaseColor.WHITE; 

PdfPCell cell12 = new PdfPCell(); 
Paragraph QH1 = new Paragraph(@"CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM", fontBold); 
QH1.Alignment = Element.ALIGN_CENTER; 
Paragraph QH = new Paragraph(@"Độc lập - Tự do - Hạnh phúc", fontBold); 
QH.Alignment = Element.ALIGN_CENTER; 
Paragraph Symbol = new Paragraph(@"----------oOo----------", fontBold); 
Symbol.Alignment = Element.ALIGN_CENTER; 
cell12.AddElement(QH1); 
cell12.AddElement(QH); 
cell12.AddElement(Symbol); 
cell12.BorderColor = BaseColor.WHITE; 
table1.AddCell(cell11); 
table1.AddCell(cell12); 

Paragraph TitleReport = new Paragraph(@"TỔNG HỢP COI CHẤM THI", titleFont); 
TitleReport.Alignment = Element.ALIGN_CENTER; 

Paragraph Info = new Paragraph(string.Format(@"Từ ngày: {0}  đến ngày: {1}  Đơn vị: {2}", DateTime.Now.AddDays(-2).ToString("dd/MM/yyyy"), DateTime.Now.ToString("dd/MM/yyyy"), "Trung tâm quản lý chất lượng"), normalFont); 

Info.Alignment = Element.ALIGN_LEFT; 
Info.SpacingBefore = 20; 
Info.SpacingAfter = 200; 

doc.Add(table1); 
doc.Add(TitleReport); 
doc.Add(Info); 

float afterHeaderY = writer.GetVerticalPosition(true); 

Rectangle[] COLUMNS = new Rectangle[] { 
    new Rectangle(36, 36, 290, afterHeaderY), 
    new Rectangle(305, 36, 559, afterHeaderY) 
}; 

PdfContentByte canvas = writer.DirectContent; 
ColumnText ct = new ColumnText(canvas); 
int side_of_the_page = 0; 
ct.SetSimpleColumn(COLUMNS[side_of_the_page]); 

PdfPTable table = new PdfPTable(5); 
table.AddCell("STT"); 
table.AddCell("Số Phách"); 
table.AddCell("Điểm bằng số"); 
table.AddCell("Điểm bằng chữ"); 
table.AddCell("Ghi chú"); 

for (int i = 0; i < 33; i++) 
{ 
    table.AddCell((i + 1).ToString()); 
    table.AddCell("209292"); 
    table.AddCell("4"); 
    table.AddCell("Điểm bằng chữ"); 
    table.AddCell(""); 
} 
table.HeaderRows = 1; 

ct.AddElement(table); 
while (ColumnText.HasMoreText(ct.Go())) 
{ 
    if (side_of_the_page == 0) 
    { 
     side_of_the_page = 1; 
     canvas.MoveTo(297.5f, 36); 
     canvas.LineTo(297.5f, afterHeaderY); 
     canvas.Stroke(); 
    } 
    else 
    { 
     side_of_the_page = 0; 
     doc.NewPage(); 

     COLUMNS = new Rectangle[] { 
      new Rectangle(36, 36, 290, 806), 
      new Rectangle(305, 36, 559, 806) 
     }; 
     afterHeaderY = 806; 
    } 
    ct.SetSimpleColumn(COLUMNS[side_of_the_page]); 
} 

结果:

Screenshot

标题和内容之间的巨大差距是由于你设置

Info.SpacingAfter = 200; 

如果你不想要那个差距,相应地减少价值。

+0

感谢您的帮助。我会更换我的代码;) –

+0

@ChungPhạmBáTuấn请问您有没有接受此答案的原因?使用它遇到麻烦了吗? – mkl

+1

不,我接受你的代码。我记得我点击接受(V),但现在我复出,我看不到这:( –