Search by

pfarr-tools / roo-ruling

potofcoffee

Reusable handwriting rulings for PHPWord documents, including German primary-school Grade 1-3 presets.

Package info

github.com/pfarr-tools/roo-ruling

pkg:composer/pfarr-tools/roo-ruling

Statistics

Installs: 24

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

dev-main 2026-08-27 16:25 UTC

This package is auto-updated.

Last update: 2026-08-27 16:26:04 UTC


README

pfarr-tools/roo-ruling ist ein PHP-Paket zur Erzeugung von Lineaturen für Arbeitsblätter und andere Unterrichtsmaterialien mit PHPWord.

Das Paket bildet insbesondere die in der Grundschule verwendeten Schreiblineaturen ab und kann sie sowohl in DOCX- als auch in ODT-Dokumenten erzeugen.

Installation

composer require pfarr-tools/roo-ruling

Voraussetzung ist PHP 8.3 oder neuer.

Das Paket verwendet derzeit eine temporäre Abspaltung von phpoffice/phpword: den Branch new-features-and-fixes aus potofcoffee/PHPWord. Die darin enthaltenen PHPWord-Fixes warten noch auf die Freigabe und Übernahme im PHPWord-Hauptprojekt.

Schnellstart

Für eine PHPWord-Lineatur wird ein Preset als RulingDefinition an den Renderer übergeben:

use PhpOffice\PhpWord\IOFactory;
use PhpOffice\PhpWord\PhpWord;
use PfarrTools\RooRuling\PhpWord\RulingRenderer;
use PfarrTools\RooRuling\RulingPreset;

$phpWord = new PhpWord();
$section = $phpWord->addSection();

(new RulingRenderer())->render(
    section: $section,
    ruling: RulingPreset::Grade1->definition(),
    count: 5,
    widthMm: 170.0,
);

IOFactory::createWriter($phpWord, 'Word2007')->save(__DIR__.'/ruling.docx');

PNG-Ausgabe

PngRulingRenderer erzeugt ein einzelnes Lineaturband als PNG mit transparentem Hintergrund. Die Breite wird in Millimetern angegeben; die Höhe ergibt sich aus der gewählten RulingDefinition. Die Ausgabe verwendet die Geometrie, Linienfarbe und Linienstärke der Definition und ist damit auch für RulingPreset::Grade1 bis RulingPreset::Grade4Plus geeignet.

Für die PNG-Ausgabe wird die PHP-Erweiterung GD benötigt:

use PfarrTools\RooRuling\Image\PngRulingRenderer;
use PfarrTools\RooRuling\RulingPreset;

$png = (new PngRulingRenderer())->render(
    ruling: RulingPreset::Grade2->definition(),
    widthMm: 120.0,
    dpi: 300,
);

file_put_contents(__DIR__.'/ruling-grade-2.png', $png);

dpi ist optional und beträgt standardmäßig 300. Ein positiver Wert für widthMm ist erforderlich. Diese Rasterausgabe ist für Vorschauen, Arbeitsblätter oder Bildkompositionen gedacht; die PHPWord-Ausgabe bleibt der bearbeitbare Dokumentpfad.

Unterstützte Lineaturen

Klasse 1

Die Lineatur besteht aus vier Linien und damit drei Schreibbereichen:

  • Oberer Bereich: 4 mm
  • Mittlerer Bereich: 5 mm
  • Unterer Bereich: 4 mm
  • Abstand zur nächsten Lineatur: 5 mm

Die Lineatur entspricht damit dem Schema:

──────────────────────────────
          4 mm
──────────────────────────────
          5 mm
──────────────────────────────
          4 mm
──────────────────────────────

          5 mm Abstand

Klasse 2

Die Lineatur verwendet ebenfalls vier Linien, ist aber kleiner:

  • Oberer Bereich: 3 mm
  • Mittlerer Bereich: 4 mm
  • Unterer Bereich: 3 mm
  • Abstand zur nächsten Lineatur: 2 mm
──────────────────────────────
          3 mm
──────────────────────────────
          4 mm
──────────────────────────────
          3 mm
──────────────────────────────

          2 mm Abstand

Klasse 3

Klasse 3 verwendet dieselben Maße wie Klasse 2, aber es werden nur die beiden Linien gezeichnet, die den mittleren Schreibbereich einschließen:

  • oberer Bereich: 3 mm, ohne Linie
  • mittlerer Bereich: 4 mm, obere und untere Linie
  • unterer Bereich: 3 mm, ohne Linie
  • Abstand zur nächsten Lineatur: 2 mm
  • seitliche Begrenzungslinien nur am mittleren Bereich

Klasse 4 und höher

Ab Klasse 4 wird eine einfache Schreiblinie verwendet.

  • Eine horizontale Linie pro Schreibzeile
  • Linienabstand: 10 mm
  • Keine zusätzlichen Hilfslinien
  • Keine seitlichen Begrenzungslinien
Text steht auf dieser Linie
──────────────────────────────
          10 mm
Text steht auf dieser Linie
──────────────────────────────
          10 mm
Text steht auf dieser Linie
──────────────────────────────

PHPWord-Verwendung

Ein Preset liefert die Geometrie als RulingDefinition; der Renderer fügt daraus eine native Tabelle mit exakten Zeilenhöhen und Rahmenlinien ein.

Für Lineaturen aus einzelnen, frei positionierbaren PHPWord-Zeichenelementen steht DrawingRulingRenderer zur Verfügung. Die Koordinaten werden vom Seitenrand oben links aus in Millimetern angegeben:

use PfarrTools\RooRuling\PhpWord\DrawingRulingRenderer;

(new DrawingRulingRenderer())->render(
    section: $section,
    ruling: RulingPreset::Grade3->definition(),
    leftMm: 19.9,
    topMm: 25.7,
    widthMm: 171.0,
    count: 22,
);

Der Renderer verwendet native PHPWord-Linienelemente mit derselben Linienfarbe und -stärke wie der Tabellenrenderer. Die Zonen und Abstände der Definition bleiben unverändert; bei Klasse 3 liegt die erste sichtbare Linie deshalb erst 3 mm unterhalb der angegebenen oberen Koordinate.

Für ODT schreibt dieser PHPWord-Branch native ODF-draw:line-Elemente und deren Grafikstile direkt. Dadurch bleiben die Linien auch dort als Zeichenelemente bearbeitbar.

widthMm und alle Maße der Definition werden in Millimetern angegeben. Die vier verfügbaren Presets sind:

RulingPreset::Grade1;
RulingPreset::Grade2;
RulingPreset::Grade3;
RulingPreset::Grade4Plus;

Höhe einer Lineatur berechnen

Mit heightMm() lässt sich die Gesamthöhe einer gerenderten Lineatur in Millimetern berechnen. Der Abstand zwischen zwei Schreibbereichen wird dabei nur zwischen den Bereichen berücksichtigt, nicht hinter dem letzten Bereich:

$heightMm = RulingPreset::Grade1->definition()->heightMm(5);
// 5 * 13 mm Schreibbereiche + 4 * 5 mm Zwischenräume = 85 mm

Die Anzahl muss mindestens 1 betragen.

Text auf der Lineatur

Die Lineatur ist nicht lediglich eine Hintergrundgrafik. Sie wird mit nativen Dokumentelementen erzeugt.

Dadurch kann Text direkt in die Lineatur eingefügt werden.

Beispiel:

(new RulingRenderer())->render(
    section: $section,
    ruling: RulingPreset::Grade1->definition(),
    count: 3,
    widthMm: 170.0,
    textByBand: [
        'Gott spricht zu Abraham.',
        'Abraham macht sich auf den Weg.',
        'Gott begleitet ihn.',
    ],
);

Damit können beispielsweise Arbeitsblätter mit vorgeschriebenen Wörtern oder Sätzen erzeugt werden.

DOCX und ODT

Das Paket ist für beide von PHPWord unterstützten Ausgabeformate vorgesehen:

  • Microsoft Word (.docx)
  • OpenDocument Text (.odt)

Für den PHPWord-Produktionspfad werden Lineaturen nicht als Bilder erzeugt. Stattdessen verwendet der Renderer native Tabellen-, Zeilen- und Rahmeninformationen von PHPWord.

Der temporäre PHPWord-Branch schreibt die Zellrahmen, exakten Zeilenhöhen und Zeichenelemente direkt als editierbare ODF-Strukturen. Ein zusätzlicher Post-Export-Patcher ist für die Produktions-Renderer daher nicht erforderlich.

$filename = __DIR__.'/ruling.odt';
IOFactory::createWriter($phpWord, 'ODText')->save($filename);

Für die fertigen Referenzseiten des Pakets kann alternativ RulingDocument::saveReferenceSheet() verwendet werden. Diese Methode erzeugt jeweils ein vollständiges Dokument für ein Preset.

Dadurch bleiben die Dokumente bearbeitbar und die Lineaturen können mit anderen PHPWord-Inhalten kombiniert werden.

Schreibraum für Antworten schätzen

HandwritingSpaceEstimator schätzt, wie viel horizontale Fläche eine Schülerin oder ein Schüler für eine erwartete handschriftliche Antwort benötigt. Die Heuristik verwendet je nach Klassenstufe durchschnittliche Zeichenbreiten von 7,0 mm (Klasse 1), 6,5 mm (Klasse 2), 5,5 mm (Klasse 3), 5,0 mm (Klasse 4) und 4,5 mm (ab Klasse 5). Die drei Flexibilitätsstufen EXACT, SHORT_TEXT und FREE_TEXT berücksichtigen zunehmend variierende Antwortformulierungen.

use PfarrTools\RooRuling\AnswerFlexibility;
use PfarrTools\RooRuling\HandwritingSpaceEstimator;

$widthMm = (new HandwritingSpaceEstimator())->estimateWidthMm(
    answer: 'im Himmel',
    grade: 2,
    flexibility: AnswerFlexibility::EXACT,
);

Das Ergebnis enthält 4 mm festen Rand und wird immer auf die nächsten 5 mm aufgerundet. Es handelt sich um eine großzügige Arbeitsblatt-Heuristik, nicht um eine typografische Messung der tatsächlich gerenderten Schrift.

Maßeinheiten

Die Definitionen der Lineaturen verwenden Millimeter.

Bei der Ausgabe rechnet das Paket diese intern in die von Word verwendeten Twips um:

1 inch = 25,4 mm
1 inch = 1440 Twips

Die Umrechnung erfolgt zentral über den UnitConverter.

Eigene Lineaturen

Die mitgelieferten Klassenstufen sind lediglich Presets.

Die eigentliche Lineatur ist unabhängig von einer Klassenstufe definiert. Dadurch können weitere Lineaturen ergänzt werden, ohne den PHPWord-Renderer zu verändern.

Beispielsweise können künftig zusätzliche Varianten unterstützt werden:

  • individuelle Schreiblineaturen
  • einfache Linien mit anderen Abständen
  • besondere Lineaturen für Fördermaterial
  • karierte Raster
  • weitere schul- oder landesspezifische Lineaturen

Die Trennung zwischen Lineaturdefinition und Renderer ist bewusst gewählt: Eine neue Lineatur sollte im Regelfall lediglich eine neue Definition benötigen.

Referenzdokumente

Unter examples/ befindet sich ein Generator für Referenzdokumente.

Nach der Installation der Composer-Abhängigkeiten können damit DOCX- und ODT-Dateien für die verschiedenen Lineaturen erzeugt werden.

composer install
php examples/generate.php

Das Skript erzeugt zusätzlich examples/output/drawing-rulings.docx und examples/output/drawing-rulings.odt mit allen vier Lineaturtypen als Zeichenelemente.

Diese Dokumente können anschließend beispielsweise mit Microsoft Word oder LibreOffice geöffnet und mit den ursprünglichen Vorlagen verglichen werden.

Entwicklung

Tests können mit PHPUnit ausgeführt werden:

composer test

Vor Änderungen an der Geometrie einer Lineatur sollten insbesondere die erzeugten DOCX- und ODT-Referenzdokumente kontrolliert werden.

Die beiden Ausgabeformate können sich bei Tabellenhöhen, Absatzabständen und Rahmen geringfügig unterschiedlich verhalten. Der Renderer soll deshalb keine formatspezifischen Annahmen treffen, solange diese nicht notwendig sind.

Weitere Informationen zur internen Modellierung und zu den ermittelten Maßen befinden sich unter:

build/ruling-format.md

Die weitere Entwicklungsplanung befindet sich unter:

build/masterplan.md

Lizenz

Copyright © Pfarr.Tools

Dieses Projekt ist freie Software und steht unter der GNU General Public License Version 3 oder – nach Ihrer Wahl – jeder späteren Version (GPL-3.0-or-later).

Sie dürfen das Programm unter den Bedingungen der GNU General Public License, wie sie von der Free Software Foundation veröffentlicht wurde, weitergeben und/oder verändern; entweder gemäß Version 3 der Lizenz oder (nach Ihrer Wahl) jeder späteren Version.

Dieses Programm wird in der Hoffnung veröffentlicht, dass es nützlich sein wird, jedoch ohne jede Gewährleistung; auch ohne die implizite Gewährleistung der Marktreife oder der Eignung für einen bestimmten Zweck.

Den vollständigen Lizenztext finden Sie in der Datei LICENSE.