如何在 ASP.NET 和 C# 中使用 iTextSharp 合并 PDF 中具有相同值的行?

How to merge rows with same value in PDF using iTextSharp, in ASP.NET and C#?

我有下一个问题:

我需要为此合并具有相同值的行 table:

Table I need

这个table在一个GridView中,我实现了合并那些行的方法

private void AgruparGridView(GridViewRowCollection rows, int indiceInicial, int totalCeldasAgrupar)
{
    //Si no hay celdas a agrupar no realiza ninguna acción
    if (totalCeldasAgrupar == 0) 
        return;
    int i, count = 1;
    ArrayList lst = new ArrayList();
    // Los elementos del gridview son llenados en la lista.
    lst.Add(rows[0]);
    var ctrl = rows[0].Cells[indiceInicial];
    //Recorrer los registros que se tengan para agrupar
    for (i = 1; i < rows.Count; i++)
    {
        TableCell nextCell = rows[i].Cells[indiceInicial];
        if (ctrl.Text == nextCell.Text)
        {
            count++;
            nextCell.Visible = false;
            lst.Add(rows[i]);
        }
        else
        {
            if (count > 1)
            {
                ctrl.RowSpan = count;
                AgruparGridView(new GridViewRowCollection(lst), indiceInicial + 1, totalCeldasAgrupar - 1);
            }
            count = 1;
            lst.Clear();
            ctrl = rows[i].Cells[indiceInicial];
            lst.Add(rows[i]);
        }
    }
    if (count > 1)
    {
        ctrl.RowSpan = count;
        AgruparGridView(new GridViewRowCollection(lst), indiceInicial + 1, totalCeldasAgrupar - 1);
    }
    count = 1;
    lst.Clear();
}

我需要使用 iTextSharp 在 PDF 报告上实现相同的结果,但我不知道这个过程。

构建此部分的代码片段是这样的:

public PdfPTable Tablas(int TipoSeccion, int TipoDoc, int ClaveEntidad, int ClaveSubSis, string descripcion)
    {
        PDFEvents oPDFEvents = new PDFEvents();
        string sError = string.Empty;
        int columns = 1;
        int i = 0;
        DataSet _DatosTabla = null;
        PdfPTable Table;
        PdfPCell CeldaNoBorde = new PdfPCell(CeldasSinBorde("", 1, 1, 4, 255, 255, 255));
        #region PerfilesDOCENTE
        #region Tipo3
        if (TipoSeccion == 3)
        {

            columns = 3;

            Table = new PdfPTable(columns);
            Table.WidthPercentage = 80;
            float[] widhts = new float[] { 15, 50 };
            //Header Superior
            if (this.TipoSeccionOriginal == 3 || this.TipoSeccionOriginal==0)
            {

               Table.AddCell(Celdas("ASIGNATURAS POR EXAMEN DISCIPLINAR PARA FUNCIONES DOCENTES", 2, 3, 8, 238, 233, 233));
                    Table.AddCell(Celdas("Área disciplinar", 3, 1, 10, 238, 233, 233));
                    Table.AddCell(Celdas("Asignatura", 3, 1, 10, 238, 233, 233));
                    Table.AddCell(Celdas("Evaluación Disciplinar", 3, 1, 10, 238, 233, 233));
                    _DatosTabla = DameDatosTablaPerfilesTelebach(ClaveEntidad, ClaveSubSis);
            }
            else
            {
                Table.AddCell(Celdas("ASIGNATURAS A CONCURSO PARA FUNCIONES TÉCNICO DOCENTES", 1, 2, 8, 238, 233, 233));
                Table.AddCell(Celdas("Evaluación", 2, 1, 10, 238, 233, 233));
                Table.AddCell(Celdas("Asignaturas", 2, 1, 10, 238, 233, 233));
                _DatosTabla = DameDatosTablaPerfiles(TipoDoc, ClaveEntidad, ClaveSubSis, true);
            }

            if (_DatosTabla != null)
            {
                while (i < _DatosTabla.Tables[0].Rows.Count)
                    {
                        Table.AddCell(oPDFEvents.FontPhrase(_DatosTabla.Tables[0].Rows[i][0].ToString(), 10));
                        Table.AddCell(oPDFEvents.FontPhrase(_DatosTabla.Tables[0].Rows[i][1].ToString(), 10));
                        Table.AddCell(oPDFEvents.FontPhrase(_DatosTabla.Tables[0].Rows[i][2].ToString(), 10));
                        i = i + 1;
                    }
            }
            return Table;
        }

我的结果是这样

My actual result

对不起我的英语不好!! 感谢您的关注!

您需要在适当的 PdfPCell 上设置 Rowspan = n 并忽略在该列中添加下一个 n-1 单元格。这是一个首先构建常规 3x3 table 的示例。单元格标记为 行、列 。然后在第一个单元格上用 Rowspan = 3 构建 table。第四个(2,1)和第七个(3,1)单元格未添加。

Document doc = new Document();
PdfWriter writer =
  PdfWriter.GetInstance(doc, new FileStream("tables.pdf", FileMode.Create));
doc.Open();
doc.Add(new Paragraph("Table without rowspan:"));
PdfPTable table = new PdfPTable(3);
table.SpacingBefore = 10;
table.AddCell(new PdfPCell(new Phrase("1,1")));
table.AddCell(new PdfPCell(new Phrase("1,2")));
table.AddCell(new PdfPCell(new Phrase("1,3")));
table.AddCell(new PdfPCell(new Phrase("2,1")));
table.AddCell(new PdfPCell(new Phrase("2,2")));
table.AddCell(new PdfPCell(new Phrase("2,3")));
table.AddCell(new PdfPCell(new Phrase("3,1")));
table.AddCell(new PdfPCell(new Phrase("3,2")));
table.AddCell(new PdfPCell(new Phrase("3,3")));
doc.Add(table);
doc.Add(new Paragraph("Table with rowspan 3 on first cell:"));
PdfPTable tableWithRowspan = new PdfPTable(3);
tableWithRowspan.SpacingBefore = 10;
PdfPCell cellWithRowspan = new PdfPCell(new Phrase("1,1"));
// The first cell spans 3 rows
cellWithRowspan.Rowspan = 3;
tableWithRowspan.AddCell(cellWithRowspan);
tableWithRowspan.AddCell(new PdfPCell(new Phrase("1,2")));
tableWithRowspan.AddCell(new PdfPCell(new Phrase("1,3")));
// Cell 2,1 does not exist
tableWithRowspan.AddCell(new PdfPCell(new Phrase("2,2")));
tableWithRowspan.AddCell(new PdfPCell(new Phrase("2,3")));
// Cell 3,1 does not exist
tableWithRowspan.AddCell(new PdfPCell(new Phrase("3,2")));
tableWithRowspan.AddCell(new PdfPCell(new Phrase("3,3")));
doc.Add(tableWithRowspan);
doc.Close();

结果: