Wie man benutzerdefinierte Silbentrennung zur PDF-Erstellung in C# hinzufügt
Benutzerdefinierte Silbentrennung bei der PDF-Erstellung in C# hilft, ungleichmäßige Abstände, Wortüberläufe und schlechte Umbrüche in schmalen Spalten, Rechnungen, Verträgen und mehrsprachigen Berichten zu beheben. Wenn ein PDF-Renderer die richtigen Silbentrennungsregeln nicht anwendet, kann Blocksatz große Lücken hinterlassen oder schlecht über Zeilen umbrechen.
In IronPDF wird die Silbentrennung während des HTML-zu-PDF-Renderings über die Chromium-Engine gehandhabt, nicht über ein Word-ähnliches Dokument-Objekt-Modell. Die CSS-Eigenschaft hyphens: auto erlaubt es dem Renderer, Wörter an gültigen Silbengrenzen zu brechen, und IronPDF wendet dieses Verhalten bei der PDF-Erstellung an. Die Eigenschaft CustomHyphenation in ChromePdfRenderOptions steuert, welche Silbentrennungsregeln verwendet werden.
Musterdateien verwenden das TeX-Format und können entweder von einem lokalen Dateipfad oder einer entfernten URL geladen werden. Dies ermöglicht es, benutzerdefinierte Silbentrennungsregeln für verschiedene Sprachen und Dokumentlayouts mit mehr Kontrolle über Worttrennungen im finalen PDF zu definieren.
Diese Anleitung erklärt, wie Sie die CustomHyphenationDefinitions API in C# verwenden, einschließlich lokaler und entfernter Musterladungen, Ausweichverhalten, Einschränkungen, Fehlerbehandlung und Caching.
Schnellstart
-
Installieren Sie IronPDF mit NuGet Package Manager
PM > Install-Package IronPdf -
Kopieren Sie diesen Codeausschnitt und führen Sie ihn aus.
using IronPdf; // Create renderer and assign custom hyphenation patterns from a remote URL var renderer = new ChromePdfRenderer(); renderer.RenderingOptions.CustomHyphenation = new CustomHyphenationDefinitions { PatternSource = "https://raw.githubusercontent.com/hyphenation/tex-hyphen/master/hyph-utf8/tex/generic/hyph-utf8/patterns/txt/hyph-en-us.pat.txt", ExceptionSource = "https://raw.githubusercontent.com/hyphenation/tex-hyphen/master/hyph-utf8/tex/generic/hyph-utf8/patterns/txt/hyph-en-us.hyp.txt" }; // Render HTML with CSS hyphens:auto to trigger word breaking var pdf = renderer.RenderHtmlAsPdf("<div style='text-align:justify; hyphens:auto; width:120px;'>Supercalifragilisticexpialidocious</div>"); pdf.SaveAs("hyphenated.pdf"); -
Bereitstellen zum Testen in Ihrer Live-Umgebung
Beginnen Sie noch heute, IronPDF in Ihrem Projekt zu verwenden, mit einer kostenlosen Testversion
Minimaler Arbeitsablauf
- Installieren Sie das IronPDF NuGet-Paket
- Erstellen Sie eine
ChromePdfRenderer-Instanz - Setzen Sie
RenderingOptions.CustomHyphenationauf ein neuesCustomHyphenationDefinitionsmit einemPatternSource-Pfad oder einer URL - Integrieren Sie
hyphens: autoin den CSS-Inhalt des HTML - Rufen Sie
RenderHtmlAsPdfauf und speichern Sie das Ergebnis
Wie funktioniert benutzerdefinierte Silbentrennung im PDF-Rendering?
Die CustomHyphenationDefinitions-Klasse definiert, wo IronPDF Silbentrennungsregeln während des Renderprozesses laden soll. Die Chromium-Engine liest diese Muster und wendet sie an, wenn die CSS-Regel hyphens: auto auf einem HTML-Element vorhanden ist.
Was ist die Klasse CustomHyphenationDefinitions?
Die Klasse legt zwei Eigenschaften offen:
| Eigenschaft | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
PatternSource | String | Ja | Pfad oder URL zur Silbentrennungsmusterdokument (z. B. hyph-en-us.pat.txt) |
ExceptionSource | String | Nein | Pfad oder URL zur Silbentrennungsausnahmedatei (z. B. hyph-en-us.hyp.txt) |
Musterdateien folgen dem TeX-Silbentrennungsformat, das vom tex-hyphen-Projekt auf GitHub gepflegt wird. Jede Sprache hat zwei Dateien im Repository: hyph-{lang}.pat.txt für Musterregeln und hyph-{lang}.hyp.txt für die Ausnahmeliste. Wenn auf Dateien verwiesen wird, die auf GitHub gehostet werden, ist die rohe Inhalts-URL (beginnend mit https://raw.githubusercontent.com/) erforderlich — eine Standard-URL zu einer GitHub-Seite gibt HTML zurück, nicht das Musterdokument.
Wie überschreibt benutzerdefinierte Silbentrennung die integrierte Spracheinstellung?
Das HyphenationLanguage-Enum auf ChromePdfRenderOptions bietet eingebaute Voreinstellungen für Englisch (US), Englisch (Britisch) und Russisch. Die CustomHyphenation-Eigenschaft hat Vorrang vor diesem Enum, wenn beide gesetzt sind, indem sie einer klaren Prioritätskette folgt:
- CustomHyphenation — wenn mit einer gültigen PatternSource gesetzt, werden benutzerdefinierte Muster verwendet
- HyphenationLanguage — wenn keine benutzerdefinierten Muster konfiguriert sind, wird die eingebaute Spracheinstellung angewandt
- Neinne — wenn keines von beiden gesetzt ist, erfolgt keine Silbentrennung
Was passiert, wenn das Laden von benutzerdefinierten Mustern fehlschlägt?
Fehler beim Laden von Mustern werden protokolliert, aber keine Ausnahmen geworfen. Der Render-Vorgang wird ohne Silbentrennung fortgesetzt, anstatt zu fehlschlagen. Wenn auch ein Wert für HyphenationLanguage konfiguriert ist, greift der Renderer auf diese eingebaute Voreinstellung zurück.
Dieses stille Fehlverhalten ist eine bewusste Designentscheidung für Produktionsumgebungen. Eine Netzwerk-Zeitüberschreitung beim Abrufen einer entfernten Musterdokument, ein unzulässiger Dateipfad, ein DNS-Auflösungsfehler oder fehlerhafter Musterinhalt wird die Rendering-Pipeline nicht zum Absturz bringen. Das PDF wird dennoch erstellt — es fehlen nur die Silbentrennungen.
Der Kompromiss ist die Sichtbarkeit. Eine fehlerhafte Musterdokument oder eine unerreichbare URL beim ersten Laden beeinträchtigt stillschweigend jeden nachfolgenden Render-Vorgang unter Verwendung derselben Quellwerte (da das Caching auch den Fehlerzustand speichert). Die Empfehlung lautet, Musterdokumente zu validieren und den Netzwerkzugriff auf entfernte URLs während des Anwendungsstarts oder CI/CD-Bereitstellungsprüfungen zu bestätigen — nicht zur Renderzeit.
Wie können Musterdokumente von einer entfernten URL geladen werden?
Das Setzen von PatternSource auf eine entfernte URL ist der schnellste Weg, um benutzerdefinierte Silbentrennung anzuwenden, ohne Dateien in das Projekt einzubinden. Das folgende Beispiel lädt US-amerikanische Englisch-Muster aus dem tex-hyphen-Repository und rendert einen Blocksatz-Textblock:
using IronPdf;
var renderer = new ChromePdfRenderer();
// Load custom patterns from a remote TeX hyphenation repository
renderer.RenderingOptions.CustomHyphenation = new CustomHyphenationDefinitions
{
PatternSource = "https://raw.githubusercontent.com/hyphenation/tex-hyphen/master/hyph-utf8/tex/generic/hyph-utf8/patterns/txt/hyph-en-us.pat.txt",
ExceptionSource = "https://raw.githubusercontent.com/hyphenation/tex-hyphen/master/hyph-utf8/tex/generic/hyph-utf8/patterns/txt/hyph-en-us.hyp.txt"
};
string html = @"
<html>
<head>
<style>
body { font-family: Arial, sans-serif; }
.narrow-column {
width: 150px;
text-align: justify;
hyphens: auto;
-webkit-hyphens: auto;
border: 1px solid #ccc;
padding: 10px;
}
</style>
</head>
<body>
<div class='narrow-column'>
The extraordinarily sophisticated implementation demonstrates
how hyphenation significantly improves the typographical quality
of justified text in constrained column widths.
</div>
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("remote-hyphenation.pdf");
using IronPdf;
var renderer = new ChromePdfRenderer();
// Load custom patterns from a remote TeX hyphenation repository
renderer.RenderingOptions.CustomHyphenation = new CustomHyphenationDefinitions
{
PatternSource = "https://raw.githubusercontent.com/hyphenation/tex-hyphen/master/hyph-utf8/tex/generic/hyph-utf8/patterns/txt/hyph-en-us.pat.txt",
ExceptionSource = "https://raw.githubusercontent.com/hyphenation/tex-hyphen/master/hyph-utf8/tex/generic/hyph-utf8/patterns/txt/hyph-en-us.hyp.txt"
};
string html = @"
<html>
<head>
<style>
body { font-family: Arial, sans-serif; }
.narrow-column {
width: 150px;
text-align: justify;
hyphens: auto;
-webkit-hyphens: auto;
border: 1px solid #ccc;
padding: 10px;
}
</style>
</head>
<body>
<div class='narrow-column'>
The extraordinarily sophisticated implementation demonstrates
how hyphenation significantly improves the typographical quality
of justified text in constrained column widths.
</div>
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("remote-hyphenation.pdf");
Imports IronPdf
Dim renderer As New ChromePdfRenderer()
' Load custom patterns from a remote TeX hyphenation repository
renderer.RenderingOptions.CustomHyphenation = New CustomHyphenationDefinitions With {
.PatternSource = "https://raw.githubusercontent.com/hyphenation/tex-hyphen/master/hyph-utf8/tex/generic/hyph-utf8/patterns/txt/hyph-en-us.pat.txt",
.ExceptionSource = "https://raw.githubusercontent.com/hyphenation/tex-hyphen/master/hyph-utf8/tex/generic/hyph-utf8/patterns/txt/hyph-en-us.hyp.txt"
}
Dim html As String = "
<html>
<head>
<style>
body { font-family: Arial, sans-serif; }
.narrow-column {
width: 150px;
text-align: justify;
hyphens: auto;
-webkit-hyphens: auto;
border: 1px solid #ccc;
padding: 10px;
}
</style>
</head>
<body>
<div class='narrow-column'>
The extraordinarily sophisticated implementation demonstrates
how hyphenation significantly improves the typographical quality
of justified text in constrained column widths.
</div>
</body>
</html>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("remote-hyphenation.pdf")
Ausgabe
Das gerenderte PDF zeigt den Blocksatzabsatz mit sauberen Worttrennungen an Silbengrenzen. Ohne Silbentrennung würde derselbe Text große Wortzwischenräume erzeugen oder die Spalte überlaufen.
Sowohl hyphens: auto als auch -webkit-hyphens: auto CSS-Deklarationen sind für die Kompatibilität mit Chromium erforderlich. Die Regel text-align: justify macht Silbentrennung am sichtbarsten. Wenn keine CSS-Deklarationen auf den Ziel-HTML-Elementen vorhanden sind, werden die benutzerdefinierten Muster geladen, aber nicht angewendet.
Der URL muss auf rohe Textinhalte zeigen. Eine Standard-URL zu GitHub wie https://github.com/hyphenation/tex-hyphen/blob/master/... gibt eine HTML-Seitenumgebung zurück, die die Musterüberprüfung fehlschlagen lässt. Verwenden Sie die Form https://raw.githubusercontent.com/... oder klicken Sie auf die Schaltfläche "Raw" auf GitHub, um die richtige URL zu erhalten.
Was sind die Einschränkungen beim Entfernten Laden?
| Einschränkung | Wert |
|---|---|
| Protokolle | HTTP und HTTPS (HTTPS empfohlen) |
| Erlaubte Inhaltsarten | text/plain, application/octet-stream |
| Maximale Antwortgröße | 5 MB |
| Zeitüberschreitung der Anfrage | 10 Sekunden |
| Sicherheit | Anfragen an private/lokale IPs (10.x.x.x, 192.168.x.x, localhost) werden blockiert um SSRF-Angriffe zu verhindern |
| Abgelehnter Inhalt | Binärdateien, Dateien mit Nullbytes, Dateien mit -Tags |
Container und Cloud-Umgebungen (Docker, Azure, AWS) müssen ausgehenden HTTPS-Zugriff zum Host der Musterdokumente haben, damit das Entfernen-Laden erfolgreich ist.
Wie können Musterdokumente von lokalen Dateien geladen werden?
Für Umgebungen, in denen externer Netzwerkzugang eingeschränkt ist oder in denen Build-Zeit-Bündelung bevorzugt wird, akzeptiert PatternSource auch einen Dateisystempfad:
Die Musterdokumente müssen vor dem Ausführen auf der Festplatte vorhanden sein. Laden Sie hyph-en-us.pat.txt und hyph-en-us.hyp.txt aus dem tex-hyphen-Repository herunter und platzieren Sie sie im von Ihrem Code referenzierten Pfad.
using IronPdf;
var renderer = new ChromePdfRenderer();
// Load English hyphenation patterns from local files
renderer.RenderingOptions.CustomHyphenation = new CustomHyphenationDefinitions
{
PatternSource = @"C:\patterns\hyph-en-us.pat.txt",
ExceptionSource = @"C:\patterns\hyph-en-us.hyp.txt"
};
string html = @"
<html>
<head>
<style>
.invoice-container {
width: 220px;
text-align: justify;
hyphens: auto;
-webkit-hyphens: auto;
font-family: Georgia, serif;
font-size: 11px;
line-height: 1.5;
border: 1px solid #ddd;
padding: 12px;
}
h3 { font-size: 13px; margin-top: 0; }
.terms { color: #555; margin-top: 10px; font-size: 9px; }
</style>
</head>
<body>
<div class='invoice-container'>
<h3>Invoice #20260331</h3>
<p>Neinndiscrimination acknowledgement: The undersigned
representative hereby confirms that all pharmaceutical
reimbursement documentation has been independently
verified and cross-referenced against the applicable
regulatory framework established by the appropriate
governmental oversight authority.</p>
<p class='terms'>Neintwithstanding any indemnification
provisions, the counterparty's disproportionate
liability shall not exceed the predetermined
recharacterization threshold established under the
intergovernmental cooperation agreement.</p>
</div>
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("local-hyphenation.pdf");
using IronPdf;
var renderer = new ChromePdfRenderer();
// Load English hyphenation patterns from local files
renderer.RenderingOptions.CustomHyphenation = new CustomHyphenationDefinitions
{
PatternSource = @"C:\patterns\hyph-en-us.pat.txt",
ExceptionSource = @"C:\patterns\hyph-en-us.hyp.txt"
};
string html = @"
<html>
<head>
<style>
.invoice-container {
width: 220px;
text-align: justify;
hyphens: auto;
-webkit-hyphens: auto;
font-family: Georgia, serif;
font-size: 11px;
line-height: 1.5;
border: 1px solid #ddd;
padding: 12px;
}
h3 { font-size: 13px; margin-top: 0; }
.terms { color: #555; margin-top: 10px; font-size: 9px; }
</style>
</head>
<body>
<div class='invoice-container'>
<h3>Invoice #20260331</h3>
<p>Neinndiscrimination acknowledgement: The undersigned
representative hereby confirms that all pharmaceutical
reimbursement documentation has been independently
verified and cross-referenced against the applicable
regulatory framework established by the appropriate
governmental oversight authority.</p>
<p class='terms'>Neintwithstanding any indemnification
provisions, the counterparty's disproportionate
liability shall not exceed the predetermined
recharacterization threshold established under the
intergovernmental cooperation agreement.</p>
</div>
</body>
</html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("local-hyphenation.pdf");
Imports IronPdf
Dim renderer As New ChromePdfRenderer()
' Load English hyphenation patterns from local files
renderer.RenderingOptions.CustomHyphenation = New CustomHyphenationDefinitions With {
.PatternSource = "C:\patterns\hyph-en-us.pat.txt",
.ExceptionSource = "C:\patterns\hyph-en-us.hyp.txt"
}
Dim html As String = "
<html>
<head>
<style>
.invoice-container {
width: 220px;
text-align: justify;
hyphens: auto;
-webkit-hyphens: auto;
font-family: Georgia, serif;
font-size: 11px;
line-height: 1.5;
border: 1px solid #ddd;
padding: 12px;
}
h3 { font-size: 13px; margin-top: 0; }
.terms { color: #555; margin-top: 10px; font-size: 9px; }
</style>
</head>
<body>
<div class='invoice-container'>
<h3>Invoice #20260331</h3>
<p>Neinndiscrimination acknowledgement: The undersigned
representative hereby confirms that all pharmaceutical
reimbursement documentation has been independently
verified and cross-referenced against the applicable
regulatory framework established by the appropriate
governmental oversight authority.</p>
<p class='terms'>Neintwithstanding any indemnification
provisions, the counterparty's disproportionate
liability shall not exceed the predetermined
recharacterization threshold established under the
intergovernmental cooperation agreement.</p>
</div>
</body>
</html>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("local-hyphenation.pdf")
Ausgabe
Wie unten zu sehen, werden lange Wörter, die sonst überlaufen oder übermäßigen Abstand erzeugen würden, automatisch an Silbengrenzen getrennt. Die Engine trennt nur dort, wo es nötig ist — Wörter, die sauber in eine Zeile passen, bleiben ganz.
Der Wechsel zu einer anderen Sprache erfordert nur eine Änderung der Dateipfade:
// Switch to French hyphenation — just change the file paths
renderer.RenderingOptions.CustomHyphenation = new CustomHyphenationDefinitions
{
PatternSource = @"C:\patterns\hyph-fr.pat.txt",
ExceptionSource = @"C:\patterns\hyph-fr.hyp.txt"
};
// Switch to French hyphenation — just change the file paths
renderer.RenderingOptions.CustomHyphenation = new CustomHyphenationDefinitions
{
PatternSource = @"C:\patterns\hyph-fr.pat.txt",
ExceptionSource = @"C:\patterns\hyph-fr.hyp.txt"
};
' Switch to French hyphenation — just change the file paths
renderer.RenderingOptions.CustomHyphenation = New CustomHyphenationDefinitions With {
.PatternSource = "C:\patterns\hyph-fr.pat.txt",
.ExceptionSource = "C:\patterns\hyph-fr.hyp.txt"
}
Dies macht CustomHyphenation besonders nützlich für Sprachen, die nicht von dem integrierten PdfHyphenationLanguage-Enum abgedeckt sind, das derzeit nur Englisch (US), Englisch (Britisch) und Russisch unterstützt.
Was sind die Einschränkungen für lokale Dateien?
| Einschränkung | Wert |
|---|---|
| Erlaubte Erweiterungen | .txt, .pat |
| Maximale Dateigröße | 5 MB |
| Kodierung | UTF-8 |
| Inhaltsregeln | Nur gültige Silbentrennungsmuster — keine Kommentare, Metadaten, Header, TeX-Direktiven oder Kodierungsnotizen |
| Abgelehnter Inhalt | Binärdateien, Dateien mit Nullbytes, Dateien mit -Tags |
Wie beeinflusst das Caching die Leistung beim Batch-Rendering?
Benutzerdefinierte Silbentrennungsmuster werden nach dem ersten Laden im Speicher zwischengespeichert, basierend auf den PatternSource- und ExceptionSource-Werten. Nachfolgende Renderprozesse, die sich auf dieselben Quellenpfade oder URLs beziehen, verwenden die zwischengespeicherten Muster erneut, ohne die Dateien erneut herunterzuladen oder zu lesen.
Dieses Verhalten hat zwei praktische Auswirkungen auf High-Volume-PDF-Rendering-Workflows:
Leistung: Der erste Renderprozess verursacht die I/O-Kosten (Netzwerkanfrage oder Festplattenlesen). Jeder nachfolgende Renderprozess ist aus einer Musterdokument-Ladeperspektive im Wesentlichen kostenlos. Für Batch-Jobs, die Hunderte von PDFs mit derselben Silbentrennungskonfiguration erzeugen, ist der Aufwand vernachlässigbar.
Stille Fehlerpersistenz: Da Fehler beim Laden von Musterdokumenten keine Ausnahmen werfen und der Renderer ohne Silbentrennung fortfährt, wird eine fehlerhafte Musterdokument oder ein Netzwerkfehler beim ersten Laden stillschweigend über den gesamten Batch bestehen bleiben. Jeder nachfolgende Renderprozess wird ebenfalls keine Silbentrennung aufweisen, ohne zusätzliche Fehlersignale. Validieren Sie Musterdokumente und bestätigen Sie die Zugänglichkeit von URLs während des Anwendungsstarts oder der Bereitstellung, nicht zur Renderzeit.
Cache-Schlüssel-Identität: Der Cache-Schlüssel ist der exakte Zeichenkettenwert von PatternSource (und ExceptionSource, falls gesetzt). Zwei Renderer-Instanzen, die auf dieselbe URL oder denselben Dateipfad zeigen, teilen sich die gleichen zwischengespeicherten Muster. Das Ändern der URL — selbst auf eine andere Version derselben Datei — erzwingt ein erneutes Laden.
Validieren Sie den Dateiinhalte vor der Produktionseinführung. Musterdateien müssen nur gültigen Silbentrennungstext enthalten. Das Vorhandensein von Kommentaren, TeX-Direktiven, Kodierungserklärungen oder jeglichem Nicht-Muster-Inhalt führt zum Versagen der Integration. Das tex-hyphen-Repository bietet vorgefertigte saubere Musterdateien für Dutzende von Sprachen.
HTTPS wird für entfernte Musterquellen empfohlen. HTTP wird unterstützt, bietet jedoch keinen Schutz auf der Transportschicht für den Dateiinhalt.
Was sind die nächsten Schritte?
Die CustomHyphenation-Eigenschaft auf ChromePdfRenderOptions bietet direkte Kontrolle über das Worttrennungsverhalten für jede Sprache, die von einer TeX-Musterdokument unterstützt wird — noch über die drei eingebauten Voreinstellungen hinaus, die durch PdfHyphenationLanguage verfügbar sind. Musterdateien werden von entfernten URLs oder lokalen Pfaden geladen, werden nach der ersten Verwendung im Speicher zwischengespeichert und fallen auf die HyphenationLanguage-Einstellung zurück, wenn das Laden fehlschlägt. Fehler werden protokolliert, aber niemals geworfen, daher sollte die Musterüberprüfung während der Bereitstellung erfolgen und nicht zur Renderzeit.
Für verwandte IronPDF-Rendering-Konfigurationen siehe:
ChromePdfRenderOptionsAPI-Referenz für alle verfügbaren Rendering-OptionenPdfHyphenationLanguageEnum für die integrierten Sprachvoreinstellungen- HTML-zu-PDF-Rendering-Tutorial für die vollständige HTML-Rendering-Pipeline
- Rendering-Optionen-Anleitung für andere ChromePdfRenderOptions-Konfigurationen
- IronPDF-Funktionsübersicht für das vollständige Set an PDF-Erstellungs- und Manipulationsfähigkeiten
Erhalten Sie eine kostenlose 30-Tage-Testversion von IronPDF, um benutzerdefinierte Silbentrennung in einem Live-Projekt zu testen, oder sehen Sie sich Lizenzierungsoptionen für den Produktionseinsatz an.

