Skip to content

GetMinMergedCell wirft Exception wenn eine Zelle alle Spalten und mehrere Zeilen überspannt #358

@th-joerger

Description

@th-joerger

Zusammenfassung

TableRenderer.GetMinMergedCell(int row) wirft eine InvalidOperationException mit der Meldung GetMinMergedCell: Unexpected problem #1, sobald eine Tabellenzelle alle Spalten (MergeRight = columnCount - 1) und mehr als eine Zeile (MergeDown >= 1) überspannt.

Ursache

// TableRenderer.cs – GetMinMergedCell (betroffene Logik)
var resultRowIndex = row;            // ← immer == row
var resultRow = _table.Rows[resultRowIndex];
for (int idx = 0; idx < clsCount; idx++)
{
    var cell = resultRow[idx];
    if (resultRowIndex + cell.MergeDown == row)   // ← vereinfacht: MergeDown == 0
    {
        if (!_mergedCells.Contains(cell)) continue;
        return cell;
    }
}
throw new InvalidOperationException("GetMinMergedCell: Unexpected problem #1");

Die Bedingung resultRowIndex + MergeDown == row ist äquivalent zu MergeDown == 0. Wenn eine einzige Ursprungszelle alle Spalten belegt (MergeRight = 7) und mehrere Zeilen überspannt (MergeDown = 1), gibt es keine Zelle in der Zeile, die die Bedingung erfüllt:

  • Die Ursprungszelle (Spalte 0) ist in _mergedCells, hat aber MergeDown = 1 -> Bedingung schlägt fehl.
  • Alle anderen Zellen (Spalten 1–7) sind nicht in _mergedCells (sie sind durch den Merge verdeckt) -> Contains() lehnt sie ab.

Die ursprüngliche Debug-Only-Implementierung GetMinMergedCellOriginal() behandelt diesen Fall korrekt, indem sie nach der Zelle mit dem kleinsten MergeDown-Wert sucht (der auch > 0 sein kann). Der Fehler entstand, als der auskommentierte _minMergedCellRowMap[row]-Lookup durch den Literalwert row ersetzt wurde, ohne die darauf folgende MergeDown == 0-Anforderung anzupassen.

Betroffene Versionen

Version Ergebnis
PDFsharp-MigraDoc-GDI 6.2.4 (NuGet.org) Wirft InvalidOperationException
PDFsharp-MigraDoc-GDI 6.2.4-fixTableMergeAllColumnsBug Funktioniert korrekt

Reproduktion

TableMergeAllColumnsRepro.zip

# 1. Mit PDFsharp-MigraDoc-GDI 6.2.4 von NuGet.org bauen
dotnet run -c Release

# 2. Wirft InvalidOperationException "GetMinMergedCell: Unexpected problem #1"

# 3. Mit Fix bauen (6.2.4-fixTableMergeAllColumnsBug aus lokalem nuget-local Feed)
dotnet run -c Release -p:PdfSharpVersion=6.2.4-fixTableMergeAllColumnsBug

# 4. "output.pdf" wird erfolgreich erstellt

Fix

In TableRenderer.GetMinMergedCell() eine Fallback-Loop hinzufügen, die, wenn der erste Durchlauf kein Ergebnis liefert, die Zelle mit dem kleinsten MergeDown-Wert zurückgibt. Das entspricht dem Verhalten von GetMinMergedCellOriginal().

// Fallback: all cells in this row begin multi-row spans (MergeDown > 0),
// so no cell satisfies resultRowIndex + MergeDown == row above. Find the
// cell with the minimum MergeDown instead (matches GetMinMergedCellOriginal).
int minMergeDown = int.MaxValue;
Cell? minCell = null;
for (int idx = 0; idx < clsCount; idx++)
{
    var cell = resultRow[idx];
    if (!_mergedCells.Contains(cell)) continue;
    if (cell.MergeDown < minMergeDown)
    {
        minMergeDown = cell.MergeDown;
        minCell = cell;
        if (minMergeDown == 0) break;
    }
}
if (minCell is not null)
    return minCell;

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions