Itextsharp标题间距与多列

时间:2017-05-19 03:34:20

标签: c# itext multiple-columns

我用itextsharp创建了pdf文件,我创建了Header ok,但是当我用两列创建表时。我没有从标题到我的两栏的间距

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

1 个答案:

答案 0 :(得分:0)

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

iText的自动布局不会考虑手动布局添加的任何内容。因此,必须将通过自动布局添加的内容考虑到手动布局中(可能更容易使用手动布局)。

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

你的while (paragraphs < 28)没有任何意义,因为在第一次穿过while身体时,你会立即将该变量推到内环for (int i = 0; i < 33; i++) { ...; ++paragraphs; }的28以上。

在代码中,您只需添加一次标题(table1TitleReportInfo),我假设您只想在第一页上使用此标题。

我改变了你的代码:

  • 首先将标题添加到Document

  • PdfWriter请求当前的 y 位置,

    float afterHeaderY = writer.GetVerticalPosition(true);
    

    假设PdfWriter被命名为writer

  • 使用此 y 位置作为列的顶部 y 坐标,并将第一页上的中心线恢复为后续页面上的硬编码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;

如果您不想要这个差距,请相应地减少该值。