IText7 列宽问题

IText7 Column width issue

我一直在尝试使用 iText7 创建一个 PDF 文档,并在 table 中使用 不同的列大小 ,在我的代码,我已经为每列设置了宽度。但是我无法得到想要的结果。

版本 - itext7-core:7.1.15

这是部分代码:

private void ManipulatePdf(string pdfPath)
{
    PdfDocument pdfDoc = new PdfDocument(new PdfWriter(pdfPath));
    Document doc = new Document(pdfDoc);
    doc.SetMargins(20, 20, 20, 20);
    Table table2 = new Table(UnitValue.CreatePercentArray(new float[] {10,20,40,10,10,20,10 })).UseAllAvailableWidth();

    
    table2.SetWidth(UnitValue.CreatePercentValue(100));
    
    table2.SetFixedLayout();

    table2.AddCell(getCellm1(300));
    table2.AddCell(getCellm2(240));
    table2.AddCell(getCellm3(100));
    table2.AddCell(getCellm4(100));
    table2.AddCell(getCellm5(100));
    table2.AddCell(getCellm6(300));
    table2.AddCell(getCellm6(300));
    doc.Add(table2);
    doc.Close();
}

private Cell getCellm7(int cm)
{
    Cell cell = new Cell(1, 7);

    Paragraph p = new Paragraph(
    String.Format("%smm", 10 * cm)).SetFontSize(8);
    p.SetTextAlignment(iText.Layout.Properties.TextAlignment.CENTER);
    cell.Add(p);
    return cell;
}

private Cell getCellm6(int cm)
{
    Cell cell = new Cell(1, 6);

    Paragraph p = new Paragraph(
    String.Format("%smm", 10 * cm)).SetFontSize(8);
    p.SetTextAlignment(iText.Layout.Properties.TextAlignment.CENTER);
    cell.Add(p);
    return cell;
}

private Cell getCellm5(int cm)
{
    Cell cell = new Cell(1, 5);

    Paragraph p = new Paragraph(
    String.Format("%smm", 10 * cm)).SetFontSize(8);
    p.SetTextAlignment(iText.Layout.Properties.TextAlignment.CENTER);
    cell.Add(p);
    return cell;
}

private Cell getCellm4(int cm)
{
    Cell cell = new Cell(1, 4);

    Paragraph p = new Paragraph(
    String.Format("%smm", 10 * cm)).SetFontSize(8);
    p.SetTextAlignment(iText.Layout.Properties.TextAlignment.CENTER);
    cell.Add(p);
    return cell;
}

private Cell getCellm3(int cm)
{
    Cell cell = new Cell(1, 3);

    Paragraph p = new Paragraph(
    String.Format("%smm", 10 * cm)).SetFontSize(8);
    p.SetTextAlignment(iText.Layout.Properties.TextAlignment.CENTER);
    cell.Add(p);
    return cell;
}

private Cell getCellm2(int cm)
{
    Cell cell = new Cell(1, 2);

    Paragraph p = new Paragraph(
    String.Format("%smm", 10 * cm)).SetFontSize(8);
    p.SetTextAlignment(iText.Layout.Properties.TextAlignment.CENTER);
    cell.Add(p);
    return cell;
}

private Cell getCellm1(int cm)
{
    Cell cell = new Cell(1, 1);

    Paragraph p = new Paragraph(
    String.Format("%smm", 10 * cm)).SetFontSize(8);
    p.SetTextAlignment(iText.Layout.Properties.TextAlignment.CENTER);
    cell.Add(p);
    return cell;
}

以上代码的输出

从上面的代码中得到了不同的列大小,我想要的结果如下:

这是我希望列的样子:

如果有人使用 iText 做过这样的事情,任何建议将不胜感激。如果您需要更多信息,请告诉我。

您的百分比值 (10,20,40,10,10,20,10) 加起来是 120,而不是 100。调用 .UseAllAvailableWidth() 等同于 table2.SetWidth(UnitValue.CreatePercentValue(100)); - 不需要两者都执行。

您还可以将数字传递给 Cell 构造函数(例如 new Cell(1, 4))。这些数字实际上并不表示单元格的位置,而是表示单元格的行跨度和列跨度。这就是意外布局的真正原因。除非您希望单元格占用多行或多列,否则您不必将任何内容传递给单元格构造函数。

修正上述错误得到以下结果:

参考代码:

private void ManipulatePdf(string pdfPath) {
    PdfDocument pdfDoc = new PdfDocument(new PdfWriter(pdfPath));
    Document doc = new Document(pdfDoc);
    doc.SetMargins(20, 20, 20, 20);
    Table table2 = new Table(UnitValue.CreatePercentArray(new float[] {8, 15, 38, 8, 8, 15, 8}))
        .UseAllAvailableWidth();

    table2.SetFixedLayout();

    table2.AddCell(CreateCell("S.No"));
    table2.AddCell(CreateCell("Item Code"));
    table2.AddCell(CreateCell("Description"));
    table2.AddCell(CreateCell("Qty"));
    table2.AddCell(CreateCell("Unit"));
    table2.AddCell(CreateCell("Unit Price"));
    table2.AddCell(CreateCell("P.Unit"));

    doc.Add(table2);
    doc.Close();
}

private Cell CreateCell(String text) {
    Cell cell = new Cell();
    Paragraph p = new Paragraph(text).SetFontSize(8);
    p.SetTextAlignment(TextAlignment.CENTER);
    cell.Add(p);
    return cell;
}