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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions