Itextsharp Header 多列间距

Itextsharp Header spacing with multiple column

我用 itextsharp 创建了 pdf 文件,我创建 Header 没问题,但是当我创建 table 时有两列。我没有从 Header 到我的两列

的间距

代码

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)

问题的原因是您混合了 iText 的自动布局(当您使用 doc.Add 添加文档 header 和标题时)和手动布局(当您使用 ColumnText).

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

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

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

因为在你的代码中你只添加了一次 header (table1, TitleReport, Info),我假设你想使用这个 header 仅在第一页。

我通过以下方式更改了您的代码:

  • 首先将header添加到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]);
}

结果:

header和内容差距大是因为你的设置

Info.SpacingAfter = 200;

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